使用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文件
你想要做什么是很难完成的,而不每确保你是真正的最后一行倒放的文件。如果您知道每行大约有多少个字符,那么您可以使用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)
您的解决方案是可以的,但我有大约1000行,每次运行代码时,python都会从第一行开始读取数据。我需要python从最后开始。线 – manev
这取决于文件如何被重写。如果文件被有效地重写*就地*,我无法重现...除了指针位于文件中的给定位置时,只有当文件至少具有该长度时才会再次读取。但要小心:文件中的指针没有行计数的概念,只有字节计数... –