【问题标题】:python readlines() does not contain whole filepython readlines() 不包含整个文件
【发布时间】:2014-07-15 07:17:25
【问题描述】:

我有一个来自测量的自动生成的信息文件。它由二进制和人类可读的部分组成。我想提取一些非二进制元数据。对于某些文件,我无法访问元数据,因为 readlines() 不会产生整个文件。我猜该文件包含一些 EOF 字符。我可以毫无问题地在记事本++中打开文件。

此问题的一个可能解决方案是读取文件二进制文件并在之后将其解析为 char,同时删除 EOF char。无论如何,我想知道是否有更优雅的方式来做到这一点?

编辑: 这个问题被正确地否决了,我应该提供代码。我实际上使用

f = open(fname, 'r')
raw = f.readlines()

然后继续浏览列表。现有的 EOF 字符(取决于操作系统)似乎造成了我正在观察的破坏。我将接受使用二进制 'rb' 标志声明的答案。顺便说一句,这是一个令人印象深刻的响应时间! (-:

【问题讨论】:

  • 你能告诉我们你的代码吗?您是否以任何其他方式访问过该文件?文件对象是如何打开的?
  • 为什么要混合二进制和人类可读的部分?你是用二进制还是“r”格式打开文件?
  • 没有什么像 EOF 字符。
  • @Messa 有一个 EOF 标记 \x1A 如果我没记错的话...这就是为什么在使用可能出现所述字符的文件时,最好强制二进制,以免它们被解释为这样(尤其是在 Windows 上)
  • @JonClements 这只是一个和其他 255 个角色一样的角色。 gist.github.com/messa/90c7c24120693dee2af7

标签: python python-2.7 readlines


【解决方案1】:
with open(afile,"rb") as f: print f.readlines()

这样做有什么问题?

如果您不以二进制模式打开文件,一些非 ASCII 字符会被错误地解释和/或丢弃......如果它与二进制数据混合在一起,可能会无意中删除一些 ASCII

【讨论】:

  • 如果您不以二进制模式打开文件,所有非 ASCII 字符都将被丢弃... - errr - 否...如果不是以二进制模式打开,一些字符仍然具有诸如“这是文件的结尾”之类的含义
  • 我刚刚尝试了这段代码,像这样设置二进制标志实际上对我有用。然后我可以在列表中查找我正在搜索的关键字!不需要struct
  • 是的,你的权利@jonclements ...仍然不知道为什么我对此投了反对票...很难在我的手机上回答这样的问题
  • @Joran 也不知道 - 绝对不是我的伙伴
  • 是的,我以为不是你……只是不确定是谁或更重要的是为什么
【解决方案2】:

您可以使用文件对象的read() 函数。它读取整个文件。

with open('input.bin', 'r') as f:
    content = f.read()

然后就可以解析内容了。 如果你知道你需要的部分从哪里开始,你可以寻找它(例如,如果文件有一个固定长度的二进制开始):

with open('input.bin', 'r') as f:
    f.seek(CONTENT_START)
    content = f.read()

在 Windows 上,您应该将读取模式更改为“rb”,表示您要以二进制模式读取文件;只有这样,文本部分中的行尾才可能包含“\r\n”,具体取决于您最初创建文件的方式。

【讨论】:

  • 我想到了,但遗憾的是,所有文件的二进制文件大小都不相同。
  • @Faultier:您可以在没有 f.seek(...) 部分的情况下使用此解决方案。这种方法不会有你提到的问题, f.read() 读取整个文件。在 Windows 上,可能值得将读取模式更改为 'rb' 以指示您希望以二进制模式读取文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2012-01-25
  • 2019-06-07
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多