2015-11-03 19 views
5

Ich hoffe, das ist nicht trivial, aber ich frage mich folgende:in allen csv-Dateien aus einem Verzeichnis lesen Python

Wenn ich einen bestimmten Ordner mit ncsv Dateien habe, wie könnte ich alle iterativ lesen sie einzeln nacheinander und führen einige Berechnungen ihrer Werte durch?

Für eine einzelne Datei, zum Beispiel, ich habe so etwas wie diese und einige Berechnungen auf die x Array durchführen:

import csv 
import os 

directoryPath=raw_input('Directory path for native csv file: ') 
csvfile = numpy.genfromtxt(directoryPath, delimiter=",") 
x=csvfile[:,2] #Creates the array that will undergo a set of calculations 

Ich weiß, dass ich überprüfen, wie viele csv Dateien dort in einem bestimmten Ordner ist (überprüfen here):

import glob 
for files in glob.glob("*.csv"): 
    print files 

Aber ich konnte nicht herausfinden, wie man möglicherweise Nest die numpy.genfromtxt() Funktion in einem for-Schleife, so dass ich in allen csv-Dateien eines Verzeichnisses zu lesen, dass es bis zu mir ist zu spezi fy.

EDIT

Der Ordner ich nur jpg und csv Dateien hat. Letztere heißen eventX.csv, wobei X von 1 bis 50 reicht. Die for-Schleife, auf die ich mich beziehe, sollte daher die Dateinamen so betrachten, wie sie sind.

Antwort

7

Das ist, wie ich es tun würde:

import os 

directory = os.path.join("c:\\","path") 
for root,dirs,files in os.walk(directory): 
    for file in files: 
     if file.endswith(".csv"): 
      f=open(file, 'r') 
      # perform calculation 
      f.close() 
+0

Kann die 'f.close()' Zeile direkt nach der Definition von 'x = csvfile [:, 2]' gesetzt werden? Die Zahl "2" ist nur beispielhaft. – FaCoffee

+0

Und wenn ich hinzufügen darf, ist Ihr Code für alle 'CSV'-Dateien in allen Ordnern innerhalb' Verzeichnis'? – FaCoffee

+1

als eine Anmerkung, der empfohlene Weg zum Öffnen von Dateien ist 'mit offenen (Datei) als Datei' dies hat den Vorteil, automatisch zu schließen, wenn außerhalb des Geltungsbereichs – Busturdust

3

Ich glaube, Sie so etwas wie dieses

import glob 

for file_name in glob.glob(directoryPath+'*.csv'): 
    x = np.genfromtxt(file_name,delimiter=',')[:,2] 
    # do your calculations 

bearbeiten

sucht Wenn Sie alle csv Dateien erhalten möchten Einen Ordner (einschließlich Unterordner) können Sie verwenden subprocess anstelle von glob (beachten Sie, dass dieser Code funktioniert nur auf Linux-Systemen)

import subprocess 
file_list = subprocess.check_output(['find',directoryPath,'-name','*.csv']).split('\n')[:-1] 

for i,file_name in enumerate(file_list): 
    x = np.genfromtxt(file_name,delimiter=',')[:,2] 
    # do your calculations 
    # now you can use i as an index 

Es sucht zunächst den Ordner und Unterordner für alle dateinamen der find Befehl von der Shell verwenden und wendet Ihre Berechnungen danach.

+0

Nun, ich mag diese handliche und kurze Lösung sehr, aber ich habe sie getestet und sie hat nicht ergeben, was ich wollte. Ich habe einen neuen leeren Ordner erstellt, in den drei 'csv'-Dateien mit den Namen' file_1.csv', 'file_2.csv' und' file_3.csv' gesetzt wurden, von denen jeder den Wert '1',' 2' und hat '3' als eindeutiger Wert (ohne Überschrift). Dann habe ich 'a = numpy.zeros (3)' erstellt, um sie mit diesen Werten zu füllen, aber ich bekomme 'a = ([0,0,0])'. In der for-Schleife werden die neuen Werte von a wie folgt zugewiesen: a [Dateiname] = numpy.genfromtxt (Dateiname, Begrenzer = ',') [0,0] '. Statt 'a = ([1,2,3]) 'bekomme ich' a = ([0,0,0]) '. – FaCoffee

+1

Hmm ... es funktionierte für meine einfachen Beispiele ... lass mich überprüfen, was schief gehen könnte ... – plonser

+0

@FrancescoCastellani: 'file_name' ist eine Zeichenkette in meinem Code ... was meinst du mit' a [file_name] '? 'a [...]' benötigt eine ganze Zahl ... gibt es keine Fehler? – plonser

2

Nach den documentation von numpy.genfromtxt() kann das erste Argument ein

Datei, Dateiname sein, oder Generator zu lesen.

Das würde bedeuten, dass Sie einen Generator schreiben könnte, die die Linien aller Dateien wie folgt ergibt:

def csv_merge_generator(pattern): 
    for file in glob.glob(pattern): 
     for line in file: 
      yield line 

# then using it like this 

numpy.genfromtxt(csv_merge_generator('*.csv')) 

funktionieren sollte. (Ich habe keine Nummern installiert, kann also nicht leicht testen)

+0

Ist Ihre letzte Zeile in einer For-Schleife verschachtelt? – FaCoffee

+1

nonono, es wird im Generator übergeben und erhält als solche alle Dateien – Ward

Verwandte Themen