【问题标题】:Python file reading after file is all read文件全部读取后的Python文件读取
【发布时间】:2014-04-18 14:26:28
【问题描述】:

使用python 2-7:

msg = self.infile.read(1500)

我正在从文件中读取 1500Bytes 的片段在一个可能无限的 while 循环中, 当文件全部完成并且我已经阅读了所有内容时会发生什么?我会从头开始阅读吗? (我不想那样)

有没有一种简单的方法来计算我总共读取了多少个 1500B 字符串(或者最后一个字符串更少)而不保存它们?

【问题讨论】:

  • 您抓取 1500 字节块而不只是每行处理是否有特定原因?
  • 为什么不在一个小文件上试一试,看看你在结束时会得到什么?会比输入问题更快。
  • drahkar 是的,我正在通过网络发送帧,这是我分配的有效负载大小,cmd 我让其他像我这样的 python 新手也可以从这些问题中受益
  • 您需要使用@Drahkar(带有“@”)来通​​知您要回复的人。
  • @TomFenech 我尝试时没有发表评论...

标签: python python-2.7 input


【解决方案1】:

你可以拿着柜台:

ct = 0
while 1:
    msg = self.infile.read(1500)
    if len(msg) == 0:
        break
    else:
        ct += 1

循环结束后,ct 变量将保存您的块数。

【讨论】:

  • else 是多余的
  • 我刚刚意识到,您实际上是在回答他的部分问题,而大多数人都在关注。
  • @Drahkar 我并不是说ct += 1 也是多余的,我只是说不需要else 分支。我认为使用not msg 而不是len(msg) == 0 更好(style guide 也是如此)
  • if len(msg) == 1500: ct += 1; else: break; 在最后一个块不是 0 时更好
【解决方案2】:

更新

虽然我将在此处添加以下注释,但此处的其他答案更能满足您的要求。

特别添加一个

if not msg:
  break

当你到达 EOF 时,进入循环将负责停止无限循环。


由于您没有详细说明为什么要抓取 1500 字节的块,我将建议每行解决方案的替代方案。假设 self.infile 是一个文件描述符。

msg = [ line for line in self.infile ]

这将为您提供一个列表,其中文件中的每一行位于一个单独的元素中,索引“0”是第一个,索引“n”(即列表中的最后一个元素)是最后一个。

【讨论】:

    【解决方案3】:

    您可以像这样使用iter 阅读chunk

    >>> with open('infile') as infile:
    ...     for chunk in iter(lambda:infile.read(1500), ''):
    ...         if len(chunk) == 1500: # skip if size of chunk is less than 1500
    ...             print chunk # you can deal with `chunk` and count it here
    

    或者你只是想知道count

    >>> os.stat('infile').st_size/1500
    

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多