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

标签 python generator

我有一个生成器,可以一次从 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/

相关文章:

python - 谁能帮我找出我写的素数生成器函数中的错误

ruby-on-rails - 禁用 Rails 中的单元测试生成器

python - 如何生成包含特定条目的 Kaggle 提交 CSV 文件?

python - 在每个组上方添加每个组的名称

javascript - 迭代生成器的更简单方法?

Python 随机生成器

rust - 生成器似乎没有公开 `resume()` 方法

python - 有没有任何 python 程序可以替换两个列表中的两个字符串

Python 和 Smalltalk - 元编程能力比较

python - 使用 matplotlib 在伪彩色图中设置任意颜色