我正在使用pandas加载由excel创建的csv文件,进行一些分析,然后将结果保存到csv文件中。我注意到pandas to_csv和from_csv方法似乎无法处理特殊字符,例如\ r \ n,但也不会引发任何错误。
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 :(得分:1)
除非有人有更好的建议,否则我将按照以下方式处理具体问题 - 在加载Pandas之前预先处理每个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
答案 1 :(得分:0)
预处理可能是最佳选择。但如果您正在寻找其他内容,可以在lineterminator
中尝试read_csv
参数:
df = pd.read_csv("my_df.csv", index_col=0, lineterminator='\n')
(在Linux上为我工作但不能保证其他平台。)