Имам рамка от данни в pandas, която искам да запиша в CSV файл. Правя това с помощта на:
df.to_csv('out.csv')
И получавам грешката:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Има ли някакъв начин да се заобиколи това лесно (т.е. имам еднокодови символи в рамката си от данни)? И има ли начин да се запише в tab delimited файл вместо в CSV, като се използва например метод 'to-tab' (който според мен не съществува)?
За да разделите с табулатор, можете да използвате аргумента sep
на to_csv
:
df.to_csv(file_name, sep='\t')
За да използвате специфично кодиране (напр. 'utf-8'), използвайте аргумента encoding
:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Ако имате проблеми с кодирането в 'utf-8' и искате да преминете клетка по клетка, можете да опитате следното.
Python 2
(Където "df" е вашият обект 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
След това опитайте:
df.to_csv(file_name)
Можете да проверите кодирането на колоните, като:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Предупреждение: errors='ignore' просто ще пропусне символа, напр.
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
Понякога се сблъсквате с тези проблеми, ако посочите и кодиране UTF-8. Препоръчвам ви да посочите кодиране при четене на файла и същото кодиране при запис във файла. Това може да реши проблема ви.