Python 熊猫到csv输出报价问题

Python 熊猫到csv输出报价问题,python,file-io,pandas,Python,File Io,Pandas,我无法将pandasdataframe.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,“这是“输出文本” 但我想: 1

我无法将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,这是“外文本”


有人知道怎么做吗

您可以传递
quoting=csv.QUOTE\u 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"

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

注意:目前熊猫中有一个小错误。它说:

  • quoting:int,控制是否应识别引号。值取自csv.QUOTE_*值。可接受的值为0、1、2和3 3对于最小报价、全部报价、无报价和非数字报价,
    分别
但这与csv定义QUOTE_NONE和QUOTE_非数值变量的方式相反

In [13]: import csv
In [14]: csv.QUOTE_NONE
Out[14]: 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="\\")

不带escapechar使用:

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

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

导入csv

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

我尝试了这个方法,但得到了“错误:需要转义,但没有转义设置”。我还试图添加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,但你不能保证它总是正确的)。