2012-10-18 21 views
16

Próbując odczytać kodu źródłowego pliku csv.py (jako przewodnik do wdrażania własną writer klasę w innym kontekście) Okazało się, że znaczna część funkcjonalności w tym pliku jest z kolei importowane z czymś o nazwie _csv:Co to jest "_csv" w języku Python?

from _csv import Error, __version__, writer, reader, register_dialect, \ 
        unregister_dialect, get_dialect, list_dialects, \ 
        field_size_limit, \ 
        QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, \ 
        __doc__ 

Nie mogę znaleźć żadnego pliku o tej nazwie w moim systemie (w tym wyszukiwanie plików z zestawem atrybutów ukrytych), chociaż mogę zrobić import _csv z powłoki Pythona.

Co to jest moduł i czy można go przeczytać?

Odpowiedz

16

_csv to C "kręgosłup" modułu csv. Jego źródłem jest Modules/_csv.c. Można znaleźć skompilowaną wersję tego modułu z wiersza polecenia z Python:

>>> import _csv 
>>> _csv 
<module '_csv' from '/usr/lib/python2.6/lib-dynload/_csv.so'> 

Nie ma żadnych ukrytych plików w kodzie źródłowym Pythona :)

+0

Co ważniejsze, według [Jython docs] (http://www.jython.org/javadoc/org/python/modules/_csv/_csv.html), nigdy nie powinno się do niego bezpośrednio odwoływać. Właśnie dlatego csv.py importuje swoją funkcjonalność. – KBKarma

+0

Dziękuję. To wyjaśnia również, dlaczego nie mogę znaleźć żadnego odniesienia do klasy Writera - "klasa" jest zaimplementowana w C. –

+0

Hmm. Zakładam, że moduły są częścią dystrybucji źródłowej Pythona i że wynikowy kod obiektowy jest połączony z plikiem wykonywalnym Pythona? Nie mam ani podkatalogu Module, ani bardzo dużo kodu C w moim katalogu Python27 (tylko kilka plików w pakietach site). –

14

nie zgodzić się z larsmans odpowiedź.

Urzędowe wyjaśnienie modułu konwencją nazewnictwa w PEP8:

Gdy moduł rozszerzający napisany w C lub C++ ma towarzyszący moduł Pythona, który zapewnia wyższy poziom (np bardziej zorientowany obiektowo) interfejsu, moduł C/C++ ma wiodący znak podkreślenia (np. _socket)

+1

+1, nie wiedziałem, że był w PEP8 (chociaż używałem konwencji dla moich własnych rozszerzeń C). –

0

Odpowiedź została już zaakceptowana, ale chciałem dodać kilka szczegółów, ponieważ miałem to samo pytanie co OP.

zawartość pliku .csv jest tylko dokument z oddzielonych przecinkami wartości:

first,last 
john,doe 
... 

Można to sprawdzić poprzez otwarcie pliku .csv w Notatniku

Jeśli chcesz utworzyć .csv plik można zapisać do niego, a otrzymasz plik csv, który chcesz.

with open('test.csv', 'w') as file: 
    file.write('first,last\n') 
    file.write('John,Doe\n') 

Proste rozwiązanie, jeśli chcesz pisać do pliku .csv bez użycia "import csv".

+0

Nie jest to związane z pytaniem, które dotyczy konkretnego wbudowanego modułu w Pythonie, a nie w żaden sposób co do zawartości pliku z rozszerzeniem "csv1". Jest także co najmniej całkowicie niekompletny, ponieważ nie omawia kwestii osadzonych przecinków i cytowań, które są kluczowe dla przetwarzania CSV. –

+0

@LarryLustig Masz rację, zadajesz pytanie, a moja odpowiedź nie odpowiada na zadane pytanie. Ale czytając pytanie, ogólnym celem było napisanie własnego "pisarza". Natknąłem się na ten wątek, ponieważ szukałem tego samego, a potem uświadomiłem sobie, jak łatwo jest je zrealizować. Opublikowaliśmy ten przykład dla każdego, kto znajdzie ten wątek. Podaję też bardzo prosty przykład i nie ma problemu z osadzaniem przecinków tak jak ja; to nie ma znaczenia. – Discoveringmypath