2011-01-19 39 views
6

tôi đang cố gắng để giải mã một chuỗi tôi mất từ ​​file:python: unicode vấn đề

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

'\ xff \ xfeK \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ x00 \ t \ x00C \ x00o \ x00m \ x00i \ x00n \ x00i \ x00o \ x00n \ x00 \ x \ x00g \ x00l \ x00o \ x00b \ x00a \ x00l \ x00 \ x00M \ x00o \ x00n \ x00t \ x00gi \ x00l \ x00y \ x00 \ x00S \ x00c \ x00a \ x00r \ x00c \ x00h \ x00e \ x00 \ s \ x00c \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00N \ x00o \ x00v \ x00 \ x002 \ x000 \ x00O \ x00c \ x00t \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00S \ x00e \ x00p \ x00 \ x002 \ x00 \ x \ x00A \ x00u \ x00g \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00u \ x00l \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00J \ x00u \ x00n \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00M \ x00a \ x00y \ x00 \ x002 \ x000 \ x001 \ x000 \ x00 \ t \ x00A \ x00p \ x00r \ x00 \ x002 \ x000 \ 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 \ t \ x00S \ x00c \ x00a \ x00r \ x00c \ x00h \ x00 \ x00s \ x00h \ x00a \ x00r \ x00e \ x00 \ t \ x00E \ x00s \ x00t \ x00i \ x00m \ x00a \ x00t \ x00e \ x00d \ x00 \ x00A \ x00v \ x00g \ x00. \ x00 \ x00C \ x00P \ x00C \ x00 \ t \ x 00E \ x00x \ x00t \ x00t \ 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 '

Thêm phớt lờ không thực sự giúp ...:

Trong [69]: Số liệu [2] Out [69]: u' \ u6700 \ u6100 \ u7200 \ u6400 \ u6500 \ u6e00 \ u2000 \ u6c00 \ u6100 \ u6d00 \ u7000 \ u2000 \ u7000 \ u6f00 \ u7300 \ u7400 \ u0900 \ u3000 \ u2e00 \ u3900 \ u3400 \ u0900 \ u3800 \ u3800 \ u3000 \ u0900 \ u2d00 \ u0900 \ u3300 \ u3900 \ u3000 \ u0900 \ u3300 \ u3900 \ u3000 \ u0900 \ u3300 \ u3900 \ u3000 \ u0900 \ u3400 \ u3800 \ u3000 \ u0900 \ u3500 \ u3900 \ u3000 \ u0900 \ u3500 \ u3900 \ u3000 \ u0900 \ u3700 \ u3200 \ u3000 \ u0900 \ u3300 \ u3200 \ u3000 \ u0900 \ u3300 \ u3200 \ u3000 \ u0900 \ u3200 \ u3600 \ u3000 \ u0900 \ u2d00 \ u0900 \ u2d00 \ u0900 \ ua300 \ u3200 \ u2e00 \ u3100 \ u3800 \ u0900 \ u2d00 \ u0900 \ u3400 \ u3800 \ u3000 \ u0a00 '

Trong [70]: data [2] .decode ("utf-8", "thay thế") -------------------------------------------- ------------------------------- Traceback (cuộc gọi gần đây nhất)

/Người dùng/oleg/in ()

/opt/local/lib/python2.5/encodings/utf_8.py trong giải mã (đầu vào, lỗi) 15 giải mã def (đầu vào, lỗi = 'nghiêm ngặt'): ---> 16 codec trả về .utf_8_decode (đầu vào, lỗi, Đúng) 18 lớp IncrementalEncoder (codec.IncrementalEncoder):

: 'ascii' codec không thể mã hóa ký tự ở vị trí 0-87: thứ tự không trong phạm vi (128)

Trong [71]:

+0

Câu trả lời của tôi hoạt động mà không có lỗi. Nhưng nó phụ thuộc vào thời tiết bạn muốn bỏ qua hoặc thay thế các ký tự không thể giải thích được. – orlp

Trả lời

14

này trông giống như UTF-16 dữ liệu. Vì vậy hãy thử

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

Chỉnh sửa (ví cập nhật của bạn): Cố gắng để giải mã toàn bộ tập tin cùng một lúc, đó là

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

Vấn đề là các ngắt dòng trong UTF-16 là "\ n \ x00 ", nhưng sử dụng readlines() sẽ chia thành" \ n ", để lại ký tự" \ x00 "cho dòng tiếp theo.

+0

Đã hoạt động !!!! Chỉ cần sửa lỗi đánh máy trong toán hạng thứ hai (vì vậy nó là rstrip) –

+0

Lạ, nó không thành công cho dòng tiếp theo: –

+0

Cuối cùng nó hoạt động !!! –

3

EDIT

Kể từ khi bạn đăng 2,7 này là giải pháp 2.7:

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

Bỏ qua nhân vật undecodeable:

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

Trong [21]: file = open ("./Downloads/lamp-post.csv", 'r') Trong [22]: data = [line.decode() cho dòng trong tệp] --- -------------------------------------------------- ---------------------- Traceback (cuộc gọi gần đây nhất) /Người dùng/oleg/ trong () : 'ascii' codec không thể giải mã byte 0xff ở vị trí 0: thứ tự không nằm trong phạm vi (128) Trong [23]: data = [line.decode() cho dòng trong tệp] –

+0

Ồ, bạn có muốn bỏ qua các ký tự không hợp lệ đó hoặc thay thế chúng không? Đã chỉnh sửa câu trả lời của tôi giả định thay thế. – orlp

+0

Hoặc UTF-16. _15char_ – orlp

4

Tệp này là tệp được mã hóa UTF-16-LE, với BOM ban đầu.

import codecs 

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

-1 balderdash. >>> raw = '\ xff \ x00K \ x00e \ x00y \ x00w \ x00o \ x00r \ x00d \ x00' >>> raw.decode ('utf_16le') u '\ ufeffKeyword' >>> raw.giải mã ('utf_16') u'Từ khoá ' >>> –

+0

@John: cảm ơn sự hiệu chỉnh. – tzot

+0

@ ΤΖΩΤΖΙΟΥ: Bạn được chào đón. –