Besoin de faire une opération mathématique sur chaque ligne dans plusieurs fichiers CSV en Python
Question
J'ai environ 100 fichiers CSV que je dois opérer une fois par mois et je cherchais à envelopper la tête autour de cela, mais je suis en cours d'exécution dans un mur. Je commence à comprendre certaines choses au sujet de Python, mais la combinaison de plusieurs choses encore me donner des problèmes, donc je ne peux pas comprendre.
Voici mon problème:
J'ai beaucoup de fichiers CSV, et voici ce que je dois faire:
ajouter une « colonne » à l'avant de chaque ligne (ou à l'arrière, peu importe vraiment, mais avant est idéal). De plus, chaque ligne dispose de 5 lignes (sans compter le nom du fichier qui sera ajouté), et voici le format:
6 chiffres numéro d'identification, AAAA-MM-DD (1), AAAA-MM-DD (2), AAAA-MM-DD (3), numéro 1-2 chiffres
Je dois soustraire AAAA-MM-JJ (3) de AAAA-MM-JJ (2) pour chaque ligne dans le fichier (il n'y a pas de ligne d'en-tête), pour chaque CSV dans un répertoire donné.
J'ai besoin du nom de fichier dans la ligne parce que je vais combiner les fichiers (qui, si elle est incluse dans le script serait génial, mais je pense que je peux comprendre cette partie hors), et je dois savoir quel fichier les dossiers sont venus de. Format de fichier est toujours '4-5 chiffres-number.csv'
J'espère que cela a un sens, si elle ne le fait pas, s'il vous plaît laissez-moi savoir. Je suis un peu perplexe quant à où commencer même, donc je n'ai pas exemple de code que même vraiment commencé à travailler pour moi. Vraiment frustré, je vous remercie de toute aide que vous les gars peuvent fournir, ce site rocks!
Mylan
La solution
Il y a un outil dans la bibliothèque standard pour chacune de ces tâches:
Pour tous les fichiers itérer sur CSV dans un répertoire, utilisez le glob
Module :
import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
#do_something
Pour analyser un fichier CSV, utilisez le csv
Module :
import csv
with open(csvfilename, "rb") as csvfile:
reader = csv.reader(csvfile, delimiter=",")
for row in reader:
# row is a list of all the entries in the current row
Pour analyser une date et calculer une différence, utilisez le datetime
Module :
from datetime import datetime
startdate = datetime.strptime("1999-10-20", "%Y-%m-%d")
enddate = datetime.strptime("2003-02-28", "%Y-%m-%d")
delta = enddate - startdate # difference in days
Pour ajouter une valeur au début d'une ligne:
row[0:0] = [str(delta)]
pour ajouter le nom de fichier à la fin d'une ligne:
row.append(csvfilename)
Et pour écrire une ligne à un nouveau fichier CSV:
with open(csvfilename, "wb") as csvfile:
writer = csv.writer(csvfile, delimiter=",")
writer.writerow(row)
Dans leur ensemble, vous obtenez:
import glob
import csv
from datetime import datetime
with open("combined_files_csv", "wb") as outfile:
writer = csv.writer(outfile, delimiter=",")
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
with open(csvfilename, "rb") as infile:
reader = csv.reader(infile, delimiter=",")
for row in reader:
startdate = datetime.strptime(row[3], "%Y-%m-%d")
enddate = datetime.strptime(row[2], "%Y-%m-%d")
delta = enddate - startdate # difference in days
row[0:0] = [str(delta)]
row.append(csvfilename)
writer.writerow(row)
Autres conseils
Les grandes lignes du programme va être comme ceci:
- Utilisez le module os pour obtenir les noms de fichiers hors du répertoire / répertoires d'intérêt
- Lire dans chacun des fichiers à la fois
- Pour chaque ligne dans le fichier, il divisé en colonnes avec
columns = line.split(",")
- Utilisez datetime.date pour convertir des chaînes comme "2011-05-03" à datetime.dates.
- Soustraire la troisième date de la seconde, ce qui donne un datetime.timedelta.
- Mettez toutes vos informations dans le format que vous voulez (indice: str (foo) donne une représentation de chaîne de foo, pour à peu près tout type) et rappelez-vous pour plus tard
- Fermez votre fichier, ouvrez-le pour écrire et écrire votre nouveau truc dans