Pandas to_csv вывод цитирования

У меня проблемы с получением правильной строки цитирования 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, это "вне текста"

Кто-нибудь знает, как сделать это правильно?

Ответ 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"

но по моему опыту лучше процитировать больше, а не меньше.

Ответ 2

Примечание. В настоящее время имеется небольшая ошибка в документации 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

Ответ 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 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

В отличие от записи 'foo.txt', напишите 'foo.csv'. Это решило проблему. Когда CSV файл читается в Excel, дополнительные кавычки отсутствуют.