2011-01-19 29 views
6

私は、ファイルから取った文字列をデコードしようとしています:のpython:ユニコード問題

file = open ("./Downloads/lamp-post.csv", 'r') 
data = file.readlines() 
data[0] 

「\ XFF \ xfeKの\ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ X00 \トン\をx00o \ x00m \ x00m \ x00n \ x00n \ x00t \ x00h \ x00o \ x00n \ x00t \ x00h \ x00o \ x00m \ x00x \ x00x \ x00 \ x00l \ x00y \ x00 ¥x00S¥x00e¥x00a¥x00r¥x00c¥x00h¥x00e¥x00s¥x00¥t¥x00D¥x00e¥x00c¥x00 ¥x002¥x000¥x001¥x000¥x00¥t¥x00N \ x00o \ x00v \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00O \ x00c \ x00t \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00S \ x00e \ x00p \ x00x0000 \ x002 \ x000 \ x001 \ x002 \ x000 \ x001 \ x002 \ x000 \ x002 \ x00u \ x00l \ x00 \ x002 \ x000 \ x001 \ x002 \ x000 \ x001 \ x001 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x002 \ x000 \ x001 \ x000 \ x00 \ t0000 \ x0000 \ x00 \ t0000 \ x00 \ x00 \ t0000 \ x002 \ x000 \ x001 \ x002 \ x000 \ x00p \ x00r \ x00 ¥x002¥x000¥x001¥x00¥t¥x00M¥x00a¥x00r¥x00 ¥x002¥x000¥x001¥x000¥x00¥t¥x00F¥x00e¥x00b¥x00 ¥x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00a \ x00n \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00A \ x00d \ x00 \ x00s \ x00h \ x00a \ x00r \ x00e \ x00 \ 0000 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00A \ x00v \ x00g \ x00。\ x00 \ x00C \ x00P \ x00C \ x00 \ t \ x 00E \ x00x \ x00t \ x00r \ x00a \ x00c \ x00tの\のx00e \ x00d \ X00 \ x00F \ x00r \ x00o \ x00m \ X00 \ x00W \ x00eの\のx00b \ X00 \ x00P \ x00a \ x00g \ x00eの\のX00 \ t \ x00L \ x00o \ x00c \ x00a \ x00l \ x00 \ x00M \ x00o \ x00n \ x00t \ x00h \ x00l \ x00y \ x00 \ x00s \ x00e \ x00a \ x00r \ x00c \ x00h \ x00e \ x00s \ x00 \ n 'は本当に助けていない無視の追加

...:

[69]:データ[2] アウト[69]:U' \ u6700 \ u6100 \ u7200 \ u6400 \ u700 \ u700 \ u2000 \ u7000 \ u600 \ u7300 \ u7400 \ u0900 \ u3000 \ u2e00 \ u3900 \ u3400 \ u0900 \ u3800 \ u3800 \ u6e00 \ u2000 \ u6c00 \ u6e00 \ u2000 \ u3000 \ u0900 \ u0000 \ u0000 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 u3000 \ u3000 \ u3000 \ u3000 \ u3000 \ u0000 \ u0000 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \ u003 \

In [70]:data [2] .decode( "utf-8"、[UTF8]、[UTF8]、[UTF8]、[UTF8] "replace") -------------------------------------------- ------------------------------- トレースバック(最新の最終コール)

/ユーザー/ oleg/in ()

デコードに

/opt/local/lib/python2.5/encodings/utf_8.py (入力、エラー) 14 15 DEF(入力、エラーが= '厳密')を復号化: ---> 16戻りコーデック.utf_8_decode(入力、エラー、 真) 18クラスIncrementalEncoder(コーデック。IncrementalEncoder):

: 'ASCII' コーデックは位置0から87までの文字 をエンコードすることはできません:順序ではない[71]において 範囲(128)

で:

+0

私の答えは間違いなく動作します。しかし、デコードできない文字を無視したり置き換えたりする必要があります。 – orlp

答えて

14

これは、UTF-16のデータのように見えます。だから、

data[0].rstrip("\n").decode("utf-16") 

編集(あなたの更新のため)してみてください:それは

data = open(...).read() 
data.decode("utf-16") 

問題であり、一度にファイル全体を復号化するために試してみてくださいUTF-16での改行は「\ nをしているということです\ x00 "を使用しますが、readlines()を使用すると" \ n "に分割され、次の行には" \ x00 "文字が残ります。

+0

それは働いた!!!! 2番目のオペランドの入力ミスを修正する必要があります(これはrstripです) –

+0

奇妙なことに、次の行に失敗します: –

+0

最後にそれが機能しました! –

3

EDIT

あなたが2.7を掲示するので、これは2.7のソリューションです:

file = open("./Downloads/lamp-post.csv", "r") 
data = [line.decode("utf-16", "replace") for line in file] 

undecodeable文字を無視:

file = open("./Downloads/lamp-post.csv", "r") 
data = [line.decode("utf-16", "ignore") for line in file] 
+0

In [21]:file = open( "./Downloads/lamp-post.csv"、 'r') [22]:data = [ファイル内の行の行番号] --- -------------------------------------------------- ---------------------- <タイプ 'exceptions.UnicodeDecodeError'>トレースバック(最新の最後のコール) /Users/oleg/ in [ascii]コーデックは、位置0のバイト0xffをデコードできません:序数が範囲内にありません(128) [23]:data = [line.decode() for line in file] –

+0

ああ、無効な文字を無視したいのですか?置換を前提に私の答えを編集しました。 – orlp

+0

またはUTF-16。 _15char_ – orlp

4

このファイルは、初期BOMを持つUTF-16-LEエンコードファイルです。

import codecs 

fp= codecs.open("a", "r", "utf-16") 
lines= fp.readlines() 
+0

-1 balderdash。 >>> raw = '¥xff¥xfe¥x00e¥x00y¥x00w¥x00o¥x00r¥x00d¥x00' >>> raw.decode( 'utf_16le') u '\ ufeffキーワード' >>> raw。デコード( 'utf_16') u'Keyword ' >>> –

+0

@John:訂正していただきありがとうございます。 – tzot

+0

@ΤΖωΤΖΙΟΥ:どうぞよろしくお願いします。 –

関連する問題