2015-08-26 37 views
0

我試圖做最簡單的事情,打開一個文件,在python中讀取並關閉它。簡單。嗯,這是代碼:Python - 如何打開一個有emojis的文本文件

name_file = open("Forever.txt", encoding='UTF-8') 
data = name_file.read() 
name_file.close() 

print (data) 

我知道,這個文本有表情符號,它在如心,等的就是這個表情符號,並不像U + 2600有統一的語法,它們被放置儘可能少的圖像。我想下面的錯誤是因爲這個小圖片:

return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f681' in   
position 2333: character maps to <undefined> 

我嘗試以下,沒有specifyng編碼:

name_file = open("Forever.txt") 

和錯誤更改爲此:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 2303: character maps to <undefined> 

無想法爲什麼會這樣。

也許一個解決方案將是在測試是和刪除,其餘變量都保存...嗯

任何幫助將是非常讚賞

+2

您的文件實際上並不包含圖像。您的文件包含文本。您的*文本編輯器*可能會選擇*將某些字符顯示爲圖像。請注意這種區別。 –

+0

是的,我想過。感謝提示 – NachoMiguel

+0

Unicode'\ U0001f681'不是一個圖像,它是一個完全有效的字符代碼。也許你的Python已經過時了。表情符號是一個相當新的補充,Python可能會檢查您認爲是無效條目的輸入。 – usr2564301

回答

4

您會收到UnicodeEncodeError,可能來自您的print聲明。該文件正在被正確讀取和解釋,但您只能打印控制檯編碼和字體實際支持的字符。錯誤表示該字符在當前編碼中不受支持。

例如:

Python 3.3.5 (v3.3.5:62cf4e77f785, Mar 9 2014, 10:35:05) [MSC v.1600 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> print('\U0001F681') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\\Python33\lib\encodings\cp437.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f681' in position 0: character maps to <undefined> 

但打印終端編碼支持的字符,它的工作原理:

>>> print('\U000000E0') 
à 

我的控制檯編碼爲cp437,但如果我用一個Python IDE支持UTF -8編碼,那麼它的工作原理如下:

>>> print('\U0001f681') 

您可能看不到正確的字符。你需要使用支持字符的字體;否則,你會得到一些默認的替換字符。

+0

我認爲這是一個非常準確的迴應。我試過這個打印('\ U000000E0'),它工作,所以你是完全正確的。你能告訴我如何解決這個我的洞文本文件,如果你有任何想法?非常感謝 – NachoMiguel

+0

最簡單的方法是使用支持UTF-8編碼的Python IDE,然後查找支持您關心的所有字符的字體。 Windows控制檯沒有良好的字體或UTF-8支持。 –

+0

我在pycharm中運行這個。我應該找一個支持這個的字體 – NachoMiguel

3

沒有看到你輸入的文件,這是很難猜測它的實際編碼是什麼。包含「小圖片」的文本文件不是對文件格式的有意義的描述,儘管我的猜測是你的文件實際上是UTF-8編碼的,因爲用該編碼打開它是有效的。打印數據失敗,因爲你的標準輸出的編解碼器(可能是你的終端的編解碼器)不能編碼表情符號。你可以嘗試明確UTF-8編碼,如果你的終端支持編碼:

sys.stdout.buffer.write(data.encode('utf-8')) 

如果你的終端不支持的編解碼器,它能夠顯示錶情符號,那麼這是你的終端的固有限制,在Python代碼中你無能爲力。