为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?
Posted
技术标签:
【中文标题】为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?【英文标题】:Why does my Python code print the extra characters "" when reading from a text file?为什么我的 Python 代码在从文本文件中读取时会打印额外的字符“”? 【发布时间】:2016-03-27 17:36:25 【问题描述】: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.
【问题讨论】:
您的文件可能以 UTF-8 和 BOM 编码。如果这不是您想要的,请在没有 BOM 的情况下对其进行编码。 How do I remove  from the beginning of a file?的可能重复 @MarcB 不是骗人的; Python 不是 php,在处理 UTF-8 BOM 方面有更好的选择。 OP,将encoding='utf-8-sig'
传递给您的open()
呼叫。
是的,文森特是对的。这是Byte-order mark 的典型情况。
@senshin 成功了,谢谢。 'code' data=open('sketch.txt',encoding='utf-8-sig')
【参考方案1】:
我找不到 Python 3 的副本,它处理与 Python 2 不同的编码。所以答案是:不要使用默认编码('utf-8'
)打开文件,而是使用'utf-8-sig'
,它期望并去除UTF-8 Byte Order Mark,即显示为
。
也就是说,而不是
data = open('info.txt')
做
data = open('info.txt', encoding='utf-8-sig')
请注意,如果您使用的是 Python 2,您应该会看到例如Python, Encoding output to UTF-8 和 Convert UTF-8 with BOM to UTF-8 with no BOM in Python。您需要使用codecs
或str.decode
进行一些恶作剧才能使其在Python 2 中正常工作。但在Python 3 中,您需要做的就是在打开文件时设置encoding=
参数。
【讨论】:
即使在使用这种编码之后,我仍然在某行前面得到 \ufeff,知道为什么吗?【参考方案2】:在处理 excel csv 文件时,我遇到了一个非常相似的问题。最初,我将下拉选项中的文件保存为 .csv utf-8(逗号分隔)文件。然后我将它保存为一个 .csv(逗号分隔)文件,一切都很好。 .txt 文件可能存在类似问题
【讨论】:
【参考方案3】:当我发生这种情况时,它只发生在我的 CSV 的第一行,无论是读取还是写入。对于我正在做的事情,我只是在第一个位置做了一个“牺牲”条目,这样那些角色就会被添加到我的牺牲条目中,而不是我关心的任何一个。 Definitley 不是一个强大的解决方案,但速度很快,并且适合我的目的。
【讨论】:
以上是关于为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?的主要内容,如果未能解决你的问题,请参考以下文章