55

我想打开file.txt并拆分该文件中的所有数据。

这是我的file.txt

some_data1 some_data2 some_data3 some_data4 some_data5

这是我的python代码:

>>>file_txt = open("file.txt", 'r')
>>>data = file_txt.read()
>>>data_list = data.split(' ')
>>>print data
some_data1 some_data2 some_data3 some_data4 some_data5
>>>print data_list
['\xef\xbb\xbfsome_data1', 'some_data1', "some_data1", 'some_data1', 'some_data1\n']

正如您在此处看到的,当我打印 my 时,它会将 this:和 this:data_list添加到我的列表中。这些是什么以及如何从它们中清除我的列表。\xef\xbb\xbf\n

谢谢。

4

3 回答 3

78

您的文件开头包含UTF-8 BOM

要摆脱它,首先将文件内容解码为 un​​icode。

fp = open("file.txt")
data = fp.read().decode("utf-8-sig").encode("utf-8")

但最好不要将其编码回utf-8,而是使用unicoded 文本。有一个很好的规则:尽快将所有输入的文本数据解码为 un​​icode,并且只使用 unicode;并尽可能晚地将输出数据编码为所需的编码。这将使您免于许多头痛。

要以某种编码读取更大的文件,请使用io.opencodecs.open

还要检查这个

使用str.strip()orstr.rstrip()去掉换行符\n

于 2013-09-06T19:00:58.773 回答
13

\xef\xbb\xbf是UTF-8 的字节顺序标记 -是转义\x 序列,指示接下来的两个字符是表示字符代码的十六进制序列。

\n一个换行符。要删除它,您可以使用rstrip().

data.rstrip()
data_list = data.split(' ')

要删除字节顺序标记,您可以使用io.open(假设您使用的是 2.6 或 2.7)以utf-8模式打开文件。请注意,由于它是在 Python 中实现的,因此可能会慢一些 - 如果需要速度或较旧版本的 Python,请查看codecs.open.

尝试这样的事情:

import io

# Make sure we don't lose the list when we close the file
data_list = []

# Use `with` to ensure the file gets cleaned up properly
with io.open('file.txt', 'r', encoding='utf-8') as file:
    data = file.read() # Be careful when using read() with big files
    data.rstrip() # Chomp the newline character
    data_list = data.split(' ')

print data_list
于 2013-09-06T19:01:55.617 回答
10

正如其他人提到的,您正在处理一个开头包含 UTF-8 BOM 的文件。

他们都告诉你如何处理它或直接删除它。

但是,如果您碰巧只需要使用一个静态文件(或其中的一小部分静态文件),您可能希望完全删除 BOM,这样您就不必处理它了。

事实上,大多数文本编辑器都允许您从一种编码转换为另一种编码,有时 UTF-8 和带有 BOM 的 UTF-8 会单独列出。

我想到的第一个(但有很多)是记事本++。只需进入 Encoding > Convert to UTF-8 without BOM,保存文件即可。

于 2015-06-19T08:57:25.757 回答