2013-03-25 7 views
5

Supponiamo di leggere un sito Web html e ottengo un elenco di nomi, ad esempio: "Amiel, Henri-Frédéric".Come leggere un dataframe di stringhe codificate da csv in python

Al fine di ottenere l'elenco dei nomi decodifico HTML utilizzando il seguente codice:

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

A questo punto, la lista variabile contiene un elenco di nomi come:

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

Ora vorrei:

  1. inserire questi nomi in un DataFrame;
  2. salva il DataFrame in un file csv;
  3. leggere il csv in Python attraverso un dataframe

Per semplicità, prendiamo in considerazione solo il nome sopra per completare i passaggi da 1 a 3. Vorrei utilizzare il seguente codice:

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 

A questo punto ottengo il seguente errore:

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

Se sostituisco l'ultima riga del codice precedente con:

print uni 

Posso leggere il DataFrame ma non penso che sia il modo giusto per gestire questo problema.

Ho rosso molte domande postate da altri utenti su questo argomento ma non ho risolto questo.

risposta

9

Entrambi il metodo to_csv e la funzione read_csv accettano un argomento encoding. Usalo. E lavorare con unicode internamente. Se non lo fai, provare a codificare/decodificare all'interno del tuo programma ti porterà a.

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 

out:

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

Siamo spiacenti, le tue opere di codice, ma solo se si utilizza 'uni di stampa' come l'ultima riga di codice. Se si tenta di utilizzare solo 'uni' si ottiene l'errore: "UnicodeDecodeError: il codec 'utf8' non può decodificare il byte 0xe9 nella posizione 67: byte di continuazione non valido" –

+0

@ fabrizio_ff - quali versioni di 'pandas' /' numpy' sono stai usando? – root

+0

@ root-- numpy: 1.6.2 // panda: 0.9.1. Ho provato a usare il tuo ultimo codice, ma se scrivo solo "uni" otterrò lo stesso errore (invece funziona con "print uni"). –

Problemi correlati