我使用以下方法解析大型数据文件:
reader = csv.DictReader(open('Sourcefile.txt','rt'), delimiter = '\t')
for row in reader:
etc
etc
解析效果很好但是我正在对数据进行计算,这要求我直接访问我之前的行,前一行,或者跳过10行。
我无法弄清楚如何获取我所在文件的实际行号,以及如何移动到文件中的其他行(例如:" Current_Line" + 10)并开始从文件中的那一点开始访问数据。
解决方案是将整个文件读入数组,而不是尝试在文件中来回移动吗?我希望这个文件超过160MB,并假设在文件中来回移动将是最有效的内存。
答案 0 :(得分:4)
使用 csvreader.next()转到下一行。要获得10行前进,请将其调用10次或使用范围内循环。
使用 csvreader.line_num 获取当前行号。 感谢" Steven Rumbalski"指出,如果您的数据不包含换行符(0x0A),您只能信任。
要获取当前行之前的行,请简单地缓存变量中的最后一行。
此处提供更多信息:https://docs.python.org/2/library/csv.html
一个小例子: import csv
reader = csv.DictReader(open('Sourcefile.txt','rt'), delimiter = '\t')
last_line = None
for row in reader:
print("Current row: %s (line %d)" % (row, reader.line_num));
# do Sth with the row
last_line = row
if reader.line_num % 10 == 0:
print("Modulo 10! Skipping 5 lines");
try:
for i in range(5):
last_line = reader.next()
except: # File is finished
break
这完全相同,但在我看来它是更好的代码: import csv
reader = csv.DictReader(open('Sourcefile.txt','rt'), delimiter = '\t')
last_line = None
skip = 0
for row in reader:
if skip > 0:
skip -= 1
continue;
print("Current row: %s (line %d)" % (row, reader.line_num));
# do Sth with the row
last_line = row
if reader.line_num % 10 == 0:
print("Modulo 10! Skipping 5 lines");
skip += 5
print("File is done!")
答案 1 :(得分:-1)
为了获得最大的灵活性(和内存使用),您可以将整个csv实例复制到一个数组中。有效地缓存整个表格。
import csv
reader = csv.DictReader(open('Sourcefile.txt','rt'), delimiter = '|')
fn = reader.fieldnames
t = []
for k in reader.__iter__():
t.append(k)
print(fn)
print(t[0])
# you can now access a row (as a dictionary) in the list t[0] is the second row in the file and fn is the first
# Fn is a list of keys that can be applied to each row t
# t[0][fn[0]] gives the row name of the first row
# fn is a list so the order of the columns is preserved.
# Each element in t is a dictionary, so to preserve the columns we use fn