为什么我的Python代码从文本文件中读取时会打印出额外的字符""?

59
try:
    data=open('info.txt')
    for each_line in data:
        try:
            (role,line_spoken)=each_line.split(':',1)
            print(role,end='')
            print(' said: ',end='')
            print(line_spoken,end='')
        except ValueError:
            print(each_line)
    data.close()
except IOError:
     print("File is missing")

逐行打印文件时,代码往往会在前面添加三个不必要的字符,即“”。

实际输出:

Man said:  Is this the right room for an argument?
Other Man said:  I've told you once.
Man said:  No you haven't!
Other Man said:  Yes I have.

预期输出:

Man said:  Is this the right room for an argument?
Other Man said:  I've told you once.
Man said:  No you haven't!
Other Man said:  Yes I have.

5
你的文件很可能是以带有BOM的UTF-8编码方式进行编码的。如果这不是你想要的,就使用无BOM的编码方式来进行编码。 - Vincent Savard
1
可能是重复的问题:如何从文件开头删除? - Marc B
8
不是重复的问题;Python不是PHP,而且有更好的处理UTF-8 BOM的选项。楼主,可以在open()函数中传入encoding='utf-8-sig'来解决这个问题。 - senshin
是的,文森特是正确的。这是字节顺序标记的典型表现。 - Boldewyn
@senshin,它起作用了,谢谢。'code' data= open('sketch.txt', encoding='utf-8-sig') - user5234170
显示剩余2条评论
3个回答

107

不要使用默认编码(即'utf-8')打开文件,而是使用'utf-8-sig',它会预期并去除UTF-8字节顺序标记,这就是显示为的内容。

也就是说,不要使用

data = open('info.txt')


data = open('info.txt', encoding='utf-8-sig')

请注意,如果您使用的是Python 2版本,您应该看到例如Python, 将输出编码为UTF-8在Python中将带有BOM的UTF-8转换为无BOM的UTF-8。您需要使用codecsstr.decode进行一些花招才能在Python 2中正确运行。但在Python 3中,您只需要在打开文件时设置encoding=参数即可。

即使我使用了这种编码,某些行前面仍然会出现 \ufeff,你有什么想法吗? - Amrit
@Amrit BOM(字节顺序标记)应该只出现在文本流的开头。所以,如果你在中间看到它,那么它可能是遗留Unicode文本中的零宽不换行空格。我相信它在印度文字(如梵文)中被使用过。或者你有一个由多个“utf-8-sig”文件拼接而成的文件。 - wjandrea

4

我在处理Excel的CSV文件时也遇到了类似的问题。最初,我从下拉选项中将我的文件保存为.csv utf-8(逗号分隔)文件。然后我将其保存为仅为.csv(逗号分隔)文件,一切正常。也许.txt文件也会有类似的问题。


0
当我遇到这种情况时,它只会发生在我的 CSV 文件的第一行,包括读取和写入。基于我所做的事情,我只是在第一个位置上放置了一个“牺牲性”的条目,这样那些字符就会被添加到我的牺牲性条目中,而不是我关心的任何字符中。绝对不是一个强大的解决方案,但对我的目的来说快速有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接