2015-07-12 15 views
7

Liczba linii jest znana na wstępie.W języku Python, jak uzyskać liczby całkowite z pliku .txt z odstępem i r n rozdzielonymi liczbami na wielu liniach?

plik wejściowy:

0 1 2 3 4 5 6 7 8 
8 1 2 3 4 5 6 7 0 
4 0 8 2 6 3 7 1 5 
..n such lines 

Pożądany wynik:

line1 = [0, 1, 2, 3, 4, 5, 6, 7, 8] 
line2 = [8, 1, 2, 3, 4, 5, 6, 7, 0] 
line3 = [4, 0, 8, 2, 6, 3, 7, 1, 5] 
. 
. 
linen = [n1, ........   n9] 

Jestem obecnie:

  • Striping plik z '\ r \ n' na każdej linii
  • Uzyskiwanie oddzielnych linii w każdej linii przy użyciu .split() do i int (i) do konwersji liczb całkowitych

Kod:

#The lines start at the 7th byte in the input file. 
f.seek(7) 

#Getting rid of the '\r\n' 
lines = [line.rstrip('\n\r') for line in f] 

#1st line 
line0 = lines[0] 
line = [[int(i) for i in line0.split()]] 
print line 


...& so on for the 'n' lines 

Odpowiedz

6

już usuwa białe znaki od końca, w tym znak nowej linii. Nie ma potrzeby usuwania paska \r; Python już przetłumaczył separator linii na po prostu\n.

Nie należy próbować przypisać do wielu zmiennych line*; po prostu użyj listy zamiast:

with open(filename, 'r') as fobj: 
    all_lines = [[int(num) for num in line.split()] for line in fobj] 

Teraz masz listę list z liczbami całkowitymi.

Można po prostu przetworzyć każdy wiersz podczas czytania go z pliku; przesunąć w kierunku produktu końcowego w tym czasie zamiast trzymać wszystkie linie w pamięci:

with open(filename, 'r') as fobj: 
    for line in fobj: 
     numbers = [int(num) for num in line.split()] 
     # do something with this line of numbers before moving on to the next. 
+0

Miałem zamiar użyć dyktatu, ale jak @Padraic Cunningham i twoje odpowiedzi wskazują, używanie listy list i indeksowanie jest lepszą opcją. Dziękuję Ci! – Ketcomp

5

Wystarczy Split i map do int, Split zrobi wszystko za Ciebie:

with open("in.txt") as f: 
    for line in f: 
     print(map(int,line.split())) # list(map(int,line.split())) for py3 

dostać lista list używa rozumienia listy:

with open("in.txt") as f: 
    data = [map(int,line.split()) for line in f] 

Jeśli używasz python3 y musisz użyć list(map... jako powrotu mapy i iteratora w python3 do listy w python2.

Można również użyć dyktowania, aby uzyskać dostęp do każdej listy według nazwy/klucza, ale można użyć indeksowania, więc dykcja będzie bezcelowa.

+0

Uważaj na 'map()', ponieważ w Pythonie 3 otrzymasz iterator, a nie listę. –

+1

@MartijnPieters, spójrz na odciski OP –

+0

Tak, i nadal trzymam się ze zrozumieniem list tak, ponieważ OP rzadko jest jedyną publicznością. –

1

Jeśli twoje wymagania pozwalają korzystać NumPy, można użyć loadtxt() function czytać i analizować zawartość pliku do 2D NumPy ndarray. Może to być przydatne, jeśli musisz przetworzyć wiele wierszy naraz, w pewien skomplikowany sposób, który nie nadaje się do implementacji za pomocą iteratora.

Ponieważ wspomniałeś, że liczby nie zaczynają się od razu na początku pliku, możesz użyć parametru skiprows do loadtxt(), aby pominąć pierwszy wiersz. Możesz też otworzyć plik samodzielnie, odczytać siedem bajtów z obiektu pliku, a następnie przekazać go do loadtxt().

Powiązane problemy