在Python中同时从文件中检索CSV字段和原始字符串



我有一个生成器,它一次从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中发生了什么,但目的是每次我在中send一个值时,该值都会通过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)

最新更新