【问题标题】:How to escape the escapechar in pandas to_csv如何在熊猫 to_csv 中转义转义字符
【发布时间】:2020-05-20 22:29:04
【问题描述】:

我正在尝试将数据帧写入 CSV。许多传入数据是用户生成的,可能包含特殊字符。我可以设置escapechar='\\'(例如),但是如果数据中有反斜杠,它会被写为"\",它被解释为转义的双引号,而不是包含反斜杠的字符串。如何转义 escapechar (即,我如何通过转义反斜杠来让 to_csv 写入 \\?)

示例代码:

import pandas as pd
import io, csv

data = [[1, "\\", "text"]] 
df = pd.DataFrame(data)

sIo = io.StringIO()
df.to_csv(
    sIo,
    index=False,
    sep=',',
    header=False,
    quoting=csv.QUOTE_MINIMAL,
    doublequote=False,
    escapechar='\\'
)
sioText = sIo.getvalue()
print(sioText)

实际输出:

1,"\",text

我需要什么:

1,"\\",text

创建约束的工程用例是,这将是一些用于将数据从一个系统移动到另一个系统的核心代码。我不会提前知道数据的格式,也不会对其进行太多控制(任何列都可以包含转义字符),并且我无法控制另一侧的转义字符,因此实际输出将是读为错误。因此,最初的问题是“你如何逃脱转义字符”。

作为参考,pandas 文档中此参数的定义为:

escapecharstr, default None
String of length 1. Character used to escape sep and quotechar when appropriate.

【问题讨论】:

  • 你能发一个minimal reproducible example你想要做什么吗?在给定输入的情况下,您希望输出到底是什么样的?
  • 很好,@MichaelDelgado。添加了一个您可以放入 jupyter 笔记本的内容,该笔记本应准确显示我得到的内容和想要的内容,以及存在限制的原因。
  • 谢谢!我在一段时间内收到的对这条线的最佳回应;)

标签: python pandas


【解决方案1】:

嗯。从 pandas 到 csv 的往返数据似乎是一个未解决的问题。请参阅本期:https://github.com/pandas-dev/pandas/issues/14122,尤其是熊猫创作者 Wes McKinney 的post

这种行为存在于 csv 模块 https://gist.github.com/wesm/7763d396ae25c9fd5b27588da27015e4 中。从第一原则看来,应该转义有问题的反斜杠。如果我手动将文件编辑为

"a"
"Hello! Please \"help\" me. I cannot quote a csv.\\"

然后 read_csv 返回原始输入

我摆弄了 R,但它似乎并没有做得更好

> df <- data.frame(a=c("Hello! Please \"help\" me. I cannot quote a csv.\\"))> write.table(df, sep=',', qmethod='e', row.names=F)
"a"
"Hello! Please \"help\" me. I cannot quote a csv.\"

CSV 不是高保真数据交换工具的另一个例子 =|

我和你一样困惑,这不起作用,但似乎官方立场是......df[col]=df[col].str.replace({"\\": "\\\\"})

【讨论】:

  • df=df.replace({"\\": "\\\\"}) 如果反斜杠是字符串中唯一的字符(在我的代码示例中),则效果很好。我选择了这个:for col in df.columns: if df[col].dtype == "object": df[col] = df[col].str.replace("\\", "\\\\")
  • 哦,伙计-对不起,是的,我太懒了!将更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 2016-01-17
  • 1970-01-01
  • 2018-05-16
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多