2012-02-19 15 views
5

Mam pliku CSV, który ma dane jak tenmoduł Pythona CSV - cytuje iść brakuje

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 

Czytam to i potem pisać różne wiersze do różnych plików CSV.

Jednak w oryginalnych danych znajdują się cudzysłowy wokół pól nienumerycznych, ponieważ niektóre z nich zawierają przecinki w polu.

Nie mogę zachować kwotowań.

Mam badane losy i odkryłem quoting=csv.QUOTE_NONNUMERIC, ale teraz to powoduje, że znak zapytania na każdym polu i nie wiem dlaczego?

Jeśli spróbuję jednej z innych opcji cytowania, takich jak MINIMAL, otrzymam komunikat o błędzie dotyczący wartości daty, 2008-01-09, która nie jest zmiennoprzecinkowa.

Próbowałem stworzyć dialekt, dodać cytat na czytniku i pisarzu CSV, ale nic, co próbowałem, nie doprowadziło do uzyskania dokładnego dopasowania do oryginalnych danych.

Każdy miał ten sam problem i znalazł rozwiązanie.

+2

Cytowanie w źródle jest niespójne na samym początku. –

+0

W źródle są cytaty tuż wokół nieliczbowych, jak opisałem.Jest to zgodne. – tjmgis

+0

Daty nie są numeryczne. I nic nie jest numeryczne po przeczytaniu. –

Odpowiedz

7

Podczas pisania quoting=csv.QUOTE_NONNUMERIC przechowuje wartości niecałkowite, o ile są one o numerach, tj. jeśli ich typ to int lub float (na przykład), co oznacza, że ​​napisze to, czego się spodziewasz.

Twój problem może być, że po przeczytaniu, o csv.reader zamieni każdy wiersz to brzmi w list z ciągów (jeśli przeczytać dokumentację na tyle dokładnie, zobaczysz czytelnik robi nie wykonać automatyczne dane Typ konwersji!

Jeśli nie wykonywać każdy rodzaj konwersji po przeczytaniu, wtedy kiedy piszesz będziesz skończyć ze wszystkim na cytaty ... bo wszystko piszesz jest ciągiem.

Edycja: oczywiście pola daty będą cytowane, ponieważ są to numery , a nie, co oznacza, że ​​nie można uzyskać dokładnie oczekiwanego zachowania przy użyciu standardu csv.writer.

0

Próba uzyskania "dokładnego dopasowania" oryginalnych danych jest trudnym i potencjalnie bezowocnym przedsięwzięciem. quoting=csv.QUOTE_NONNUMERIC umieszczaj cudzysłowy wokół wszystkiego, ponieważ każde pole jest łańcuchem, kiedy go czytasz.

Twoja obawa, że ​​niektóre z "cytowanych" pól wejściowych może zawierać przecinki, zwykle nie jest tak wielka. Jeśli dodałeś przecinek do jednego z cytowanych pól i użyłeś domyślnego programu piszącego, pole z przecinkiem będzie automatycznie cytowane w danych wyjściowych.

1

Czy na pewno masz problem? Opisane zachowanie jest poprawne: moduł csv będzie obejmował łańcuchy w cudzysłowach tylko wtedy, gdy jest to konieczne do prawidłowego analizowania. Tak więc powinieneś spodziewać się cytatów tylko wokół ciągów zawierających przecinek, znaki nowej linii itp. Jeśli nie otrzymujesz błędów z powrotem do odczytu, nie ma problemu.

Powiązane problemy