2013-09-24 16 views
5

Powiedzmy, że mam plik .txt z wieloma wierszami i kolumnami danych oraz listą zawierającą liczby całkowite. Jak mogę załadować numery wierszy w pliku tekstowym, które pasują do liczb całkowitych na liście?Jak załadować określone wiersze z pliku .txt w języku Python?

Aby zilustrować, że mam listę liczb całkowitych:

a = [1,3,5] 

Jak bym tylko do odczytu wierszy 1,3 i 5 z pliku tekstowego do tablicy?

Procedura loadtxt w numpy pozwól, że pominiesz wiersze i użyjesz określonych kolumn. Ale nie mogę znaleźć sposobu na zrobienie czegoś podobnego (ignorowanie niepoprawnej składni):

new_array = np.loadtxt('data.txt', userows=a, unpack='true') 

Dziękuję.

+0

Czy plik tekstowy jest za duży/zbyt długi, aby załadować go do pamięci? – wflynny

+0

Użycie 'numpy' do osiągnięcia tego jest wymogiem? – Bakuriu

+5

Nie możesz użyć standardowego 'while while (file) as fd: dla n, linia w wyliczeniu (fd)' i czy 'n' jest równe cokolwiek w' a' czy twoje rzeczy? –

Odpowiedz

5

Biorąc pod uwagę ten plik:

1,2,3 
4,5,6 
7,8,9 
10,11,12 
13,14,15 
16,17,18 
19,20,21 

można użyć modułu csv, aby uzyskać żądaną tablicę NP:

import csv 
import numpy as np 

desired=[1,3,5] 
with open('/tmp/test.csv', 'r') as fin: 
    reader=csv.reader(fin) 
    result=[[int(s) for s in row] for i,row in enumerate(reader) if i in desired] 

print(np.array(result)) 

Drukuje:

[[ 4 5 6] 
[10 11 12] 
[16 17 18]] 
3

Wystarczy rozszerzyć na mój komentarz

$ cat file.txt 
line 0 
line 1 
line 2 
line 3 
line 4 
line 5 
line 6 
line 7 
line 8 
line 9 
line 10 

Python:

#!/usr/bin/env python 

a = [1, 4, 8] 

with open('file.txt') as fd: 
    for n, line in enumerate(fd): 
     if n in a: 
      print line.strip() 

wyjściowa:

$ ./l.py 
line 1 
line 4 
line 8 
0

Zastosowanie CSV module i Files.xreadlines().

  • CSV module: realizuje zajęcia do odczytu i zapisu danych tabelarycznych w formacie CSV

  • Files.xreadlines(): Zwraca iterator na klucze słownika. To jest skrót do iterkeys(). Przestarzałe od wersji 2.3: Zamiast tego użyj for line in file.

0

I wou ld sugeruje użycie line.split() zamiast line.strip(). line.split() zwraca listę, którą można łatwo przekonwertować na numpy.array, używając polecenia np.asarray.

Powiązane problemy