2013-09-24 68 views
5

Dire che ho un file .txt con molte righe e colonne di dati e un elenco contenente valori interi. Come caricare i numeri di riga nel file di testo che corrispondono ai numeri interi nell'elenco?Come caricare determinate righe da un file .txt in Python?

Per illustrare, dire che ho una lista di interi:

a = [1,3,5] 

Come dovrei leggere solo le righe 1,3 e 5 da un file di testo in un array?

La routine loadtxt in numpy consente di saltare entrambe le righe e utilizzare colonne particolari. Ma io non riesco a trovare un modo per fare qualcosa sulla falsariga di (ignorando sintassi non corretta):

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

Grazie.

+0

Il file di testo è troppo grande/richiede troppo tempo per essere caricato nella memoria? – wflynny

+0

L'uso di 'numpy' per raggiungere questo è un requisito? – Bakuriu

+5

Non puoi usare uno standard 'while open (file) come fd: for n, line in enumerate (fd)' loop e se 'n' è uguale a qualsiasi cosa in' a' fai le tue cose? –

risposta

5

Dato questo file:

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

È possibile utilizzare il modulo csv per ottenere la matrice np desiderata:

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)) 

Stampe:

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

Giusto per espandere il mio commento

$ 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() 

uscita:

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

Usa CSV module e Files.xreadlines().

  • CSV module: implementa classi per leggere e scrivere dati tabulari in formato CSV

  • Files.xreadlines(): Restituisce un iteratore le chiavi del dizionario. Questa è una scorciatoia per iterkeys(). Obsoleto dalla versione 2.3: utilizzare for line in file invece.

0

I wou Suggerisco di utilizzare line.split() anziché line.strip(). line.split() restituisce l'elenco, che può essere facilmente convertito in numpy.array utilizzando il comando np.asarray.

Problemi correlati