【问题标题】:f.readline() doesn't capture the last line of the filef.readline() 不捕获文件的最后一行
【发布时间】:2019-08-16 03:46:22
【问题描述】:

我正在使用 readline() 从一个非常大的文本文件中读取数据。该文件有几百万行的长度。但是,无论我做什么都不会捕获文件的最后一行。

我正在阅读的文件如下所示:

$ tail file.txt
22  rs1193135566    0   50807787    C   G   0   0   0   0   NA  0   0   0   NA  NA  0
22  rs1349597430    0   50807793    T   G   0   0   0   0   0   0   0   NA  NA  NA  NA
22  rs1230501076    0   50807799    T   G   0   0   NA  NA  0   0   0   NA  0   NA  0
22  22_50807803 0   50807803    C   G   0   0   0   0   0   0   0   0   0   NA  0
22  rs1488400844    0   50807810    G   T   0   0   0   NA  0   0   0   0   0   NA  0
22  rs1279244475    0   50807811    G   T   0   0   0   NA  0   0   0   0   0   NA  0
22  rs1346432135    0   50807812    G   A   0   NA  0   0   0   0   0   0   0   NA  0
22  rs1340490361    0   50807813    C   G   0   0   0   NA  0   0   0   0   0   NA  0
22  22_50807816 0   50807816    G   T   0   0   0   NA  0   0   0   0   0   NA  0
22  rs1412997563    0   50807818    G   C   0   0   0   NA  0   0   0   0   0   NA  0

我的代码如下所示:

with open('/path/file.txt', 'r') as f:

  for l in f:
      line = l.rstrip('\n').split("\t")
      print(line)

文件的最后一行是空的[]

输出如下所示:

['22', 'rs1250150067', '0', '50807769', 'G', 'A', 'NA', '0', '0', '0', '0', '0', '0', '0', '0', 'NA', '0']
['22', 'rs1193135566', '0', '50807787', 'C', 'G', '0', '0', '0', '0', 'NA', '0', '0', '0', 'NA', 'NA', '0']
['22', 'rs1230501076', '0', '50807799', 'T', 'G', '0', '0', 'NA', 'NA', '0', '0', '0', 'NA', '0', 'NA', '0']
['22', 'rs1488400844', '0', '50807810', 'G', 'T', '0', '0', '0', 'NA', '0', '0', '0', '0', '0', 'NA', '0']
['22', 'rs1346432135', '0', '50807812', 'G', 'A', '0', 'NA', '0', '0', '0', '0', '0', '0', '0', 'NA', '0']
['22', '22_50807816', '0', '50807816', 'G', 'T', '0', '0', '0', 'NA', '0', '0', '0', '0', '0', 'NA', '0']
['']

【问题讨论】:

  • .readline() 是文件的方法,而不是str。此外,您应该显示文件的内容。最后一行很可能只是一个空行(例如\n\n)。
  • 这段代码只读取文件的first行。
  • @MarcoBonelli 我已经包含了一个输入示例,最后一行不是空的。
  • @jasonharper 我已经编辑了代码 sn-p 以反映我用来读取整个文件的循环。

标签: python python-3.x text


【解决方案1】:

您只读取一行,尝试使用 f.readlines() 代替,它将读取所有行。如果您希望逐行使用,请使用下标。

lines = f.readlines()
print(lines[0]) # to display 1st line
print(lines[1]) # to display 2nd line

等等。您还可以在阅读后循环打印行,例如

lines = f.readlines()
for line in lines:
    print(line)

编辑 1: 它出现在您提供的输出中,就像您的循环没有读取所有行一样,因为输出中只有从 end 开始的第二、第四、第六行可见。

还可以尝试使用 strip() 而不是 rstrip('\n'),因为这会去除字符串两侧的任何空白。

【讨论】:

  • 这会浪费地把整个巨大的文件读入内存,然后再做任何有用的事情。
【解决方案2】:

我认为您正在寻找这样的东西:

    with open('/path/file.txt', 'r') as f:
        for lines in f.readlines():
            line = lines.rstrip('\n').split("\t")
            print(line)

【讨论】:

  • 如果文件很小,但我的文件超过 7000 万行,我会这样做。
【解决方案3】:

你正在丢弃每隔一行。

for line in f 已经将一行读入line。然后您丢弃它并使用line = f.readline() 获取另一行。我的 Python 3.5.1 实际上会发出警告并中止:

ValueError: Mixing iteration and read methods would lose data

您可以一次将所有行读入内存,或一次处理一个。我通常推荐后者,除非您的处理最终需要将所有数据都保存在内存中(即使这样,您也可能需要将其解析为合理的结构,因此将原始数据保存在内存中只是浪费)。

with open('/path/file.txt', 'r') as f:
    for line in f:
        print(line.rstrip('\n').split('\t'))   # or process line

【讨论】:

  • 感谢您的帮助,但尚未解决问题。至少不会出错。
  • 你确定最后没有空行吗? (提示:tail -n 3 file.txt | xxd 或任何可用的十六进制转储实用程序。)最后一行是否有换行符?您的症状与 f.read().split('\n') 一致,但您似乎没有这样做。
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2016-01-10
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
相关资源
最近更新 更多