Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用yield进行文件处理?_Python_Python 3.x - Fatal编程技术网

Python 使用yield进行文件处理?

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),那么

我想知道在文件处理中使用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),那么将源代码作为生成器是非常合适的。代码的一个问题是
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))