【问题标题】:pandas to_csv output quoting issuepandas to_csv 输出引用问题
【发布时间】:2014-02-04 11:46:44
【问题描述】:

我无法正确获取 pandas dataframe.to_csv(...) 输出引用字符串。

import pandas as pd

text = 'this is "out text"'
df = pd.DataFrame(index=['1'],columns=['1','2'])
df.loc['1','1']=123
df.loc['1','2']=text
df.to_csv('foo.txt',index=False,header=False)

输出是:

123,"这是""输出文本"""

但我想:

123,这是“外文”

有谁知道如何解决这个问题?

【问题讨论】:

    标签: python file-io pandas


    【解决方案1】:

    你可以传递quoting=csv.QUOTE_NONE,例如:

    >>> df.to_csv('foo.txt',index=False,header=False)
    >>> !cat foo.txt
    123,"this is ""out text"""
    >>> import csv
    >>> df.to_csv('foo.txt',index=False,header=False, quoting=csv.QUOTE_NONE)
    >>> !cat foo.txt
    123,this is "out text"
    

    但根据我的经验,最好多引用,而不是少引用。

    【讨论】:

    • 我试过这个但得到“错误:需要转义,但没有设置转义字符”。我也尝试添加 escapechar='\\' 或 escapechar=None,但似乎不起作用...
    • @user3199761:这是因为您的真实数据(与您粘贴的示例不同)有一些您需要转义的内容,例如带有逗号的字符串。如果你输出a,"b,c",d你可以解析结果,但是如果你写出a,b,c,d是什么列?你说不出来。
    • 我确实使用上面相同的示例尝试了您的代码,但得到了错误。我正在使用 pandas 0.11.0 和 python 2.7.6,不确定这是否有帮助。
    • 那么这是否意味着为了禁用引用,您需要加载另一个库并在 pandas 函数中从中调用函数?
    • @user5359531: 不,这意味着您导入内置的csv 库只是为了获得csv.QUOTE_NONE 常量(恰好是数字3,但你不能保证那是永远都是真的)。​​
    【解决方案2】:

    注意:Pandas to_string documentation 目前存在一个小错误。它说:

    • quoting : int,控制是否应识别引号。值取自 csv.QUOTE_* 值。可接受的值为 0、1、2 和 3 代表 QUOTE_MINIMAL、QUOTE_ALL、QUOTE_NONE 和 QUOTE_NONNUMERIC,
      分别。

    但这与 csv 定义 QUOTE_NONE 和 QUOTE_NONNUMERIC 变量的方式相反。

    In [13]: import csv
    In [14]: csv.QUOTE_NONE
    Out[14]: 3
    

    【讨论】:

      【解决方案3】:

      要使用quoting=csv.QUOTE_NONE,您需要设置escapechar,例如

      # Create a tab-separated file with quotes
      $ echo abc$'\t'defg$'\t'$'"xyz"' > in.tsv
      $ cat in.tsv
      abc defg    "xyz"
      
      # Gotcha the quotes disappears in `"..."`
      $ python3
      >>> import pandas as pd
      >>> import csv
      >>> df = pd.read("in.tsv", sep="\t")
      >>> df = pd.read_csv("in.tsv", sep="\t")
      >>> df
      Empty DataFrame
      Columns: [abc, defg, xyz]
      Index: []
      
      
      # When reading in pandas, to read the `"..."` quotes,
      # you have to explicitly say there's no `quotechar`
      >>> df = pd.read_csv("in.tsv", sep="\t", quotechar='\0')
      >>> df
      Empty DataFrame
      Columns: [abc, defg, "xyz"]
      Index: []
      
      # To print out without the quotes.
      >> df.to_csv("out.tsv", , sep="\t", quoting=csv.QUOTE_NONE, quotechar="",  escapechar="\\")
      

      【讨论】:

        【解决方案4】:

        不使用转义符:

        逗号字符 , (Unicode:U+002C) 替换为 单个低 9 引号 字符 (Unicode: U+ 201A)

        在此之后,您可以简单地使用:

        import csv df.to_csv('foo.txt', index=False, header=False, quoting=csv.QUOTE_NONE)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-25
          • 2018-05-18
          • 1970-01-01
          • 2019-04-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多