web-dev-qa-db-fra.com

Lire tous les fichiers csv d'un répertoire en utilisant Python

J'espère que ce n'est pas anodin mais je me pose la question suivante:

Si j'ai un dossier spécifique contenant des fichiers ncsv, comment pourrais-je les lire tous de manière itérative, un à la fois, et effectuer des calculs sur leurs valeurs?

Pour un seul fichier, par exemple, je fais quelque chose comme ceci et effectue des calculs sur le tableau x:

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

Je sais que je peux vérifier combien de fichiers csv se trouvent dans un dossier donné (vérifiez ici ):

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

Mais je n’ai pas réussi à comprendre comment imbriquer éventuellement la fonction numpy.genfromtxt() dans une boucle for, de sorte que je puisse lire tous les fichiers CSV d’un répertoire qu’il m’appartient de spécifier. 

MODIFIER

Le dossier que j'ai n'a que des fichiers jpg et csv. Ces derniers sont nommés eventX.csv, où X va de 1 à 50. La boucle for à laquelle je fais référence doit donc prendre en compte les noms de fichiers.

9
FaCoffee

C'est comme ça que je le ferais:

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()
11
user4850448

Je pense que tu cherches quelque chose comme ça

import glob

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

Modifier

Si vous voulez obtenir tous les fichiers csv à partir d'un dossier (y compris un sous-dossier), vous pouvez utiliser subprocess au lieu de glob (notez que ce code ne fonctionne que sur les systèmes Linux).

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

Il recherche d’abord tous les noms de fichier dans le dossier et les sous-dossiers à l’aide de la commande find du shell, puis applique vos calculs.

4
plonser

Selon la documentation of numpy.genfromtxt(), le premier argument peut être un 

Fichier, nom de fichier ou générateur à lire.

Cela voudrait dire que vous pourriez écrire un générateur qui renvoie les lignes de tous les fichiers comme ceci: 

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

devrait marcher. (Je n'ai pas installé numpy, je ne peux donc pas tester facilement)

2
Ward