【问题标题】:python read file with block, but end with newline(\n)python读取带有块的文件,但以换行符结尾(\ n)
【发布时间】:2012-02-09 02:00:19
【问题描述】:

test.txt 是一个“\n”分割文本文件:

f = open('test.txt','r') f.read(256)

但是在读取 256 时,最后的记录可能不是全行。

如何阅读如:

我设置为 256 但是当 248 是 "\n" 和 256 条最后的记录没有完整的行 只需读取 248,f.tell() 给出 248 的位置。

谢谢。

【问题讨论】:

  • 流应该如何知道它尚未读取的数据中是否有换行符?如果你的文件被分成几行,而且这些行很重要,你为什么要以固定大小的块来阅读它?
  • 您可能来自另一种语言,您在低级别访问文件并需要解决此类问题(可能是 C?)。在 Python 中,按行拆分文件是正常的,并且有很多好的方法可以做到这一点(下面的答案中的示例)。除非您正在滚动自己的二进制格式,否则您可能不需要使用 read()

标签: python file newline


【解决方案1】:

如果您使用换行符来拆分数据,为什么不以同样的方式读取呢?

with open('test.txt', 'r') as f:
    lines = f.readlines()
# Now each line in lines is a complete line.

【讨论】:

    【解决方案2】:

    您要做的是阅读完整的行。对于这个任务,你通常会做一些这样的效果。

    size_so_far = 0
    contents = []
    
    for line in open('test.txt'):
          size_so_far += len(line)
          if size_so_far > 256:
             break
          contents.append(line)
    
    contents = "".join(contents)
    

    【讨论】:

      【解决方案3】:

      读取由'\n''\r''\r\n' 中的任何一个分隔的文件的最简单方法是:

      with open('yourfile.txt', 'rU') as f:
          for line in f:
              do_something_with(f)
              # optional, if you want to bale out after 256 bytes:
              if f.tell() >= 256: break
      

      它所做的是读取大块,找到行尾,并一次产生一行。底层代码是用 C 编写的。我还没有看到任何证据表明用 Python 代码做同样的事情会更快。

      【讨论】:

      • 这会超过256,所以相当于f.read(255)+f.readline()
      【解决方案4】:

      你关心效率吗?

      这是一种方法:

      data=f.read(256)
      data=data.splitlines(True)
      if data[-1]!=data[-1].splitlines()[-1]:
          #must be newline at end of last line
          data="".join(data)
      else:
          data="".join(data[:-1])
      
      print data
      

      【讨论】:

      • 是的,我可能会读取大文件,并对读取的内容做其他事情,如果我逐行读取,如果我逐行读取,它会很慢,谢谢。
      • 不用担心。我现在稍微修改了一下以使用更少的内存。
      • -1 (1) 读取整个文件的循环在哪里(或者至少要读取直到有足够的整行)? (2) data1 未定义 (3) data[-1] != data[-1].splitlines()[-1] 是快速文件阅读器的一部分??
      • 抱歉,它应该是“data”而不是“data1”。看看基准分数会很有趣,最初我不知道他追求的是纯粹的表现,实际上我认为他最多只能阅读 256,所以我选择了一些表现出对分割线很好使用的东西。
      • btw john,我认为 -1 并不完全公平 :(,他的问题不一定要求任何其他要求。
      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2014-04-20
      • 2016-05-03
      • 1970-01-01
      • 2017-10-02
      • 2020-11-17
      相关资源
      最近更新 更多