我正在使用 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(使用前将#替换为@)