【问题标题】:Why does pandas writes the escapechar at this position in my CSV?为什么 pandas 在我的 CSV 中的这个位置写入 escapechar?
【发布时间】:2021-09-09 06:08:21
【问题描述】:

我有以下数据:

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 会在数据中插入转义字符?

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    "和,默认都是csv格式的特殊字符

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

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

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

    第一个sn-p

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

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

    第二次sn-p

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

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

    为了更清楚,您可以查看这些 sn-ps 的输出

    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 的区别

    希望对你的问题有所帮助

    【讨论】:

      【解决方案2】:

      这是你所期望的吗?

      print(df.to_csv(index=False, header=False, quoting=csv.QUOTE_NONE, sep= "@"))
      
      "TOTO TITI TATA,TAGADA"
      """TUTU,ROOT"""
      

      【讨论】:

        猜你喜欢
        • 2017-07-17
        • 2021-08-15
        • 1970-01-01
        • 2020-06-02
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多