2012-04-18 58 views
1

這裏是我的代碼:的Python:從文件顯示錯誤Ascii字符

import sys, os 

print("█████") #<-- Those are solid blocks. 
f= open('file.txt') 
for line in f: 
    print(line) 

在file.txt的是這樣的:

hay hay, guys 
████████████ 

但輸出是這樣的:

██████ 
hay hay, guys <----- ***Looks like it outptutted this correctly!*** 

Traceback (most recent call last): 
    File "echofile.py", line 6, in <module> 
    print(line) 
    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 characters in position 1-2: cha 
racter maps to <undefined> <------ ***But not from the file!*** 

任何人有什麼建議,爲什麼它這樣做?我在IDLE中編寫代碼,嘗試在Programmer的記事本和IDLE中編輯file.txt。該文件是ASCII/ANSI。順便說一句,我使用的是Python 3。 3.3 alpha-win-64如果它很重要。

回答

2

這顯然是與字符編碼的問題。

在Python 3.x中,所有字符串都是Unicode。但是在讀取或寫入文件時,需要將Unicode轉換爲某種特定的編碼。

默認情況下,Python源文件作爲UTF-8處理。我不知道你將什麼字符粘貼到你的源文件中,但是無論它是什麼,Python都會將它讀作UTF-8,它似乎可以工作。也許你的文本編輯器在插入時轉換爲有效的UTF-8?

回溯表明Python將輸入文件視爲「代碼頁437」或原始IBM PC 8位字符集。那是對的嗎?

此鏈接顯示瞭如何設置一個特定的解碼器來處理輸入一個特定的文件編碼:

http://lucumr.pocoo.org/2010/2/11/porting-to-python-3-a-guide/

編輯:我發現了一個更好的資源:

http://docs.python.org/release/3.0.1/howto/unicode.html

和基於在這裏,這是一些示例代碼:

with open('mytextfile.txt', encoding='utf-8') as f: 
    for line in f: 
     print(line, end='') 

本來我的上面設置爲「cp437」,但在一個評論中你說「utf-8」是正確的,所以我對這個例子進行了改變。我在這裏指定end='',因爲文件中的輸入行已在末尾換行,所以我們不需要print()來提供另一個換行符。

編輯:我發現這裏的默認編碼一個簡短的討論:

http://docs.python.org/release/3.0.1/whatsnew/3.0.html

最重要的一點:「有一個依賴於平臺的默認編碼,在Unixy平臺可與LANG環境中設置變量(有時也包含一些其他特定於平臺的與語言環境相關的環境變量)。在許多情況下,但不是全部,系統默認值爲UTF-8;您不應該依賴此默認值。

所以,我以爲Python默認爲UTF-8,但並不總是如此。實際上,從您的堆棧回溯中,我認爲在您的系統中使用您的LANG環境設置,您將獲得默認的「cp437」。

所以,我通過回答你的問題也學到了一些東西!

P.S.我更改了上面的代碼示例以指定utf-8,因爲這是您需要的。

+0

CP437輸出該: █▓▓▓▓▓▓█<---印刷 乾草乾草,球員 asdfΓûôΓûôΓûô Γûê Γûê< - 從文件打印。 – SuperDisk 2012-04-18 21:36:31

+1

在這種情況下,我會猜測cp437是不正確的。 UTF-8是默認的,這也是不正確的。我不知道該告訴你什麼;你需要弄明白。 – steveha 2012-04-18 21:38:12

+0

實際上,只是將編碼指定爲'utf-8',但不指定編碼。奇怪的。 – SuperDisk 2012-04-18 21:46:14

0

嘗試使該字符串的Unicode:

print(u"█████") 
    ^Add this 
+0

他正在使用Python 3.x,它不再具有'u「''語法。所有字符串都是Python 3.x中的Unicode。 – steveha 2012-04-18 21:01:04

+0

這不是造成它的原因。打印本身工作正常,從文件打印是導致錯誤的原因。這也是python 3. – SuperDisk 2012-04-18 21:01:16

+0

讀取文件爲二進制'open('..','rb')'help? – Blender 2012-04-18 21:02:29