使用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)得到更新,但不知道如何做到这一点。使用python读取CSV文件

+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循环的每次迭代,你试图接近文件的结尾,只是远不够,你肯定知道的最后一个位置线将被包含在剩下的内容中。然后你阅读所有剩余的行(这可能包括第二行或第三行到最后一行的部分数量),并检查这些行的最后一行是否与以前不同。

您可以通过简单的方式读取程序中的行。不要试图使用seek以获取所需内容,请尝试在文件对象mycsv上使用readlines

你可以做到以下几点:

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

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

您的解决方案是可以的,但我有大约1000行,每次运行代码时,python都会从第一行开始读取数据。我需要python从最后开始。线 – manev