it-swarm.com.de

numpy loadtxt überspringe die erste Zeile

Ich habe ein kleines Problem, wenn ich versuche, Daten aus CSV-Dateien mit der loadtxt-Funktion von numpy zu importieren. Hier ist ein Beispiel für die Art der Datendateien, die ich habe.

Nenne es 'datafile1.csv':

# Comment 1
# Comment 2
x,y,z 
1,2,3
4,5,6
7,8,9
...
...
# End of File Comment

Das Skript, von dem ich dachte, es würde in dieser Situation funktionieren, sieht folgendermaßen aus:

import numpy as np
FH = np.loadtxt('datafile1.csv',comments='#',delimiter=',',skiprows=1)

Aber ich erhalte einen Fehler:

ValueError: could not convert string to float: x

Dies sagt mir, dass die kwarg 'skiprows' nicht den Header überspringen, sondern die erste Reihe von Kommentaren überspringen. Ich könnte einfach sicherstellen, dass skiprows = 3 ist, aber die Komplikation ist, dass ich eine sehr große Anzahl von Dateien habe, die nicht unbedingt alle die gleiche Anzahl von kommentierten Zeilen oben in der Datei haben. Wie kann ich sicherstellen, dass ich mit loadtxt nur in einer solchen Situation die tatsächlichen Daten erhalte?

P.S. - Ich bin auch offen für Bash-Lösungen.

12
astromax

Kommentarzeile manuell mit Generatorausdruck überspringen:

import numpy as np

with open('datafile1.csv') as f:
    lines = (line for line in f if not line.startswith('#'))
    FH = np.loadtxt(lines, delimiter=',', skiprows=1)
20
falsetru

Erstellen Sie Ihre eigene benutzerdefinierte Filterfunktion, z. B .:

def skipper(fname):
    with open(fname) as fin:
        no_comments = (line for line in fin if not line.lstrip().startswith('#'))
        next(no_comments, None) # skip header
        for row in no_comments:
            yield row

a = np.loadtxt(skipper('your_file'), delimiter=',')
1
Jon Clements
def skipper(fname, header=False):
    with open(fname) as fin:
        no_comments = (line for line in fin if not line.lstrip().startswith('#'))
        if header:
            next(no_comments, None) # skip header
        for row in no_comments:
            yield row

a = np.loadtxt(skipper('your_file'), delimiter=',')

Dies ist nur eine kleine Änderung der Antwort von @Jon Clements, indem ein optionaler Parameter "header" hinzugefügt wird, da die CSV-Datei in einigen Fällen Kommentarzeilen enthält (beginnt mit #), aber keine Kopfzeile enthält.

0
JeffZheng