2013-03-25 70 views
5

Giả sử tôi đọc một trang web html và tôi nhận được một danh sách các tên, chẳng hạn như: 'Amiel, Henri-Frédéric'.Cách đọc một khung dữ liệu của các chuỗi được mã hóa từ csv trong python

Để có được danh sách các tên tôi giải mã html sử dụng đoạn mã sau:

f = urllib.urlopen("http://xxx.htm") 
html = f.read() 
html=html.decode('utf8') 
t.feed(html) 
t.close() 
lista=t.data 

Tại thời điểm này, biến Lista chứa một danh sách những cái tên như:

[u'Abatantuono , Diego ' ..., u'Amiel, Henri-Frédéric']

Bây giờ tôi muốn:

  1. đặt những tên này vào trong một DataFrame;
  2. lưu DataFrame vào tệp csv;
  3. đọc csv bằng Python qua một DataFrame

Để đơn giản, chúng ta hãy xem trong việc xem xét chỉ là tên ở trên để hoàn thành bước 1 đến 3. Tôi sẽ sử dụng đoạn mã sau:

name=u'Amiel, Henri-Fr\xe9d\xe9ric' 
name=name.encode('utf8') 
array=[name] 
df=pd.DataFrame({'Names':array}) 
df.to_csv('names') 
uni=pd.read_csv('names') 
uni #trying to read the csv file in a DataFrame 

Tại thời điểm này tôi nhận được lỗi sau:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 67: invalid continuation byte  

Nếu tôi thay thế dòng cuối cùng của đoạn mã trên với:

print uni 

Tôi có thể đọc DataFrame nhưng tôi không nghĩ đó là cách phù hợp để xử lý vấn đề này.

Tôi có nhiều câu hỏi được đăng bởi những người dùng khác về lập luận này nhưng tôi đã không giải quyết vấn đề này.

Trả lời

9

Cả hai phương thức to_csv và hàm read_csv lấy tham số encoding. Sử dụng nó. Và làm việc với unicode trong nội bộ. Nếu bạn không, cố gắng mã hóa/giải mã bên trong chương trình của bạn sẽ nhận được bạn.

import pandas as pd 

name = u'Amiel, Henri-Fr\xe9d\xe9ric' 
array = [name] 
df = pd.DataFrame({'Names':array}) 
df.to_csv('names', encoding='utf-8') 
uni = pd.read_csv('names', index_col = [0], encoding='utf-8') 
print uni # for me it works with or without print 

ra:

    Names 
0 Amiel, Henri-Frédéric 
+0

Xin lỗi, công trình code của bạn nhưng chỉ khi bạn sử dụng 'in uni' như dòng cuối cùng của mã. Nếu bạn cố gắng sử dụng chỉ 'uni' bạn nhận được lỗi: "UnicodeDecodeError: 'utf8' codec không thể giải mã byte 0xe9 ở vị trí 67: byte tiếp tục không hợp lệ" –

+0

@ fabrizio_ff - phiên bản 'pandas' /' numpy' là gì bạn sử dụng? – root

+0

@ root-- numpy: 1.6.2 // gấu trúc: 0.9.1. Tôi đã cố gắng sử dụng mã cuối cùng của bạn nhưng nếu tôi chỉ viết 'uni' tôi sẽ gặp lỗi tương tự (thay vào đó nó hoạt động với 'print uni'). –

Các vấn đề liên quan