首页 > 解决方案 > 为什么 pandas 在我的 CSV 中的这个位置写入 escapechar?

问题描述

我有以下数据:

data_list = ["\"TOTO TITI TATA,TAGADA\"", "\"\"\"TUTU,ROOT\"\"\""]

它被转换成一个熊猫数据框:

df = pandas.DataFrame(data_list)
print(df)

                         0
0  "TOTO TITI TATA,TAGADA"
1          """TUTU,ROOT""

将数据帧写入 csv 时,没有任何引用配置,我得到以下结果:

with open("test_quote_normal", "w") as w:
    df.to_csv(w, index=False, header=False)

-> 结果输出

"""TOTO TITI TATA,TAGADA"""

"""""""TUTU,ROOT"""""""

每个报价都被引用了,这不是我想要的。

所以我试图通过以下配置来防止这种情况:

with open("test_quote_none", "w") as w:
    df.to_csv(w, index=False, header=False,
              quoting=csv.QUOTE_NONE, escapechar=',')

-> 结果输出

"TOTO TITI TATA,,TAGADA"

"""TUTU,,ROOT"""

引号是正确的,但由于我不明白的原因,转义字符已插入数据本身。

指定 sep 值无效:

with open("test_quote_none", "w") as w:
    df.to_csv(w, index=False, header=False,
              quoting=csv.QUOTE_NONE, escapechar=',', sep= ",")

为什么 pandas 会在数据中插入转义字符?

标签: pythonpandascsv

解决方案


"并且,都是 csv 格式的特殊字符

",在数据之间存在时使用。那个时候数据被引号转义,告诉它应该是一个单一的数据。

而,,是用于区分数据的默认分隔符。

由于您在数据中同时使用它们,这就是为什么您很难调试它

第一个片段

with open("test_quote_normal", "w") as w:
    df.to_csv(w, index=False, header=False)

如果数据仍然有",根据 csv 约定,它也应该被转义,这"在你的第一个场景中导致了多个

第二个片段

with open("test_quote_none", "w") as w:
    df.to_csv(w, index=False, header=False,
              quoting=csv.QUOTE_NONE, escapechar=',')

使用该quoting参数,您是在告诉您不要缩进引号以保护,字符。因此,,您的数据内部被视为分隔符,导致转义字符出现在它们之间

为了更清楚,您可以查看这些片段的输出

with open("temp.csv", "w") as w:
    ...:     df.to_csv(w, index=False, header=False, quotechar='@')

输出

@"TOTO TITI TATA,TAGADA"@
@"""TUTU,ROOT"""@

在此,我们将 更改quotechar@,这就是为什么这次不是"用于保护,而是用于在其中转义数据,@,

with open("temp.csv", "w") as w:
    ...:     df.to_csv(w, index=False, header=False, escapechar='@', doublequote=False)

输出

"@"TOTO TITI TATA,TAGADA@""
"@"@"@"TUTU,ROOT@"@"@""

在这里,quotechar 仍然是一样的,但是为了转义它们,@为了清楚起见,我们将其更改为,这次你可以看到quotecharescapechar

我希望这对您的问题有所帮助


推荐阅读