Python - 如何在文件中找到行位置并在该行周围移动?

时间:2016-01-26 17:23:55

标签: python

我使用以下方法解析大型数据文件:

reader = csv.DictReader(open('Sourcefile.txt','rt'), delimiter = '\t')
for row in reader:
  etc
  etc

解析效果很好但是我正在对数据进行计算,这要求我直接访问我之前的行,前一行,或者跳过10行。

我无法弄清楚如何获取我所在文件的实际行号,以及如何移动到文件中的其他行(例如:" Current_Line" + 10)并开始从文件中的那一点开始访问数据。

解决方案是将整个文件读入数组,而不是尝试在文件中来回移动吗?我希望这个文件超过160MB,并假设在文件中来回移动将是最有效的内存。

2 个答案:

答案 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