用python读取CSV文件

时间:2016-11-16 15:13:01

标签: python csv

filename = 'NTS.csv'
mycsv = open(filename, 'r')
mycsv.seek(0, os.SEEK_END)

while 1:
   time.sleep(1)
   where = mycsv.tell()
   line = mycsv.readline()

if not line:
    mycsv.seek(where)
else:
    arr_line = line.split(',')
    var3 = arr_line[3]

    print (var3)

我有这个Paython代码,每次在外部程序的csv中打印一个新行时,它会读取csv文件中的值。我的问题是csv文件定期完全重写,然后python停止读取新行。我的猜测是python卡在某个行号上,新的更新可能会放50行或更少的行。所以例如python现在在第70行等待一个新行,新行已经在第95行。我认为解决方案是让mycsv.seek(0,os.SEEK_END)更新但不知道如何做到这一点。

2 个答案:

答案 0 :(得分:0)

您可以在程序中更简单地阅读线条。您可以尝试在文件对象seek上使用readlines,而不是尝试使用mycsv来获取所需内容。

您可以执行以下操作:

mycsv = open('NTS.csv', 'r')
csv_lines = mycsv.readlines()

for line in csv_lines:
    arr_line = line.split(',')
    var3 = arr_line[3]
    print(var3)

答案 1 :(得分:0)

如果不每次都重绕文件以确保您真正站在最后一行,您想要做的事情很难完成。如果您知道每行大约有多少个字符,那么您可以使用mycsv.seek(-end_buf,os.SEEK_END)创建一个快捷方式,如this answer中所述。所以你的代码可以这样工作:

avg_len = 50  # use an appropriate number here
end_buf = 3 * avg_len / 2

filename = 'NTS.csv'
mycsv = open(filename, 'r')
mycsv.seek(-end_buf, os.SEEK_END)
last = mycsv.readlines()[-1]

while 1:

    time.sleep(1)
    mycsv.seek(-end_buf, os.SEEK_END)
    line = mycsv.readlines()[-1]

    if not line == last:

        arr_line = line.split(',')
        var3 = arr_line[3]

        print (var3)

在这里,在while循环的每次迭代中,你寻找一个接近文件末尾的位置,远远足够远,你知道最后一行将包含在剩下的内容中。然后你读入所有剩余的行(这可能包括第二行或第三行到第三行的部分数量)并检查这些行的最后一行是否与之前的行不同。