CSV-файлы бывают разных диалектов. В своей простейшей форме они представляют собой просто список строк, разделенных разделителем. В этом случае вы используете вкладку.
Проблемы начинаются, когда вы хотите значение, которое содержит разделитель; тогда вы должны каким-то образом покинуть вкладку, чтобы парсер не рассматривал ее как таковую. Один из способов сделать это - заключить в кавычки все поле.
Но теперь, как вы включаете кавычку в значение поля? По умолчанию вы заключаете в кавычки поле и экранируете буквальные кавычки, удваивая их.
Таким образом, "001"
становится """001"""
, потому что значение "001"
должно быть заключено в кавычки, и каждый литерал "
получает заменено на ""
. Парсер (использующий этот диалект по умолчанию) увидит "..."
и лишит большинство внешних кавычек, а затем заменит каждую оставшуюся пару кавычек одинарной кавычкой, чтобы получить "001"
обратно из """001"""
.
Существует несколько способов отключить цитирование двойных кавычек, и какой из них вам может понадобиться, зависит от того, какой тип данных вы используете. Один простой способ - просто установить аргумент quotechar
на None
при создании средства записи CSV.
tsv = csv.writer(fout, delimiter="\t", quotechar=None)
См. Диалекты и параметры форматирования для получения дополнительной информации о том, как именно данные заключенный в кавычки и / или экранированный в файле CSV.
Демонстрация:
>>> f = csv.writer(sys.stdout, delimiter="\t")
>>> f.writerow(["001", 3])
001 3
7
>>> f.writerow(['"001"', 3])
"""001""" 3
13
>>> f = csv.writer(sys.stdout, delimiter="\t", quotechar=None)
>>> f.writerow(["001", 3])
001 3
7
>>> f.writerow(['"001"', 3])
"001" 3
9
(Каждый вызов f.writerow
показывает данные, записанные в стандартный вывод, с последующим их возвратом значение.)