Besoin de faire une opération mathématique sur chaque ligne dans plusieurs fichiers CSV en Python

StackOverflow https://stackoverflow.com/questions/7350851

  •  28-10-2019
  •  | 
  •  

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

Était-ce utile?

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:

  1. Utilisez le module os pour obtenir les noms de fichiers hors du répertoire / répertoires d'intérêt
  2. Lire dans chacun des fichiers à la fois
  3. Pour chaque ligne dans le fichier, il divisé en colonnes avec columns = line.split(",")
  4. Utilisez datetime.date pour convertir des chaînes comme "2011-05-03" à datetime.dates.
  5. Soustraire la troisième date de la seconde, ce qui donne un datetime.timedelta.
  6. 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
  7. Fermez votre fichier, ouvrez-le pour écrire et écrire votre nouveau truc dans
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top