为啥我的 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。您需要使用codecsstr.decode 进行一些恶作剧才能使其在Python 2 中正常工作。但在Python 3 中,您需要做的就是在打开文件时设置encoding= 参数。

【讨论】:

即使在使用这种编码之后,我仍然在某行前面得到 \ufeff,知道为什么吗?【参考方案2】:

在处理 excel csv 文件时,我遇到了一个非常相似的问题。最初,我将下拉选项中的文件保存为 .csv utf-8(逗号分隔)文件。然后我将它保存为一个 .csv(逗号分隔)文件,一切都很好。 .txt 文件可能存在类似问题

【讨论】:

【参考方案3】:

当我发生这种情况时,它只发生在我的 CSV 的第一行,无论是读取还是写入。对于我正在做的事情,我只是在第一个位置做了一个“牺牲”条目,这样那些角色就会被添加到我的牺牲条目中,而不是我关心的任何一个。 Definitley 不是一个强大的解决方案,但速度很快,并且适合我的目的。

【讨论】:

以上是关于为啥我的 Python 代码在从文本文件中读取时会打印额外的字符“”?的主要内容,如果未能解决你的问题,请参考以下文章

Spark,Scala在从文件读取后无法正确创建视图

在从文件读取的字母数字数组中查找数字元素并将它们写入新文件

为啥我的 App.js 代码在保存时会自行更改?

为啥即使在关闭临时文件后我也能够写入和读取它?

为啥我的 .NET 应用程序从网络驱动器运行时会崩溃?

为啥 InputStreamReader 从 jar 读取时会抛出 NPE?