2015-03-19 183 views
1

我有一个包含一些二进制数据的文本文件。当我看到文件,使用Python 3,在文本模式下,我得到一个的UnicodeDecodeError(编解码器不能解码字节...)与下面的代码行:从python中的文本文件中去掉二进制数据

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

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

的myfile.txt:

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

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

ABCDEFGH 
123456 
Data Block 11 
XYZ123 
+0

所有文字是二进制的,真的。将文本中混入任意随机二进制斑点会非常奇怪。也许你只是想以错误的编码读取文件?也许这些部分是“外国”的话? – deceze 2015-03-19 07:15:23

+0

是的我同意它很奇怪,但这些文件实际上包含随机二进制斑点。 – SSS 2015-03-19 07:17:15

+0

你在使用Python 2或3吗? – jedwards 2015-03-19 07:37:28

回答

4

这很难,因为“二进制”blob 可能包含有效的字符或字符序列。如果您使用的是使用多字节编码的“文本”文件,请将其忽略。

如果您知道在你的文件中的“文本”仅包含单字节字符,一个办法是读取文件中的字节,然后使用类似

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

这有效地剥离非-ascii字符出输出的,但如果你这样做对你的文件,你会得到:

 
ABCDEFGH 
123456 
Data Block 
?d 
XYZ123 

注意倒数第二行 - 在团块被发现和治疗的有效ASCII字符“文本”。

您可以从这样的解决方案开始,并对其进行微调(如果可能)以满足您的需求。也许斑点在线上自行发生,因此如果一行有非ASCII字符,则完全抛弃整行。也许你可以看看斑点,并尝试挖掘它的一些结构。也许你只是满足于在那里有部分字符的随机线,并稍后处理它们。在这一点上它是一种特定应用程序。

这是我用来从你的样品输入,可输出代码:

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='') 
+0

如果数据块要指定二进制数据的大小(因为我编辑我的原始帖子以显示11个二进制数据的11个字节)是否有助于将其去掉? – SSS 2015-03-19 07:59:49

+0

它会的。如果有一种简单的方法可以到达blob的开头(也许它在数据块之后开始,并以换行符结束),那么'f。seek(<以字节为单位的blob大小>,1)''会在您的读取指针指向blob之后的第一个非blob字节。 – jedwards 2015-03-19 08:07:02

-1

如果你也有二进制数据后尾(像你这样有头),试图取代什么也没有用正则表达式页眉/页脚之间的一切吗?

+0

每个人都没有脚注。虽然标题确实告诉我要跟随多少个二进制数据字节。我不知道如何使用正则表达式,因为如果我以二进制模式读取文件,读取文件没有错误的唯一方法。 – SSS 2015-03-19 07:31:54