2014-06-18 11 views
5

Ich bin auf der Suche nach einer Möglichkeit, Daten aus einer Datei mit mehreren Kommentarsymbolen zu ziehen. Die Eingabedatei ähnelt:Verwenden von numpy zum Ausfiltern mehrerer Kommentarsymbole

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

kann ich nur einen Kommentar Typ mit dem folgenden Code zu entfernen scheinen und kann keine Dokumentation finden, wie ich beide entfernen könnten.

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

Gibt es alternative Methoden, die ich verwenden könnte, um dies zu erreichen?

+0

Ist es möglich, Daten und einen Kommentar in der gleichen Zeile in der Datei zu haben? – timgeb

+0

Nein, das wird nicht passieren. – tirefire

Antwort

2

für diesen Fall müssen Sie Standard-Python-Looping über die Eingabe z. so etwas wie dieses:

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 

Ausgang:

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

Das macht genau das, was ich brauche, danke! – tirefire

1

Da Ihre Zeilen entweder nur einen Kommentar oder Ihre Daten enthalten, habe ich nur die Datei eingelesen, bevor ich sie mit numpy verarbeitet habe. Kommentarzeilen werden mit regulären Ausdrücken gelöscht.

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=',') 

Dies gibt Ihnen die data numpy Array gewünscht. Beachten Sie, dass dieser Ansatz immer noch funktioniert, wenn eine Zeile (versehentlich) mit einem Leerzeichen beginnt, gefolgt von einem der Kommentarzeichen.

3

ich einen Generator erzeugen würde, die Kommentare ignorieren und geben sie dann an np.genfromtxt():

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

Wenn Sie das behalten wollen Volle loadtxt Macht, können Sie nur ändern, damit es Ihren Bedürfnissen entspricht. Als David Marek erwähnt, wo die Linie Kommentare eliminiert ist this one

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

Becomes:

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

Sie müssten auch L717 ändern:

comments = asbytes(comments) 

verwandelt sich in:

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

Wenn Sie die volle Kompatibilität halten wollen,

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

einfach eine Liste für Kommentare verwenden, zum Beispiel:

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