如何使用python以tail -f方式读取csv文件?

时间:2018-05-04 16:07:49

标签: python csv

我想以类似于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文件将同时更新,我需要获取新添加的行。

1 个答案:

答案 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']的输出。

在Python中查找正确的文件标签

对于等待新行可用的正确实现的迭代器,请考虑参考有关该主题的现有StackOverflow问题之一: