使用Python csv模块更新文件

2024-01-11

我正在使用 python 的 csv 模块从外部工具不断更新的 csv 中提取数据。我遇到了一个问题,当我到达文件末尾时,我收到 StopIteration 错误,但是,我希望脚本继续循环,等待外部工具添加更多行。

到目前为止我想出的是:

f = open('file.csv')
csvReader = csv.reader(f, delimiter=',')
while 1:
    try:
        doStuff(csvReader.next())
    except StopIteration:
        depth = f.tell()
        f.close()
        f = open('file.csv')
        f.seek(depth)
        csvReader = csv.reader(f, delimiter=',')

这具有预期的功能,但看起来也很糟糕。捕获 StopIteration 后不可能进行循环,因为一旦抛出 StopIteration,它将在每次后续调用 next() 时抛出 StopIteration。有人对如何实现这一点有任何建议吗?这样我就不必做这种愚蠢的讲述和寻求?或者有一个不同的 python 模块可以轻松支持此功能。


您的问题不在于 CSV 阅读器,而在于文件对象本身。您可能仍然需要在上面的代码片段中进行疯狂的旋转,但最好创建一个文件对象包装器或子类来为您完成此操作,并将其与 CSV 阅读器一起使用。这使得复杂性与 csv 处理代码隔离开来。

例如(警告:未经测试的代码):

class ReopeningFile(object):
    def __init__(self, filename):
        self.filename = filename
        self.f = open(self.filename)

    def next(self):
        try:
            self.f.next()
        except StopIteration:
            depth = self.f.tell()
            self.f.close()
            self.f = open(self.filename)
            self.f.seek(depth)
            # May need to sleep here to allow more data to come in
            # Also may need a way to signal a real StopIteration
            self.next()

    def __iter__(self):
        return self

然后您的主代码变得更简单,因为它不必管理文件重新打开(请注意,您也不必在文件重新启动时重新启动 csv_reader:

import csv
csv_reader = csv.reader(ReopeningFile('data.csv'))
for each in csv_reader:
    process_csv_line(each)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Python csv模块更新文件 的相关文章

随机推荐