【问题标题】:Split function add: \xef\xbb\xbf...\n to my list拆分功能添加:\xef\xbb\xbf...\n 到我的列表
【发布时间】:2013-09-10 23:07:19
【问题描述】:

我想打开我的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']

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

谢谢。

【问题讨论】:

  • 如果您不向 str.split 提供参数,它将拆分为各种空格(以任何组合形式),并且作为副作用,请在单曲末尾去掉换行符行文件。

标签: python split


【解决方案1】:

您的文件开头包含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.open 或codecs.open。

同时检查this。

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

【讨论】:

【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    \xef\xbb\xbf 是 UTF-8 的 Byte Order Mark - 表示接下来两个字符的 \x is an escape sequence 是表示字符代码的十六进制序列。

    \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
    

    【讨论】:

    • 我必须使用 encoding='utf-8-sig' 才能让它工作
    猜你喜欢
    • 2016-03-22
    • 2013-01-06
    • 1970-01-01
    • 2019-03-24
    • 2018-10-12
    • 2012-06-24
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多