V programu pandas imam podatkovni okvir, ki bi ga rad zapisal v datoteko CSV. To počnem z uporabo:
df.to_csv('out.csv')
In dobim napako:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Ali obstaja kakršen koli način, da bi to enostavno obšel (tj. v mojem podatkovnem okviru so enokodni znaki)? In ali obstaja način za zapisovanje v datoteko z omejitvami tabel namesto v CSV z uporabo npr. metode 'to-tab' (ki po mojem mnenju ne obstaja)?
Za razmejitev s tabulatorjem lahko uporabite argument sep
to_csv
:
df.to_csv(file_name, sep='\t')
Za uporabo določenega kodiranja (npr. 'utf-8') uporabite argument encoding
:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Če imate težave s kodiranjem v 'utf-8' in bi radi prešli po celicah, lahko poskusite še z naslednjim.
Python 2
(Pri čemer je "df" vaš objekt DataFrame.)
for column in df.columns:
for idx in df[column].index:
x = df.get_value(idx,column)
try:
x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
df.set_value(idx,column,x)
except Exception:
print 'encoding error: {0} {1}'.format(idx,column)
df.set_value(idx,column,'')
continue
Nato poskusite:
df.to_csv(file_name)
Kodiranje stolpcev lahko preverite tako, da:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Opozorilo: errors='ignore' samo izpusti znak, npr.
IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'
Python 3
for column in df.columns:
for idx in df[column].index:
x = df.get_value(idx,column)
try:
x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
df.set_value(idx,column,x)
except Exception:
print('encoding error: {0} {1}'.format(idx,column))
df.set_value(idx,column,'')
continue
Včasih se s temi težavami srečate, če določite tudi kodiranje UTF-8. Priporočam vam, da določite kodiranje med branjem datoteke in enako kodiranje med pisanjem v datoteko. To bo morda rešilo vašo težavo.