python - 为什么 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 会在数据中插入转义字符?
解决方案
"
并且,
都是 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 仍然是一样的,但是为了转义它们,@
为了清楚起见,我们将其更改为,这次你可以看到quotechar
和escapechar
我希望这对您的问题有所帮助
推荐阅读
- java - 启用插件 v1.0 时出错(它是最新的吗?)
- javascript - 为某些链接添加类属性
- python - 没有名为 google.cloud 的模块
- r - 在绘图矩阵中按列显示面板背景颜色,ggplot2
- javascript - 在 PHP 和 Bootstrap 中带有缩略图导航的动态引导轮播
- java - Java Libgdx 如何更改地图
- python - 存储在同一个变量中的多个 DataFrame 的联合
- php - 从 WooCommerce 生成的产品帖子类型中删除 post_content
- javascript - 表单提交值给出 null - mongoose 和 express js
- flutter - Flutter:HTTP Get在null上调用了getter'length'