2016-12-19 12 views
1

Я пытаюсь читать и записывать dataframe в файл с разделителями каналов. Некоторые из символов являются не-римскими буквами (`, ç, ñ и т. Д.). Но это ломается, когда я пытаюсь записать акценты как ASCII.pandas to_csv: ascii не может кодировать символ

df = pd.read_csv('filename.txt',sep='|', encoding='utf-8') 
<do stuff> 
newdf.to_csv('output.txt', sep='|', index=False, encoding='ascii') 

------- 

    File "<ipython-input-63-ae528ab37b8f>", line 21, in <module> 
    newdf.to_csv(filename,sep='|',index=False, encoding='ascii') 

    File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py", line 1344, in to_csv 
    formatter.save() 

    File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\formats\format.py", line 1551, in save 
    self._save() 

    File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\formats\format.py", line 1652, in _save 
    self._save_chunk(start_i, end_i) 

    File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\formats\format.py", line 1678, in _save_chunk 
    lib.write_csv_rows(self.data, ix, self.nlevels, self.cols, self.writer) 

    File "pandas\lib.pyx", line 1075, in pandas.lib.write_csv_rows (pandas\lib.c:19767) 

UnicodeEncodeError: 'ascii' codec can't encode character '\xb4' in position 7: ordinal not in range(128) 

Если изменить to_csv иметь кодировку UTF-8, то я не могу прочитать файл в правильно:

newdf.to_csv('output.txt',sep='|',index=False,encoding='utf-8') 
pd.read_csv('output.txt', sep='|') 

> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 2: invalid start byte 

Моя цель состоит в том, чтобы иметь трубы разделителями файл сохраняет акценты и специальные символы.

Кроме того, есть ли простой способ выяснить, какая строка read_csv ломается? Прямо сейчас я не знаю, как заставить его показать мне плохой характер.

+0

Возможный дубликат [панд написание dataframe в CSV-файл] (http://stackoverflow.com/questions/16923281/pandas- write-dataframe-to-csv-file) – mbecker

+0

Вы нормализуете свои строки в Юникоде, чтобы удалить акценты? Я думал, что ASCII не может обрабатывать эти письма ... –

+0

@ juanpa.arrivillaga: Я редактировал свой пост, чтобы уточнить, что я ищу в своем выпуске. – ale19

ответ

3

У вас есть некоторые символы, которые не являются ASCII и поэтому не могут быть закодированы так, как вы пытаетесь сделать. Я бы просто использовал utf-8, как это было предложено в комментарии.

Чтобы проверить, какие строки вызывают вопрос, вы можете попробовать что-то вроде этого:

def is_ascii(string): 
    if all([ord(s) < 128 for s in string]): 
     return True 
    return False 

df[df[col].apply(is_ascii)] 

Вам необходимо указать столбец col вы проверяете.

+0

Спасибо. Когда я пытаюсь выполнить вашу функцию (указав столбец), я получаю TypeError: ord() ожидается символ, но строка длиной 17 найдена. Я предполагаю, что это потому, что ord() проверяет отдельные символы, но столбец содержит строки. – ale19

+0

Упс! Я исправил ошибку. Cheers – AlexG

+0

Если вы делаете 'df [df [col] .apply (is_ascii) == False]', тогда вы получаете только строки/индексы, где и ошибка была найдена. – dreab

1

Проверить ответ here

Это необходимо простое решение:

newdf.to_csv("C:/tweetDF", sep='\t', encoding = 'utf-8') 
Смежные вопросы