2013-03-25 15 views
5

Załóżmy, że czytam stronę internetową HTML i otrzymuję listę nazw takich jak: "Amiel, Henri-Frédéric".Jak odczytać ramkę danych zakodowanych ciągów z CSV w pythonie

Aby uzyskać listę nazw I zdekodować html za pomocą następującego kodu:

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

W tym momencie lista zmienna zawiera listę nazw, takich jak:

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

teraz chciałbym:

  1. umieść te nazwy wewnątrz ramki DataFrame;
  2. zapisać DataFrame w pliku csv;
  3. odczytać CSV w Pythonie przez DataFrame

Dla uproszczenia, niech bierze pod uwagę tylko powyższą nazwę, aby zakończyć kroki od 1 do 3. Chciałbym użyć następującego kodu:

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 

Na ten punkt pojawia się następujący błąd:

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

Gdybym zastąpić ostatni wiersz powyższego kodu z:

print uni 

Czytam DataFrame, ale nie sądzę, że jest to właściwy sposób na rozwiązanie tego problemu.

Mam wiele pytań wysłanych przez innych użytkowników na temat tego argumentu, ale nie udało mi się rozwiązać tego problemu.

Odpowiedz

9

Zarówno metoda to_csv jak i funkcja read_csv przyjmują argument encoding. Użyj tego. I pracuj z wewnętrznym unicode. Jeśli tego nie zrobisz, próba zakodowania/odkodowania w twoim programie dostarczy Ci.

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 

się:

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

Niestety, swoje prace kod, ale tylko wtedy, gdy używasz 'uni print' jako ostatni wiersz kodu. Jeśli spróbujesz użyć tylko "uni", pojawi się błąd: "UnicodeDecodeError: kodek" utf8 "nie może dekodować bajtu 0xe9 na pozycji 67: nieprawidłowy bajt kontynuacji" –

+0

@ fabrizio_ff - jaka jest wersja 'pandas' /' numpy' używasz? – root

+0

@ root-- numpy: 1.6.2 // pandy: 0.9.1. Próbowałem użyć twojego ostatniego kodu, ale jeśli napiszę tylko "uni", otrzymam ten sam błąd (zamiast tego działa z 'print uni'). –

Powiązane problemy