我有一个生成器,可以一次从 CSV 文件生成一行,如下所示:
import csv
def as_csv(filename):
with open(filename) as fin:
yield from csv.reader(fin)
但是,我还需要捕获从文件返回的原始字符串,因为这需要同时保留。
据我所知,内置的 csv
可以临时使用,如下所示:
import csv
def as_csv_and_raw(filename):
with open(filename) as fin:
for row in fin:
raw = row.strip()
values = csv.reader([raw])[0]
yield (values, raw)
...但这会产生为文件的每一行创建新读取器和新迭代的开销,因此对于具有数百万行的文件,我担心性能影响。
感觉我可以创建一个可以与主函数交互的协程,以一种可以直接控制输入而不丢失输入的方式生成解析的字段,如下所示:
import csv
def as_csv_and_raw(filename):
with open(filename) as fin:
reader = raw_to_csv(some_coroutine())
reader.next()
for row in fin:
raw = row.strip()
fields = reader.send(raw)
yield fields, raw
def raw_to_csv(data):
yield from csv.reader(data)
def some_coroutine():
# what goes here?
raise NotImplementedError
我还没有真正了解协程并使用 yield
作为表达式,所以我不确定 some_coroutine
中会发生什么,但其意图是每次我发送
一个值时,该值都会通过csv.reader
对象运行,然后我会返回一组字段。
有人可以提供 some_coroutine
的实现,或者向我展示一种更好的机制来获取所需的数据吗?
最佳答案
您可以使用itertools.tee
要从可迭代文件对象创建两个独立的迭代器,请从其中一个创建一个 csv.reader
,然后用它压缩另一个迭代器以进行输出:
from itertools import tee
def as_csv_and_raw(filename):
with open(filename) as fin:
row, raw = tee(fin)
yield from zip(csv.reader(row), raw)
关于python - 在 Python 中同时检索 CSV 字段和文件中的原始字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61150164/