Proszę Pythona o wydrukowanie minimalnej liczby z kolumny danych CSV, ale górny wiersz to numer kolumny i nie chcę, aby Python wziął pod uwagę górny wiersz. Jak mogę się upewnić, że Python ignoruje pierwszą linię?
To jest dotychczasowy kod:
import csv
with open('all16.csv', 'rb') as inf:
incsv = csv.reader(inf)
column = 1
datatype = float
data = (datatype(column) for row in incsv)
least_value = min(data)
print least_value
Czy mógłbyś również wyjaśnić, co robisz, a nie tylko podać kod? Jestem bardzo nowy w Pythonie i chciałbym się upewnić, że wszystko rozumiem.
1.0
dla każdej linii w pliku, a następnie pobiera minimum, które będzie1.0
?1.0
. :)datatype(row[column]
... jest to, co chyba próbuje osiągnąć OPOdpowiedzi:
Możesz użyć instancji klasy
csv
modułu,Sniffer
aby wydedukować format pliku CSV i wykryć, czy wiersz nagłówka jest obecny wraz z wbudowanąnext()
funkcją, aby pominąć pierwszy wiersz tylko wtedy, gdy jest to konieczne:Ponieważ w twoim przykładzie
datatype
icolumn
są zakodowane na stałe, nieco szybciej byłoby przetworzyć wrow
ten sposób:Uwaga: powyższy kod dotyczy Pythona 3.x. W przypadku Python 2.x użyj następującego wiersza, aby otworzyć plik zamiast tego, co jest pokazane:
źródło
has_header(file.read(1024))
warto pisaćhas_header(file.readline())
? Widzę to często, ale nie rozumiem, jakhas_reader()
można wykryć, czy istnieje nagłówek z pojedynczej linii pliku CSV ...Sniffer
prace. FWIW, którego nigdy nie widziałemhas_header(file.readline())
, a nawet gdyby działało przez większość czasu, byłbym bardzo podejrzliwy wobec tego podejścia z podanych powodów.file.read(1024)
generuje błędy w Pythona csv lib . Zobacz też na przykład tutaj .readline()
naread(1024)
. Do tej pory udało mi się znaleźć tylko osoby, które przeszły na readline, aby rozwiązać problem z csv.dialect.Aby pominąć pierwszą linię, po prostu zadzwoń:
Pliki w Pythonie są iteratorami po wierszach.
źródło
W podobnym przypadku musiałem pominąć irytujące wiersze przed wierszem z rzeczywistymi nazwami kolumn. To rozwiązanie działało ładnie. Przeczytaj najpierw plik, a następnie przekaż listę do
csv.DictReader
.źródło
data
słownik, ani ta odpowiedź tak naprawdę nie dodaje niczego ponad zaakceptowany.data = dict()
i wypełniać to, ale jest to nieefektywne i nie idiomatyczne. Ponadto należy używać literałów dict ({}
), aenumerate
nawet wtedy.@Veedrac
jeśli chcesz mieć pewność, że otrzymałem powiadomienie, chociaż Stack Overflow wydaje się być w stanie odgadnąć na podstawie nazwy użytkownika. (Nie piszę,@Maarten
ponieważ osoba odpowiadająca zostanie powiadomiona domyślnie.)Zapożyczony z książki kucharskiej Pythona ,
bardziej zwięzły kod szablonu może wyglądać następująco:
źródło
Normalnie użyłbyś,
next(incsv)
który przesuwa iterator o jeden wiersz do przodu, więc pomijasz nagłówek. Drugi (powiedzmy, że chcesz pominąć 30 wierszy) to:źródło
użyj csv.DictReader zamiast csv.Reader. Jeśli parametr fieldnames zostanie pominięty, wartości w pierwszym wierszu pliku csv zostaną użyte jako nazwy pól. wtedy możesz uzyskać dostęp do wartości pól za pomocą wiersza ["1"] itp
źródło
Nowy pakiet „pandy” może być bardziej odpowiedni niż „csv”. Poniższy kod odczyta plik CSV, domyślnie interpretując pierwszą linię jako nagłówek kolumny i znajdując minimum między kolumnami.
źródło
pd.read_csv('all16.csv').min()
Cóż, moja mini biblioteka z opakowaniami również się nada.
W międzyczasie, jeśli wiesz, jaki jest indeks kolumny nagłówka, na przykład „Kolumna 1”, możesz zamiast tego zrobić to:
źródło
Dla mnie najłatwiejszym sposobem jest użycie zasięgu.
źródło
Ponieważ jest to związane z czymś, co robiłem, podzielę się tutaj.
Co jeśli nie jesteśmy pewni, czy istnieje nagłówek, a Ty też nie masz ochoty importować sniffera i innych rzeczy?
Jeśli twoje zadanie jest podstawowe, takie jak drukowanie lub dołączanie do listy lub tablicy, możesz po prostu użyć instrukcji if:
źródło
Dokumentacji modułu Python 3 CSV zapewnia ten przykład:
Sniffer
Spróbuje auto-wykrywanie wielu rzeczy o pliku CSV. Musisz jawnie wywołać jegohas_header()
metodę, aby określić, czy plik ma wiersz nagłówka. Jeśli tak, pomiń pierwszy wiersz podczas iteracji wierszy CSV. Możesz to zrobić w ten sposób:źródło
Użyłbym taila, aby pozbyć się niechcianej pierwszej linii:
źródło
po prostu dodaj [1:]
przykład poniżej:
to działa dla mnie w iPythonie
źródło
Python 3.X
Obsługuje UTF8 BOM + HEADER
To było dość frustrujące, że
csv
moduł nie mógł łatwo uzyskać nagłówka, jest też błąd w BOM UTF-8 (pierwszy znak w pliku). To działa dla mnie używając tylkocsv
modułu:źródło
Przekonwertowałbym csvreader na listę, a następnie wrzuciłbym pierwszy element
źródło
Python 2.x
csvreader.next()
Python 3.x
csvreader.__next__()
źródło