Модуль Python CSV — кавычки пропадают

У меня есть файл CSV с такими данными

15,"I",2,41301888,"BYRNESS RAW","","BYRNESS VILLAGE","NORTHUMBERLAND","ENG"
11,"I",3,41350101,2,2935,2,2008-01-09,1,8,0,2003-02-01,,2009-12-22,2003-02-11,377016.00,601912.00,377105.00,602354.00,10

Я читаю это, а затем пишу разные строки в разные файлы CSV.

Однако в исходных данных нечисловые поля заключены в кавычки, так как некоторые из них содержат запятые внутри поля.

Я не могу сохранить цитаты.

Я много исследовал и обнаружил quoting=csv.QUOTE_NONNUMERIC, однако теперь это приводит к кавычкам вокруг каждого поля, и я не знаю, почему ??

Если я попробую один из других вариантов цитирования, таких как MINIMAL, я получу сообщение об ошибке, касающееся значения даты, 2008-01-09, которое не является плавающим числом.

Я попытался создать диалект, добавить цитирование в программу чтения и записи csv, но ничего из того, что я пробовал, не приводит к точному совпадению с исходными данными.

У кого была такая же проблема, нашел решение.


person tjmgis    schedule 19.02.2012    source источник
comment
Цитата в источнике несовместима с самого начала.   -  person Ignacio Vazquez-Abrams    schedule 20.02.2012
comment
В исходнике есть кавычки как раз вокруг нечисловых, как я описал. Это последовательно   -  person tjmgis    schedule 20.02.2012
comment
Даты не числовые. И ничто не является числовым, когда вы его читаете.   -  person Ignacio Vazquez-Abrams    schedule 20.02.2012


Ответы (3)


При записи quoting=csv.QUOTE_NONNUMERIC сохраняет значения без кавычек, пока они числа, т.е. если их тип int или float (например), значит будет писать то, что вы ожидаете.

Ваша проблема может заключаться в том, что при чтении csv.reader будет превращать каждую прочитанную строку в list строк (если вы достаточно внимательно прочитаете документацию, вы увидите, что читатель не< /em> выполнить автоматическое преобразование типов данных!

Если вы не выполняете никакого преобразования после чтения, то когда вы пишете, вы в конечном итоге будете заключать все в кавычки... потому что все, что вы пишете, является строкой.

Редактировать: конечно, поля даты будут заключены в кавычки, потому что они не числа, а это означает, что вы не можете получить точное ожидаемое поведение, используя стандартный csv.writer.

person Ricardo Cárdenes    schedule 19.02.2012

Вы уверены, что у вас есть проблема? Описанное вами поведение является правильным: модуль csv будет заключать строки в кавычки только если это необходимо для их правильного анализа. Таким образом, вы должны ожидать увидеть кавычки только вокруг строк, содержащих запятую, символы новой строки и т. д. Если вы не получаете ошибок при считывании вывода, проблем нет.

person alexis    schedule 20.02.2012

Попытка получить «точное совпадение» с исходными данными — трудная и потенциально бесплодная попытка. quoting=csv.QUOTE_NONNUMERIC заключайте все в кавычки, потому что каждое поле представляло собой строку, когда вы ее читали.

Ваша обеспокоенность тем, что некоторые из «цитируемых» полей ввода могут содержать запятые, обычно не так уж важна. Если вы добавили запятую в одно из полей в кавычках и использовали средство записи по умолчанию, поле с запятой будет автоматически заключено в кавычки на выходе.

person Phil Cooper    schedule 19.02.2012