2014-06-18 9 views
5

Sto cercando un modo per estrarre i dati da un file con più simboli di commento. Il file di input è simile a:Utilizzo di numpy per filtrare più simboli di commento

# filename: sample.txt 
# Comment 1 
# Comment 2 
$ Comment 3 
1,10 
2,20 
3,30 
4,40 
# Comment 4 

riesco solo per togliere un tipo di commento con il seguente codice e non riesco a trovare alcuna documentazione su come potrei rimuovere entrambi.

import numpy as np 
data = np.loadtxt('sample.txt',comments="#") # I need to also filter out '$' 

Esistono metodi alternativi che è possibile utilizzare per eseguire questa operazione?

+0

E 'possibile disporre di dati e un commento sulla stessa riga nel file? – timgeb

+0

No, non succederà. – tirefire

risposta

2

per questo caso, è necessario ricorrere al loop standard-python sull'input, ad es. qualcosa di simile:

data = [] 
with open("input.txt") as fd: 
    for line in fd: 
     if line.startswith('#') or line.startswith('$'): 
      continue 
     data.append(map(int, line.strip().split(','))) 

print data 

uscita:

[[1, 10], [2, 20], [3, 30], [4, 40]] 
+0

Questo fa esattamente quello che mi serve, grazie! – tirefire

1

Poiché le tue righe contengono solo un commento o i tuoi dati, vorrei solo leggere il file prima di elaborarlo con numpy. Le righe di commento verranno eliminate con espressioni regolari.

import re 
from StringIO import StringIO 
import numpy as np 
with open('sample.txt', 'r') as f: 
    data = re.sub(r'\s*[#\$].*\n', '', f.read()) 
data = np.genfromtxt(StringIO(data), dtype=int, delimiter=',') 

Questo vi darà la matrice NumPy desiderato data. Si noti che questo approccio funzionerà ancora se una linea (accidentalmente) inizia con degli spazi bianchi seguiti da uno dei caratteri del commento.

3

vorrei creare un generatore che ignorare i commenti e poi passarlo al np.genfromtxt():

gen = (r for r in open('sample.txt') if not r[0] in ('$', '#')) 
a = np.genfromtxt(gen, delimiter=',') 
0

Se si desidera mantenere la piena potenza loadtxt, puoi semplicemente modificarla in modo che si adatti alle tue esigenze. Come ha fatto notare David Marek, la linea in cui vengono eliminati i commenti è this one

line = asbytes(line).split(comments)[0].strip(asbytes('\r\n')) 

diventa:

for com in comments: 
    line = asbytes(line).split(com)[0] 
line = line.strip(asbytes('\r\n')) 

Si sarebbe anche bisogno di cambiare L717:

comments = asbytes(comments) 

si trasforma in:

comments = [asbytes(com) for com in comments] 

Se si desidera mantenere la piena compatibilità,

if isinstance(comments, basestring): 
    comments = [comments] 
1

è sufficiente utilizzare un elenco per i commenti, ad esempio:

data = np.loadtxt('sample.txt',comments=['#', '$', '@'])