Python 写入和读取csv文件时出现特殊字符(\r)问题

Python 写入和读取csv文件时出现特殊字符(\r)问题,python,pandas,special-characters,export-to-csv,Python,Pandas,Special Characters,Export To Csv,我正在使用pandas加载excel创建的csv文件,进行一些分析,然后将结果保存到csv文件。我注意到pandas to_csv和from_csv方法似乎无法处理特殊字符,例如\r,但也不会产生任何错误 In [7]: import pandas as pd In [8]: data = { 'A': ['one', 'two', 'three'], 'B': ['four', 'five', 'six'] } In [9]: df = pd.DataFram

我正在使用pandas加载excel创建的csv文件,进行一些分析,然后将结果保存到csv文件。我注意到pandas to_csv和from_csv方法似乎无法处理特殊字符,例如\r,但也不会产生任何错误

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,但即使我为写入和读取指定encoding='utf-8',我也会得到相同的结果


如何编写一个健壮的csv读写脚本,使行/列不会损坏或发生其他意外情况?如果唯一的解决方案是在写入csv之前检查并“清理”每个字符串,那么最简单的方法是什么?

除非有人有更好的建议,否则我将按如下方式处理具体问题-在加载熊猫之前预处理每个csv文件。它似乎在我目前的系统上工作,但不相信它是傻瓜式的

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

预处理可能是最好的选择。但如果您正在查找其他内容,可以尝试在
read\u csv
中使用
lineterminator
参数:

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

(在linux上对我有效,但不能保证适用于其他平台。)

CSV是一种相当疯狂的格式,有很多方言。RFC4180试图对其进行定义。那里文本数据块内不允许回车(
\r
)。它是行(记录)delimeter的一部分。预处理后,您不需要将其写回文件。使用
StringIO(content)
作为文件句柄,例如:
df2=pd.read\u csv(StringIO(content),…)
。另外:python3在读取时似乎会自动将
\r
替换为
\n
。因此,您的
f.read().replace('\r','')
不起作用。在这种情况下,可以以二进制模式读取,然后将字节转换/解码为字符串。