Pytałeś o wyjaśnienia, ale niektóre z tych zjawisk są niewytłumaczalne bez twojej pomocy.
(A) Łańcuchy w plikach XLS utworzone w programie Excel 97 są kodowane w języku łacińskim1, jeśli to możliwe, w przeciwnym razie w UTF16LE. Każdy ciąg nosi flagę informującą, który był używany. Wcześniej Wyróżnia zakodowane ciągi zgodnie z "stroną kodową" użytkownika. W każdym przypadku, xlrd generuje obiekty Unicode. Kodowanie plików jest interesujące tylko wtedy, gdy plik XLS został utworzony przez oprogramowanie innej firmy, które albo pomija stronę kodową, albo kłamie na jej temat. Zobacz sekcję Unicode z przodu dokumentów xlrd.
(B) Niewyjaśnione zjawiska:
ten kod:
bcw = csv.writer(bc,csv.excel,b.encoding)
powoduje następujący błąd z Pythona 2.5, 2.6 i 3.1: TypeError: expected at most 2 arguments, got 3
- to o co ja się spodziewać biorąc pod uwagę docs na csv.writer; spodziewa się obiektu filelike, a następnie (1) nic (2) dialekt lub (3) jeden lub więcej parametrów formatowania. Dałeś mu dialekt, a csv.writer nie ma argumentu kodowania, więc splat. Jakiej wersji Pythona używasz? A może nie skopiowałeś/wkleiłeś skryptu, który faktycznie uruchomiłeś?
(C) Niewyjaśnione zjawiska wokół traceback i co rzeczywiste dane wykraczająca było:
"the_script.py", line 40, in <module>
this_row.append(str(s.cell_value(row,col)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xed' in position 5: ordinal not in range(128)
Po pierwsze, istnieje str() w wierszu szkodliwego kodu, który nie był w uproszczonego scenariusza - prawda nie kopiować/wklejać skryptu, który faktycznie uruchomiłeś? W żadnym wypadku nie powinieneś używać polecenia str w ogóle - nie uzyskasz pełnej precyzji na twoich spławikach; po prostu pozwól, aby moduł CSV je skonwertował.
DRUGI, mówisz "" "Wydaje się, że wartość się odwiesza to" 516-777316 "- tekst w oryginalnym arkuszu Excela to" 516-7773167 "(z 7 na końcu) "" "- trudno sobie wyobrazić, jak 7 znika z końca. Chciałbym użyć coś takiego, aby dowiedzieć się dokładnie, co dane było problematyczne:
try:
str_value = str(s.cell_value(row, col))
except:
print "row=%d col=%d cell_value=%r" % (row, col, s.cell_value(row, col))
raise
Że% R pozwala uniknąć wpisywania cell_value=%s ... repr(s.cell_value(row, col))
... The repr() daje jednoznaczną reprezentację danych. Naucz się tego. Użyj tego.
Jak dojechałeś do "516-777316"?
Po trzecie, komunikat o błędzie faktycznie narzeka na znak Unicode u '\ xed' w odsunięciu 5 (tj. Szósty znak). U + 00ED to ŁACIŃSKI MAŁY LIST I I OŚWIADCZENIE, a nie ma nic takiego w "516-7773167"
FOURTHY, lokalizacja błędu wydaje się być ruchomym celem - powiedziałeś w komentarzu do jednego z solutions: "Błąd dotyczący pliku bcw.writerow." Huh?
(D) Dlaczego otrzymałeś ten komunikat o błędzie (przy pomocy str()): str(a_unicode_object)
próbuje przekonwertować obiekt unicode na obiekt str, a przy braku jakichkolwiek informacji o kodowaniu używa ascii, ale masz dane inne niż ASCII, więc splat. Zauważ, że twój obiekt tworzy plik CSV zakodowany w utf8, ale twój uproszczony skrypt nie wspomina o utf8 w żadnym miejscu.
(E) "" "s.cell (row, col)) (egscell zamiast
s.cell_value)
cały dokument zapisuje bezbłędnie, wyjście nie jest szczególnie pożądane (tekst: u'516-7773167 „)«»”
tak się dzieje, ponieważ pisarz CSV jest wywołanie metody swojego obiektu komórki __str__
, a to wywołuje <type>:<repr(value)>
, które mogą być przydatne do debugowania, ale jak nie powiedzieć tak wielka w pliku csv.
(F) Rozwiązanie Alexa Martellego jest wspaniałe pod tym względem, że powinno się je wykonywać, ale powinieneś przeczytać rozdział dotyczący klasy Cell w dokumentach xlrd: typy komórek to tekst, liczba, boolean, data, błąd, pusty i pusty. Siema masz daty, będziesz chciał je sformatować jako daty, a nie numery, więc nie możesz używać isinstance() (i możesz nie chcieć tak nazywać się wywołaniem funkcji) ... to jest atrybut Cell.ctype
i Sheet.cell_type()
i Sheet.row_types()
metody są dla.
(G) UTF8 nie jest w standardzie Unicode. UTF16LE to nie Unicode. UTF16 to nie Unicode ... a pomysł, że poszczególne struny marnowałyby 2 bajty każdego na BOM UTF16, jest zbyt niedorzeczny, by nawet MS mógł kontemplować :-)
(H) Dalsze czytanie (oprócz dokumentów xlrd):
http://www.joelonsoftware.com/articles/Unicode.html
http://www.amk.ca/python/howto/unicode
Byłoby przydatne, aby zobaczyć cały traceback, aby wiedzieć, kto rzuca błąd. – Christopher
Niewiele więcej do zobaczenia: Plik "the_script.py ", wiersz 40, w this_row.append (str (s.cell_value (row, col))) UnicodeEncodeError: kodek 'ascii' nie może kodować znaków u '\ xed' w pozycji 5: porządkowy nie w zakresie (128) –
anschauung
"Wyjście z Excela w Unicode" wydaje się oznaczać "wyjście z Excela w UTF-16". Unicode definiuje przestrzeń kodowania, która jest reprezentowana przez różne systemy kodowania, takie jak UTF-8 lub UTF-16. – Svante