从python中删除文本文件中的二进制数据

时间:2015-03-19 07:13:28

标签: python python-3.x

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

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

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

myfile.txt的:

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

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

ABCDEFGH
123456
Data Block 11
XYZ123

2 个答案:

答案 0 :(得分:5)

这很难,因为"二进制" blobs 可能包含有效字符或字符序列。如果您使用的文件包含" text"使用多字节编码,忘了它。

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

的内容
encode('ascii', error='ignore')

这有效地从输出中删除了非ascii字符,但是如果你要在你的文件上执行此操作,那么你将获得:

ABCDEFGH
123456
Data Block
?d
XYZ123

注意倒数第二行 - 在blob中找到有效的ascii字符,并将其视为" text"。

您可以从这样的解决方案开始,并对其进行微调(如果可能)以满足您的需求。也许blob会在行上自行出现,这样如果一行有任何非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='')

答案 1 :(得分:-1)

如果您在二进制数据之后也有页脚(就像您有标题一样),尝试使用regexp替换页眉/页脚之间的所有内容?