2016-08-30 5 views
0

Я использую pandas для загрузки файлов csv, созданных excel, сделайте некоторый анализ, а затем сохраните результаты в csv-файлах. Я заметил, что методы pandas to_csv и from_csv не способны обрабатывать специальные символы, такие как \ r, но также не создают никаких ошибок.Проблемы со специальными символами ( r) при записи и чтении файлов csv

In [7]: import pandas as pd 

In [8]: data = {    
'A': ['one', 'two', 'three'], 
'B': ['four', 'five', 'six'] 
} 

In [9]: df = pd.DataFrame(data) 

In [10]: df 
Out[10]: 
     A  B 
0 one four 
1 two five 
2 three six 

In [11]: df.loc[1,'A'] = 't' + '\r' + 'o' 

In [12]: df 
Out[12]: 
     A  B 
0 one four 
1 t\ro five 
2 three six 

In [13]: df.to_csv("my_df.csv") 

In [14]: df2 = pd.DataFrame.from_csv("my_df.csv") 

In [15]: df2 
Out[15]: 
     A  B 
0 one four 
1  t NaN 
o five NaN 
2 three six 

Поскольку я не уточняя любую кодировку здесь я предполагаю, что он использует ASCII, но даже если я указываю кодировку = «UTF-8» для записи и чтения я получаю тот же результат.

Как написать надежный скрипт записи и чтения csv, чтобы строки/столбцы не были повреждены или произошли другие непредвиденные события? Если единственное решение - проверить и «очистить» каждую строку перед записью в csv, то что это самый простой способ сделать это?

+0

CSV является довольно дикий формат с тонны диалектов. RFC 4180 пытается определить его. Там. Возврат каретки ('\ r') не допускается внутри блока TEXTDATA. Это часть линейного (рекордного) деминера. –

ответ

1

Если у кого-то нет лучшего предложения, я имею дело с конкретной проблемой следующим образом: предварительно обработав каждый файл csv перед загрузкой с помощью Pandas. Кажется, что я работаю над своей нынешней системой, но не убежден, что это глупое доказательство.

In [30]: f = open("my_df.csv") 

In [31]: content = f.read().replace('\r',' ') 

In [32]: with open("my_df2.csv", "w") as g: 
    ....:  g.write(content) 
    ....:  

In [33]: df2 = pd.DataFrame.from_csv("my_df2.csv") 

In [34]: df2 
Out[34]: 
     A  B 
0 one four 
1 t o five 
2 three six 
+0

После предварительной обработки вам не нужно записывать его обратно в файл. Используйте 'StringIO (content)' как дескриптор файла, например: 'df2 = pd.read_csv (StringIO (content), ...)'. – ptrj

+0

Также: python3 автоматически заменяет '\ r' на' \ n' при чтении. Таким образом, ваш 'f.read(). Replace ('\ r', '')' не будет работать. В этом случае возможно чтение в двоичном режиме, а затем преобразование/декодирование байтов в строки. – ptrj

0

Предварительная обработка может быть наилучшим вариантом. Но если вы ищете что-то другое, вы можете попробовать lineterminator аргумент в read_csv:

df = pd.read_csv("my_df.csv", index_col=0, lineterminator='\n') 

(работает для меня на Linux, но не может гарантировать для других платформ.)