2016-06-10 8 views
3

Ich schreibe ein allgemeines Programm zum Lesen und Plotten großer Datenmengen aus. TXT-Dateien. Jede Datei hat eine andere Anzahl von Spalten. Ich weiß, dass jede Datei 8 Spalten hat, an denen ich nicht interessiert bin, so dass ich die Anzahl der relevanten Spalten auf diese Weise herausfinden kann. Wie kann ich die Daten lesen und die Daten jeder relevanten Spalte in eine separate Variable sortieren? DieseWie man Spalten von Daten Variablen zuweist

ist das, was ich bisher:

datafile = 'plotspecies.txt' 
with open(datafile) as file: 
    reader = csv.reader(file, delimiter=' ', skipinitialspace=True) 
    first_row = next(reader) 
    num_cols = len(first_row) 
    rows = csv.reader(file, delimiter = ' ', quotechar = '"') 
    data = [data for data in rows] 

num_species = num_cols - 8 

ich Leute gesehen habe, sagen, dass Pandas für diese Art der Sache gut ist, aber ich kann es nicht zu importieren scheinen. Ich würde eine Lösung ohne es bevorzugen.

+0

Was möchten Sie genau sortieren? –

+0

Die Daten aus jeder Spalte, damit ich mit jeder Spezies als einzelne Variable arbeiten kann. – evtoh

+0

Können Sie ein Beispiel für eine Zeile angeben? Oder geben Sie uns Einzelheiten über die Datei? Es ist sehr schwer, ohne das zu antworten. –

Antwort

7

Pandas ist in der Tat die richtige Lösung hier. Das Problem ist, dass, um etwas zu robust zu behandeln, in denen Sie nicht sicher von der zugrunde liegenden Struktur gibt es eine Menge von Rand Fällen haben Sie zu achten und versuchen, Schuh-Horn in das csv Modul ist ein Rezept für Kopfschmerzen (obwohl es getan werden kann)

Soweit warum Sie pandas nicht importieren können, ist der Grund, dass es standardmäßig nicht mit python kommt. Eines der wichtigsten Dinge, die beim Abrufen einer Sprache zu beachten sind, ist das Ökosystem von Paketen, auf das Sie zugreifen können. Python gehört zu den besten in der Hinsicht. Um alles zu ignorieren, was kein Standard-Python ist, ignoriert man den besten Teil der Sprache.

Wenn Sie auf einem Windows-Umgebung, die Sie, indem sie conda Set up beginnen soll. Auf diese Weise können Sie viele Pakete, die für Python-Benutzer verfügbar sind, mit wenig Aufwand nahtlos untersuchen. Dazu gehört pandas, was in der Tat der richtige Weg ist, um dieses Problem zu lösen. Siehe diesen Link für weitere Informationen über die Installation Conda: http://conda.pydata.org/docs/install/quick.html

Sobald Sie pandas es ist so einfach wie diese installiert bekam:

import pandas 
test = pandas.read_csv(<your_file>) 
your_Variable = test[<column_header>] 

So einfach ist das.

Wenn Sie wirklich, wirklich nicht wollen, Dinge verwenden, die nicht in den Kern Python sind, dann können Sie dies wie mit etwas tun, was folgt, aber Sie haben nicht detailliert genug für eine tatsächliche Lösung gegeben:

def col_var(input_file, delimiter): 
    # get each line into a variable 
    rows = open(input_file).read().splitlines() 

    # split each row into entries 
    split_rows = [row.split(delimiter) for row in rows] 

    # Re-orient your list 
    columns = zip(*split_rows) 

das Mindeste, intuitive Stück ist dies die letzte Zeile, also hier ein kleines Beispiel zeigt Ihnen, wie es funktioniert:

>>> test = [[1,2], [3,4]] 
>>> zip(*test) 
[(1, 3), (2, 4)] 
+0

Ich bin auf OS X. Ich habe Anaconda installiert, aber ich kann keine Pandas davon bekommen. Ich mache wahrscheinlich etwas falsch. – evtoh

+0

Wenn Sie unter OS X sind, dann müssen Sie nicht mit 'conda' stören. Verwenden Sie einfach 'pip'. Ich finde Pip viel einfacher und weniger mühsam als 'Conda'. https: //pip.pypa.io/de/stable/installing/ –

+0

Wenn ich pip benutze, wird ein Fehler zurückgegeben, der besagt, dass ich keine Berechtigung habe. – evtoh

1

Nun können Sie die csv-Modul verwenden, sofern es eine Art Trennzeichen innerhalb der ist Zeilen, die die Spalten appart setzt.

import csv 

file_to_read_from = 'myFile.txt' 

#initializing as many lists as the columns you want (not all) 
col1, col2, col3 = [], [], [] 
with open(file_to_read_from, 'r') as file_in: 
    reader = csv.reader(file_in, delimiter=';') #might as well be ',', '\t' etc 
    for row in reader: 
     col1.append(row[0]) # assuming col 1 in the file is one of the 3 you want 
     col2.append(row[3]) # assuming col 4 in the file is one of the 3 you want 
     col3.append(row[5]) # assuming col 6 in the file is one of the 3 you want