Python readline()生成意外的字符串

Python readline()生成意外的字符串,python,file-io,dictionary,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

今天,当一个文件给了我一个我很好奇的意外输出时,我开始练习使用字典和文件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'}

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

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

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

import codecs

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

或者,如果您使用的是Python3,您可以将
encoding
参数提供给
open()

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

正常情况下,系统使用utf-8代码进行读取,您可以尝试解码(项目“utf-8”)

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

希望能有所帮助

>>> 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()]

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

谢谢!我不知道那叫什么,现在我可以自己搜索,花一些时间阅读编码,提高我的Python功夫:-)@JasonSherrick:不要在原始utf-16字节上使用
file.readline().split(“”)
。它在换行符内分割输入(在您的问题中清楚地显示),从而破坏数据。