2014-10-10 24 views
0

當一個文件給我一個我很好奇的意外輸出時,今天就開始練習使用字典和文件I/O。我寫了下面簡單的函數,只需要一個文本文件的第一行,把它分成單個的單詞,並把每個單詞到詞典:readline()產生意想不到的字符串

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'} 

此輸出稱爲什麼?爲什麼通過命令行將腳本輸出管道輸出到文本文件會產生與其他文本文件不同類型的字符串?爲什麼在我的文本編輯器中打開該文件時沒有明顯的差異?我搜索和搜索,但我甚至不知道那會被稱爲,因爲我還很新。

回答

0

你的文件是UTF-16編碼的。前兩個字符是字節順序標記(BOM)\xff\xfe。你也會注意到每個字符看起來需要2個字節,其中之一是\x00

可以使用的編解碼器模塊進行解碼,以便您:

import codecs 

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

或者,如果你正在使用Python 3,你可以提供encoding參數open()

+0

謝謝!我不知道那是什麼,現在我可以自己搜索,並花一些時間閱讀編碼和增加我的Python功夫:-) – JtheDude 2014-10-10 04:49:32

+0

@JasonSherrick:不要使用'file.readline()。split() '')'原始utf-16字節。它將輸入內容*拆分爲換行符(在您的問題中顯示清楚),破壞數據。 – jfs 2014-10-10 05:17:58

0

我想你遇到的問題是'字符代碼'問題。 在python中,默認的字符代碼是ascii,所以當你使用open()函數讀取文件時,該值將被解釋爲ascii代碼。 但是,輸出可能不知道字符代碼的含義,您需要解碼輸出消息才能看到它'正常'。正常情況下,系統使用utf-8代碼讀取,您可以嘗試解碼(item,'utf-8')。

而且您可以搜索有關字符代碼,ascii,utf-8,unicode及其傳輸方法的更多信息。

希望可以幫助。

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()的是,它支持the universal newline mode象內建open(),而io.open()在Python內建open() 3.

相關問題