readline()生成意外的字符串

时间:2014-10-10 04:30:35

标签: python file-io dictionary

当文件给我一个我很好奇的意外输出时,今天练习一下字典和文件i / o。我编写了以下简单函数,它只取一个文本文件的第一行,将其分成单个单词,并将每个单词放入一个字典中:

def create_dict(file):
    dict = {}
    for i, item in enumerate(file.readline().split(' ')):
        dict[i]= item
    file.seek(0)
    return dict

print "Enter a file name:"
f = open(raw_input('-> '))

dict1 = create_dict(f)
print dict1

很简单,在每种情况下它都会产生完全预期的输出。每个案例除了一个。我有一个文本文件是通过以下shell命令将另一个python脚本的输出传递给文本文件而创建的:

C:\> python script.py > textFile.txt

当我使用textFile.txt和我的字典脚本时,我得到一个看起来像的输出:

{0: '\xff\xfeN\x00Y\x00', 1: '\x00S\x00t\x00a\x00t\x00e\x00', 2: '\x00h\x00a\x00s\x00:\x00', 3: '\x00', 4: '\x00N\x00e\x00w\x00', 5: '\x00Y\x00o\x00r\x00k\x00\r\x00\n'}

这个输出叫什么?为什么通过命令行将脚本输出管道传输到文本文件会产生与任何其他文本文件不同的字符串类型?当我在文本编辑器中打开此文件时,为什么没有明显的差异?我进行了搜索和搜索,但我甚至都不知道那会是什么,因为我还很新。

3 个答案:

答案 0 :(得分:0)

您的文件采用UTF-16编码。前2个字符是字节顺序标记(BOM)\xff\xfe。此外,您会注意到每个字符似乎占用2个字节,其中一个是\x00

您可以使用编解码器模块为您解码:

import codecs

f = codecs.open(raw_input('-> '), 'r', encoding='utf-16')

或者,如果您使用的是Python 3,则可以向encoding提供open()参数。

答案 1 :(得分:0)

我猜你遇到的问题是'字符代码'问题。 在python中,默认字符代码是ascii,因此当您使用open()函数来读取文件时,该值将被解释为ascii代码。 但是,输出可能不知道字符代码的含义,您需要解码输出消息才能看到它“正常”。

正常情况下,系统使用utf-8代码进行读取,您可以尝试解码(item,'utf-8')。

您可以搜索有关字符代码,ascii,utf-8,unicode及其传输方法的更多信息。

希望可以提供帮助。

答案 2 :(得分:0)

>>> import codecs
>>> codecs.BOM_UTF16_LE
'\xff\xfe'

要阅读utf-16编码文件,您可以使用io模块:

import io

with io.open(filename, encoding='utf-16') as file:
    words = [word for line in file for word in line.split()]

codecs.open()相比的优势在于它支持内置open()的{​​{3}},而{3}是Python 3中的内置io.open()