Eu tenho um quadro de dados em pandas que gostaria de escrever para um arquivo CSV. Estou a fazer isto usando:
df.to_csv('out.csv')
E a receber o erro:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Há alguma forma de contornar isto facilmente (ou seja, tenho caracteres unicode no meu quadro de dados)? E existe uma maneira de escrever num ficheiro delimitado por tabulação em vez de um CSV usando, por exemplo, um 'to-tab' método (que eu não penso que exista)?
Para delimitar por uma aba você pode utilizar o argumento sep
de to_csv
:
df.to_csv(file_name, sep='\t')
Para utilizar uma codificação específica (por exemplo, 'utf-8') utilize o argumento `codificação':
df.to_csv(file_name, sep='\t', encoding='utf-8')
Algo mais que você pode tentar se estiver tendo problemas de codificação para 'utf-8' e quiser ir célula por célula, você pode tentar o seguinte.
**Píton 2***
(Onde "df" é o seu objecto 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
Então tenta:
df.to_csv(file_name)
Você pode verificar a codificação das colunas por:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Atenção: erros='ignorar' irá apenas omitir o caractere, por exemplo
IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'
**Píton 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
Às vezes você enfrenta esses problemas se você especificar a codificação UTF-8 também. Eu recomendo que você especifique a codificação enquanto lê o arquivo e a mesma codificação enquanto escreve no arquivo. Isto pode resolver o seu problema.