Python 使用yield进行文件处理?
我想知道在文件处理中使用yield是否是一种好的做法 所以现在我使用一个函数f() 它在文件对象列表上迭代并生成文件对象Python 使用yield进行文件处理?,python,python-3.x,Python,Python 3.x,我想知道在文件处理中使用yield是否是一种好的做法 所以现在我使用一个函数f() 它在文件对象列表上迭代并生成文件对象 文件=[] 对于glob.glob(os.path.join(path,*.ext'))中的myfile: f=打开(我的文件'r') 文件。追加(f) def(): 对于文件中的f_obj: 产量f_obj f_obj.close() 对于f()中的f_obj: //对文件进行一些处理。 这是Python中处理文件的正确方法吗?如果您正在读取文本文件(例如CSV),那么
文件=[]
对于glob.glob(os.path.join(path,*.ext'))中的myfile:
f=打开(我的文件'r')
文件。追加(f)
def():
对于文件中的f_obj:
产量f_obj
f_obj.close()
对于f()中的f_obj:
//对文件进行一些处理。
这是Python中处理文件的正确方法吗?如果您正在读取文本文件(例如CSV),那么将源代码作为生成器是非常合适的。代码的一个问题是
f_obj
非常通用,因此使用f()
我举了一个简单的例子,yield
就是读取CSV文件-lines()
将文件名转换为一系列单独的行。类似的事情(目的是在内存中保留更少的数据)
以一种通用的方式,您最初介绍了的用法yield
,我认为它缺乏意图,并使代码读者混淆了为什么要这样做,但这是主观的。什么是文件
?这是字符串列表(文件路径)还是它们已经打开了文件对象?它们可能是打开的文件对象的副本,我想知道这样使用yield是否安全,因为函数f被挂起并返回到下一行。这太模糊了。我更担心的是从哪里获得文件,以及如何管理资源(以及为什么一开始就有很多打开的句柄)。我已经把它添加到代码中了。二进制文件呢?为什么不合适?为什么不合适?我的观点是,对于二进制文件,您将使用“rb”打开它,并以不同的方式处理项目分隔符。我没有从二进制文件中提取序列的immidate示例,可以将其包装到生成器中,但这肯定是一种情况。
import csv
def lines(path):
with open(path, 'r', newline='') as f:
for line in csv.reader(f):
yield line
from pathlib import Path
Path("file.txt").write_text("a,1,2\nb,20,40")
gen = lines("file.txt")
print(next(gen))
print(next(gen))