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.
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()
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.
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)