2017-03-22 14 views
1

ascii形式のファイルを解析していますが、big5(Trad。Chinese)に非ASCII文字が含まれています。
詳細については、CISACのCWRファイルを参照してください。ASCII以外の文字をASCIIファイルでデコードしますか?

私はnon-ascii文字をうまくデコードしようとしています。 ここ例ライン:

NWN000003930000016400507347 ^N&ÊÅ+/{^O 

位置29から188には、BIG5で符号化されるべきです。

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import os 
import sys 
import binascii 
from chardet.universaldetector import UniversalDetector 
from chardet import detect 

with open("/path/to/file") as fd: 
    line = fd.readline() 
    while line: 
     if line[0:3] == 'NWN': 
      last_name = line[29:188] 
      print last_name 
      print detect(line)['encoding'] 
      print last_name.decode('big5') 
     line = fd.readline() 

しかし、私は上記の行の取得結果は次のとおりです。

NWN000000140000016300401453 ^N/õ<Dï.^O 

でもクラッシュ:

windows-1252 
Traceback (most recent call last): 
    File "test_big5.py", line 36, in <module> 
print last_name.decode('big5') 
UnicodeDecodeError: 'big5' codec can't decode bytes in position 1-2: illegal multibyte sequence 

I

None 
&岒+/{ 

そして、次の行の

次のようにも試みました:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import sys 
from codecs import EncodedFile 

from_encoding = 'big5' 
to_encoding = 'utf8'  
sys.stdout = EncodedFile(sys.stdout, from_encoding, to_encoding) 

f = file("/path/to/file", "r") 
str = f.read() 
sys.stdout.write(str) 

私は、サンプルファイルhere

私が間違ってやっているかについての任意のアイデアを添付?

+3

なぜ最初にBig5としてファイルを開いていませんか? –

+0

試してみることができる小さなサンプルファイルを投稿できますか?エンコードされたファイルは投稿するのが難しいかもしれませんが、最初の数行で失敗したファイルがあれば 'print(open( '/ path/to/file'、 'rb')の結果を投稿できます。 3]) 'を作成して、そのリストを簡単に取り出し、自分でファイルを再構築することができます。 – tdelaney

+0

ファイルをバイナリ( '' rb "')で開くことで、問題を解決できると思う。あなたの比較は 'if line [0:3] == b'NWN ':'でなければなりません。 – tdelaney

答えて

0

big5コーデックでファイルを読み取ることができます。それをしようとすると、私はあなたのファイルで

>>> import codecs 
>>> codecs.open('nwn.file', encoding="big5").read() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/codecs.py", line 668, in read 
     return self.reader.read(size) 
UnicodeDecodeError: 'big5' codec can't decode bytes in position 1790-1791: illegal multibyte sequence 

ラインはかなりの長さで得たので、私は(何のコーデックは、単に「RB」モードとreadlines()でファイルを開けない)のリストにそれらを読んで、アウトトリミング空白。今、このリストを実行可能な例として使用できます。これはバイナリモードで読み込まれたファイルからデータを投稿することを提案したときに私が得ていたものです。

test = [ 
b'NWN000003930000016400507347 \x0e&\xca\xc5+/{\x0f     ZH\r\n' 
b'NWN000003960000016400507347 \x0e&\xca\xc5+/{\x0f     ZH\r\n' 
b'NWN000005660000046800507347 \x0e&\xca\xc5+/{\x0f     ZH\r\n' 
b'NWN000016200000016400507347 \x0e&\xca\xc5+/{\x0f     ZH\r\n' 
b'NWN000025600000016400507347 \x0e&\xca\xc5+/{\x0f     ZH\r\n' 
b'NWN000000140000016300401453 \x0e/\xf5<D\xef.\x0f     ZH\r\n' 
] 

次に、1行ずつデコードしました。デフォルトのerrors='strict'の代わりに、私はreplaceを使って何が起こっているのかを見ました。それらは&岒+/{少し奇妙ですが、私はこのファイルが何であるか分からない。疑問符は最終行であることに注意してください。非big8配列があります。このファイルは壊れています。

>>> for line in test: 
...  print line.strip().decode('big5', errors='replace') 
... 
NWN000003930000016400507347 &岒+/{     ZH 
NWN000003960000016400507347 &岒+/{     ZH 
NWN000005660000046800507347 &岒+/{     ZH 
NWN000016200000016400507347 &岒+/{     ZH 
NWN000025600000016400507347 &岒+/{     ZH 
NWN000000140000016300401453 /�D�     ZH 

あなたはほとんどのデータが必要な場合は、私の例のような行ずつをデコードし、そのエラーをキャッチできます。

関連する問題