【问题标题】:strip out binary data from text file in python从python中的文本文件中去除二进制数据
【发布时间】:2015-03-19 07:13:28
【问题描述】:

我有一个包含一些二进制数据的文本文件。当我使用 Python 3 在文本模式下读取文件时,我得到一个带有以下代码行的 UniCodeDecodeError(编解码器无法解码字节...):

fo = open('myfile.txt, 'r')
for line in inFile:

如何从我的文件中删除二进制数据。我有一个在每个二进制数据之前打印的标题(在这种情况下,它显示为数据块)。例如,我的文件看起来像这样,我想删除 çºí?¼Èדñdí:

我的文件.txt:

ABCDEFGH
123456
Data Block 11
çºí?¼Èדñdí
XYZ123

我想要的结果是 myfile.txt 看起来像这样:

ABCDEFGH
123456
Data Block 11
XYZ123

【问题讨论】:

  • 所有文本都是二进制的,真的。将任意随机二进制 blob 与文本混合在一起真的很奇怪。也许您只是想以错误的编码读取文件?也许那些部分是“外国”词?
  • 是的,我同意这很奇怪,但这些文件实际上包含随机二进制 blob。
  • 你使用的是 Python 2 还是 Python 3?

标签: python python-3.x


【解决方案1】:

这很困难,因为“二进制”blob可能包含有效字符或字符序列。如果您使用的文件包含使用多字节编码的“文本”,那就别管它了。

如果您知道文件中的“文本”仅包含单字节字符,一种方法是以字节为单位读取文件,然后使用类似

encode('ascii', error='ignore')

这有效地从输出中去除非 ascii 字符,但如果您要对文件执行此操作,您会得到:

ABCDEFGH 123456 数据块 ?d XYZ123

注意倒数第二行——在 blob 中找到了有效的 ascii 字符并将其视为“文本”。

您可以从这样的解决方案开始,然后对其进行微调(如果可能)以满足您的需求。可能 blob 在行上单独出现,因此如果一行有 any 非 ascii 字符,则完全丢弃整行。也许您可以查看 blob 并尝试了解它的某些结构。也许你只是满足于在那里有随机的部分字符行,然后以某种方式处理它们。那时它是特定于应用程序的。

这是我用来从您的示例输入生成输出的代码:

def strip_nonascii(b):
    return b.decode('ascii', errors='ignore')

with open('garbled.txt', 'rb') as f:
    for line in f:
        print(strip_nonascii(line), end='')

【讨论】:

  • 如果数据块要指定二进制数据的大小(当我编辑我的原始帖子以显示 11 表示 11 字节的二进制数据)会有助于将其剥离吗?
  • 会的。如果有一种简单的方法可以到达 blob 的开头(也许它在数据块之后开始,以换行符结束),那么f.seek(<blob size in bytes>, 1) 将“跳过”你的读取指针,指向后面的第一个非 blob 字节斑点。
【解决方案2】:

如果您在二进制数据之后也有页脚(就像您有页眉一样),请尝试用正则表达式替换页眉/页脚之间的所有内容?

【讨论】:

  • 每个人都没有页脚。尽管标题确实告诉我要遵循多少字节的二进制数据。我不确定如何使用正则表达式,因为我没有错误地读取文件的唯一方法是我以二进制模式读取它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2020-06-21
  • 2015-12-31
  • 1970-01-01
  • 2011-10-01
  • 2017-11-03
相关资源
最近更新 更多