2013-08-26 12 views
10

Jestem nowym użytkownikiem Pythona.Zaimportuj plik txt i każdy wiersz jako listę.

mam pliku txt, że będzie coś takiego:

3,1,3,2,3 
3,2,2,3,2 
2,1,3,3,2,2 
1,2,2,3,3,1 
3,2,1,2,2,3 

ale może być mniej lub więcej linii.

Chcę zaimportować każdy wiersz jako listę.

Wiem, że można to zrobić w następujący sposób:

filename = 'MyFile.txt' 
fin=open(filename,'r') 
L1list = fin.readline() 
L2list = fin.readline() 
L3list = fin.readline() 

ale ponieważ nie wiem ile będę mieć linie, czy jest inny sposób na tworzenie indywidualnych list?

Odpowiedz

22

Nie twórz oddzielnych list; utworzyć listę list:

results = [] 
with open('inputfile.txt') as inputfile: 
    for line in inputfile: 
     results.append(line.strip().split(',')) 

albo jeszcze lepiej, użyj csv module:

import csv 

results = [] 
with open('inputfile.txt', newline='') as inputfile: 
    for row in csv.reader(inputfile): 
     results.append(row) 

listy lub słowniki są daleko superiour struktury śledzenie dowolnej liczby rzeczy odczytu z pliku .

Należy pamiętać, że każda z pętli umożliwia indywidualne adresowanie wierszy danych bez konieczności odczytywania całej zawartości pliku do pamięci; zamiast używać results.append() wystarczy przetworzyć tamtą linię.

Właśnie przez wzgląd na kompletność, oto jedna wkładka kompaktowa wersja do odczytu w pliku CSV do listy za jednym zamachem:

import csv 

with open('inputfile.txt', newline='') as inputfile: 
    results = list(csv.reader(inputfile)) 
+0

'csv.reader (open (filename))' ease! –

4

utworzyć listę list:

with open("/path/to/file") as file: 
    lines = [] 
    for line in file: 
     # The rstrip method gets rid of the "\n" at the end of each line 
     lines.append(line.rstrip().split(",")) 
+0

Świetnie, dziękuję bardzo, to ma wiele sensu. – John

+0

Cześć iCodez- Właściwie próbuję tego użyć i podczas tworzenia listy list, na liście znajduje się tylko jeden element - plik wejściowy, którego teraz używam (jak podano w pierwotnym pytaniu) ma trzy linie, więc powinny istnieć trzy listy. Korzystając z twojego podejścia uzyskuję tylko [['3', '2', '1', '2', '3', '1', '2', '3', '1', '2', 3, 1, r1, 1, 1, 1, 3, 3, 1, 1, 2, 2 i 1, "3"]]. jakieś pomysły? Dzięki wielkie. – John

+0

@John - Nie mogę odtworzyć twojego problemu. Przetestowałem swój kod na podanym przykładzie 5-liniowym i działało dokładnie tak, jak powinno. Sporządzono listę 5 list, po jednej dla każdej linii. Czy na pewno plik ma 3 wiersze, a nie tylko jedną długą linię? – iCodez

2
with open('path/to/file') as infile: # try open('...', 'rb') as well 
    answer = [line.strip().split(',') for line in infile] 

Jeśli chcesz numery jak int s:

with open('path/to/file') as infile: 
    answer = [[int(i) for i in line.strip().split(',')] for line in infile] 
+0

Dzięki!Jedno z pytań uzupełniających-0 Otrzymuję błąd Plik "seventeen_v2.3.py", wiersz 7, w odpowiedź = [[int (i) dla i w linii.strip(). Split (",") ] dla wiersza w pliku] ValueError: niepoprawny literał dla int() z base 10: '1 \ r1' Plik txt zawiera tylko cyfry - jakikolwiek pomysł, dlaczego Python dodaje ten "\ r1" do danych wejściowych? – John

+0

Sprawdź edytuj – inspectorG4dget

-1
lines=[] 
with open('file') as file: 
    lines.append(file.readline()) 
+1

Musisz podać bardziej kompletną odpowiedź. W obecnej formie nie robi to, co chce OP. – iCodez

Powiązane problemy