Pandas to_csv输出引号问题

85

我在使用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,"this is ""out text"""

但我想要的是:

 

123,this is "out text"

有人知道如何做到这一点吗?

5个回答

128
你可以传递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"

但在我的经验中,引用更多比引用更少要好。


13
我尝试过这样做,但出现了“错误:需要转义字符,但没有设置转义字符”的提示。 我还尝试了添加escapechar='\'或escapechar=None,但似乎没有起作用... - user3199761
7
这是因为你的真实数据与你所复制的示例不同,它可能包含需要转义的内容,比如一个带有逗号的字符串。如果你输出 a,"b,c",d ,你可以解析这个结果,但是如果你输出 a,b,c,d,那么每一列分别是什么就无法确定了。 - DSM
我尝试使用您提供的代码和上述示例,但是出现了错误。我正在使用pandas 0.11.0和python 2.7.6,不确定这是否有帮助。 - user3199761
1
这是否意味着为了禁用引用,需要在 pandas 函数内加载另一个库并调用其中的函数? - user5359531
2
@user5359531:不,这意味着您导入内置的 csv 库只是为了获取 csv.QUOTE_NONE 常量(它恰好是数字3,但您无法保证这始终是正确的)。 - DSM
显示剩余5条评论

35
注意:目前Pandas to_string文档中存在一个小错误。它说:
  • 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

32
为了使用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

不使用转义字符的方法:

在您的df中,将逗号字符,(Unicode:U+002C)替换为一个单低9引号字符 (Unicode:U+201A)

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

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


0
如果您不想繁琐地导入csv,您可以使用以下代码行: df.to_csv('foo.txt',index=False,header=False,quoting=3,sep=",",escapechar=",")

错误需要转义,但未设置转义字符。 - Dmitrij Holkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接