Próbuję odczytać wiersze pliku tekstowego na liście lub tablicy w Pythonie. Muszę tylko mieć indywidualny dostęp do dowolnego elementu listy lub tablicy po jej utworzeniu.
Plik tekstowy ma następujący format:
0,0,200,0,53,1,0,255,...,0.
Tam, gdzie ...
jest powyżej, rzeczywisty plik tekstowy zawiera setki lub tysiące innych elementów.
Używam następującego kodu, aby spróbować wczytać plik do listy:
text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()
Wynik, który otrzymuję, to:
['0,0,200,0,53,1,0,255,...,0.']
1
Najwyraźniej jest to wczytywanie całego pliku do listy tylko jednej pozycji, a nie do listy pojedynczych pozycji. Co ja robię źle?
Odpowiedzi:
Będziesz musiał podzielić swój ciąg na listę wartości za pomocą
split()
Więc,
źródło
.csv
plik (jak wspomniano przez PO), na przykład, plik zawierający znaki alfabetu 3 po wierszu (a,b,c
,d,e,f
itp) i zastosować procedurę opisaną powyżej, co masz to taka lista:['a', 'b', 'c\nd', 'e', ... ]
(zwróć uwagę na tę pozycję'c\nd'
). Chciałbym dodać, że powyższy problem nie jest skręcany, ta procedura zwija dane z poszczególnych wierszy w jedną mega-listę, zwykle nie jest to to, czego chcę, gdy przetwarzam plik danych zorientowanych na rekord.csv
modułu lub innego istniejącego parseraMożesz także użyć numpy loadtxt jak
źródło
dtype : data-type
parametru. docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html Pandas read_csv jest bardzo łatwy w użyciu. Ale nie widziałem sposobu, aby określić jego format. Czytał elementy typu float z mojego pliku, podczas gdy ja potrzebowałem łańcucha. Dzięki @Thiru za pokazanie loadtxt.Więc chcesz stworzyć listę list ... Musimy zacząć od pustej listy
następnie czytamy zawartość pliku, wiersz po wierszu
Typowym przypadkiem użycia są dane kolumnowe, ale nasze jednostki pamięci to wiersze pliku, które przeczytaliśmy jeden po drugim, więc możesz chcieć przetransponować listę list. Można to zrobić za pomocą następującego idiomu
Innym powszechnym zastosowaniem jest nadanie nazwy każdej kolumnie
aby można było operować na jednorodnych elementach danych
Większość tego, co napisałem, można przyspieszyć za pomocą
csv
modułu, z biblioteki standardowej. Innym zewnętrznym modułem jestpandas
, który pozwala zautomatyzować większość aspektów typowej analizy danych (ale ma wiele zależności).Aktualizacja Podczas gdy w Pythonie 2
zip(*list_of_lists)
zwraca inną (transponowaną) listę list, w Pythonie 3 sytuacja uległa zmianie izip(*list_of_lists)
zwraca obiekt zip, który nie jest indeksowany.Jeśli potrzebujesz dostępu indeksowanego, możesz użyć
to daje listę list w obu wersjach Pythona.
Z drugiej strony, jeśli nie potrzebujesz dostępu do indeksów, a chcesz tylko zbudować słownik indeksowany według nazw kolumn, obiekt zip jest w porządku ...
źródło
csv
modułu ...To pytanie dotyczy tego, jak odczytać zawartość wartości oddzielonych przecinkami z pliku na listę iterowalną:
0,0,200,0,53,1,0,255,...,0.
Najłatwiej to zrobić za pomocą
csv
modułu w następujący sposób:Teraz możesz łatwo iterować w
spamreader
ten sposób:Więcej przykładów można znaleźć w dokumentacji .
źródło