我想以类似于tail -f
的方式阅读csv文件,例如读取错误日志文件。
我可以使用以下代码在文本文件中执行此操作:
while 1:
where = self.file.tell()
line = self.file.readline()
if not line:
print "No line waiting, waiting for one second"
time.sleep(1)
self.file.seek(where)
if (re.search('[a-zA-Z]', line) == False):
continue
else:
response = self.naturalLanguageProcessing(line)
if(response is not None):
response["id"] = self.id
self.id += 1
response["tweet"] = line
self.saveResults(response)
else:
continue
如何为csv文件执行相同的任务?我已经通过一个链接,可以给我最后8行,但这不是我要求的。 csv文件将同时更新,我需要获取新添加的行。
答案 0 :(得分:1)
csv.reader
为了将查找新附加到文件中的内容的代码插入csv.reader
,您需要将其放入迭代器的形式。
我并不打算展示正确的代码,而是专门展示如何将现有的代码采用到此表单中,而不会对其正确性进行断言。特别是,sleep()
可以更好地替换为inotify等机制,让操作系统在文件发生变化时断言通知您;最好将seek()
和tell()
替换为在内存中存储部分行,而不是一遍又一遍地备份和重新读取它们。
import csv
import time
class FileTailer(object):
def __init__(self, file, delay=0.1):
self.file = file
self.delay = delay
def __iter__(self):
while True:
where = self.file.tell()
line = self.file.readline()
if line and line.endswith('\n'): # only emit full lines
yield line
else: # for a partial line, pause and back up
time.sleep(self.delay) # ...not actually a recommended approach.
self.file.seek(where)
csv_reader = csv.reader(FileTailer(open('myfile.csv')))
for row in csv_reader:
print("Read row: %r" % (row,))
如果您创建一个空的myfile.csv
,从另一个窗口开始python csvtailer.py
,然后echo "first,line" >>myfile.csv
,则会立即显示Read row: ['first', 'line']
的输出。
对于等待新行可用的正确实现的迭代器,请考虑参考有关该主题的现有StackOverflow问题之一: