2013-03-25 18 views
5

Bir html web sitesi okudum ve bir ad listesi aldığımı varsayalım: 'Amiel, Henri-Frédéric'. Aşağıdaki kodu kullanarak html kodunu çözmek adlarının listesini almak içinPython'da csv'den kodlanmış dizelerin veri çerçevesi nasıl okunur?

:

[u'Abatantuono: Bu noktada

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

, değişken lista gibi isimlerin bir listesini içerir Diego ' ... u'Amiel Henri-Frederic']

Şimdi istiyorum:

  1. bu adları bir DataFrame içine yerleştirin;
  2. DataFrame'i bir csv dosyasında saklayın; At

    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 
    

    :

  3. bir DataFrame aracılığıyla Python csv okundu
  4. Kolaylık olması açısından

, ı şu kodu kullanırsınız 1'den 3'e kadar adımları tamamlamak için göz önünde bulundurularak hemen üstünde adını alalım Bu noktada ben aşağıdaki hatayı alıyorum:

:

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

birlikte yukarıdaki kod son satırı yerine ise

print uni 

DataFrame'i okuyabiliyorum, ancak bu sorunu çözmenin doğru yolu olduğunu düşünmüyorum.

Bu argümanla ilgili olarak diğer kullanıcılar tarafından gönderilen birçok soruyu reddediyorum, ancak bunu çözemedim. Her iki to_csv yöntemi ve read_csv işlevinin her ikisi de encoding argümanını alır.

cevap

9

Kullan. Ve dahili olarak unicode ile çalışın. Eğer yapmazsanız, programınızda kodunu kodlamaya/çözmeye çalışmanız size'u verecektir.

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 

üzerinden:

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

Maalesef kod çalışır ancak kodunun son satırı olarak 'baskı uni' kullanmak durumunda. Eğer 'uni' kullanmayı denerseniz, hatayı alırsınız: "UnicodeDecodeError: 'utf8' codec'i, 67: baytında 0xe9 kodunu çözemez: geçersiz devam eden bayt" –

+0

@ fabrizio_ff - ne "pandalar"/"numpy" sürümü kullanıyorsun – root

+0

@ root-- numpy: 1.6.2 // pandalar: 0.9.1. Son kodunuzu kullanmaya çalıştım ama eğer 'uni' yazarsam aynı hatayı alırım (bunun yerine 'print uni' ile çalışır). –

İlgili konular