web-dev-qa-db-fra.com

pandas to_csv sortie citant problème

J'ai du mal à obtenir la sortie pandas dataframe.to_csv(...) en citant correctement les chaînes.

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)

La sortie est:

123, "c'est" "hors texte" ""

Mais je voudrais:

123, c'est "hors texte"

Est-ce que quelqu'un sait comment faire les choses correctement?

32
user3199761

Vous pourriez passer quoting=csv.QUOTE_NONE, par exemple:

>>> 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"

mais d'après mon expérience, il vaut mieux citer plus que moins.

48
DSM

Remarque: il y a actuellement une petite erreur dans le Pandas documentation to_string . Il dit:

  • quoting: int, contrôle si les citations doivent être reconnues. Les valeurs sont extraites des valeurs csv.QUOTE_ *. Les valeurs acceptables sont 0, 1, 2 et 3 pour QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONE et QUOTE_NONNUMERIC,
    respectivement.

Mais cela inverse la façon dont csv définit les variables QUOTE_NONE et QUOTE_NONNUMERIC.

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

Utiliser quoting=csv.QUOTE_NONE, vous devez définir le escapechar, par exemple.

# 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="\\")
8
alvas