Spowoduje to odczytanie całego pliku na raz, więc jest to praktyczne tylko wtedy, gdy czytasz dość mały plik.
Hayden Schiff,
1
Aby uogólnić zadanie odczytu wielu linii nagłówka i poprawić czytelność, użyłbym metody ekstrakcji. Załóżmy, że chcesz tokenizować trzy pierwsze wiersze w coordinates.txtcelu użycia jako informacji nagłówka.
Przykład
coordinates.txt
---------------Name,Longitude,Latitude,Elevation,CommentsString,DecimalDeg.,DecimalDeg.,Meters,StringEuler's Town,7.58857,47.559537,0, "Blah"
Faneuil Hall,-71.054773,42.360217,0
Yellowstone National Park,-110.588455,44.427963,0
Następnie wyodrębnianie metody pozwala określić, co chcesz zrobić z informacjami nagłówka (w tym przykładzie po prostu tokenizujemy linie nagłówka na podstawie przecinka i zwracamy go jako listę, ale jest miejsce na wiele więcej).
def __readheader(filehandle, numberheaderlines=1):"""Reads the specified number of lines and returns the comma-delimited
strings on each line as a list"""for _ in range(numberheaderlines):yield map(str.strip, filehandle.readline().strip().split(','))with open('coordinates.txt','r')as rh:# Single header line#print next(__readheader(rh))# Multiple header linesfor headerline in __readheader(rh, numberheaderlines=2):print headerline # Or do other stuff with headerline tokens
Jeśli coordinates.txtzawiera inny nagłówek, po prostu zmień numberheaderlines. Co najlepsze, jasne __readheader(rh, numberheaderlines=2)jest, co się dzieje, i unikamy dwuznaczności, że musimy wymyślić lub skomentować, dlaczego autor akceptowanej odpowiedzi używa next()w swoim kodzie.
# Open a connection to the filewith open('world_dev_ind.csv')as file:# Skip the column names
file.readline()# Initialize an empty dictionary: counts_dict
counts_dict ={}# Process only the first 1000 rowsfor j in range(0,1000):# Split the current line into a list: line
line = file.readline().split(',')# Get the value for the first column: first_col
first_col = line[0]# If the column value is in the dict, increment its valueif first_col in counts_dict.keys():
counts_dict[first_col]+=1# Else, add to the dict and set value to 1else:
counts_dict[first_col]=1# Print the resulting dictionaryprint(counts_dict)
next(f)
używaćf.readline()
i przechowywać jako zmiennąheader_line = next(f)
.źródło
['a', 'b', 'c'][1:]
=>['b', 'c']
consume()
z używaniem z,more-itertools
jak stwierdzono w docs.python.org/3/library/itertools.html#itertools-recipes ? Słyszałem o tym na stackoverflow.com/questions/11113803Jeśli potrzebujesz pierwszej linii, a następnie chcesz wykonać operację na pliku, ten kod będzie pomocny.
źródło
Jeśli krojenie może działać na iteratorach ...
źródło
źródło
Aby uogólnić zadanie odczytu wielu linii nagłówka i poprawić czytelność, użyłbym metody ekstrakcji. Załóżmy, że chcesz tokenizować trzy pierwsze wiersze w
coordinates.txt
celu użycia jako informacji nagłówka.Przykład
Następnie wyodrębnianie metody pozwala określić, co chcesz zrobić z informacjami nagłówka (w tym przykładzie po prostu tokenizujemy linie nagłówka na podstawie przecinka i zwracamy go jako listę, ale jest miejsce na wiele więcej).
Wynik
Jeśli
coordinates.txt
zawiera inny nagłówek, po prostu zmieńnumberheaderlines
. Co najlepsze, jasne__readheader(rh, numberheaderlines=2)
jest, co się dzieje, i unikamy dwuznaczności, że musimy wymyślić lub skomentować, dlaczego autor akceptowanej odpowiedzi używanext()
w swoim kodzie.źródło
Jeśli chcesz odczytać wiele plików CSV, zaczynając od linii 2, działa to jak urok
(jest to część odpowiedzi Parfait na inne pytanie)
źródło
źródło