【问题标题】:Problems with special characters (\r) when writing and reading csv files写入和读取 csv 文件时的特殊字符 (\r) 问题
【发布时间】:2016-08-30 01:49:08
【问题描述】:

我正在使用 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 是一种相当狂野的格式,包含大量方言。 RFC 4180 试图定义它。那里。 TEXTDATA 块中不允许有回车符 (\r)。它是行(记录)分隔符的一部分。

标签: python pandas special-characters export-to-csv


【解决方案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

【讨论】:

  • 预处理后不需要写回文件。使用StringIO(content) 作为文件句柄,例如:df2 = pd.read_csv(StringIO(content), ...)
  • 另外:python3 在阅读时似乎会自动将\r 替换为\n。因此,您的 f.read().replace('\r',' ') 不起作用。在这种情况下,可能以二进制模式读取,然后将字节转换/解码为字符串。
【解决方案2】:

预处理可能是最好的选择。但是,如果您正在寻找其他东西,您可以尝试lineterminator 中的lineterminator 参数:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 2020-10-22
    • 2021-05-26
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多