Müssen in jeder Zeile in mehreren CSV -Dateien in Python einen Mathe -Betrieb durchführen

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

  •  28-10-2019
  •  | 
  •  

Frage

Ich habe ungefähr 100 CSV -Dateien, mit denen ich einmal im Monat arbeiten muss, und ich habe versucht, meinen Kopf um diese zu wickeln, aber ich renne in eine Wand. Ich fange an, einige Dinge über Python zu verstehen, aber es gibt mir immer noch Probleme, einige Dinge zu kombinieren, also kann ich das nicht herausfinden.

Hier ist mein Problem:

Ich habe viele CSV -Dateien, und hier ist, was ich tun muss:

Fügen Sie der Vorderseite jeder Reihe eine "Spalte" hinzu (oder der Rückseite spielt keine Rolle, aber vorne ist ideal). Darüber hinaus verfügt jede Zeile über 5 Zeilen (ohne den Dateinamen, der hinzugefügt wird), und hier ist das Format:

6-stellige ID-Nummer, yjyy-mm-dd (1), yyjy-mm-dd (2), yyyy-mm-dd (3), 1-2stellige Nummer

Für jede Zeile in der Datei (es gibt keine Header-Reihe) für jeden CSV in einem bestimmten Verzeichnis von Yyyy-MM-DD (2) subtrahieren Sie von Yyyyy-MM-DD (3) von YYYY-MM-DD (2).

Ich brauche den Dateinamen in der Zeile, weil ich die Dateien kombinieren werde (was, wenn es im Skript enthalten ist, großartig wäre, aber ich denke, ich kann diesen Teil herausfinden), und ich muss wissen, aus welcher Datei die Datensätze stammen. Das Format des Dateinamens ist immer '4-5-stellig-number.csv'

Ich hoffe, das macht Sinn, wenn es nicht der Fall ist, lassen Sie es mich bitte wissen. Ich bin irgendwie verblüfft, wo ich überhaupt anfangen soll, also habe ich keinen Beispielcode, der selbst wirklich für mich gearbeitet hat. Wirklich frustriert, also schätze ich, dass diese Seite euch helfen könnte, diese Seite rockt!

Mylan

War es hilfreich?

Lösung

Für jede dieser Aufgaben befindet sich in der Standardbibliothek ein Tool:

Verwenden Sie das, um alle CSV -Dateien in einem Verzeichnis zu iterieren glob Modul:

import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
    #do_something

Verwenden Sie die CSV -Datei, um eine CSV -Datei zu analysieren, die csv Modul:

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

Verwenden Sie das, um ein Datum zu analysieren und einen Unterschied zu berechnen datetime Modul:

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

So fügen Sie dem Beginn einer Zeile einen Wert hinzu:

row[0:0] = [str(delta)]

Um den Dateinamen an das Ende einer Zeile anzuhängen:

row.append(csvfilename)

Und um eine Zeile in eine neue CSV -Datei zu schreiben:

with open(csvfilename, "wb") as csvfile:
    writer = csv.writer(csvfile, delimiter=",")
    writer.writerow(row)

Alle zusammengenommen, Sie bekommen:

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)

Andere Tipps

Der grundlegende Umriss des Programms wird wie folgt sein:

  1. Verwenden Sie das Betriebssystemmodul, um die Dateinamen aus dem Verzeichnis/des interessierenden Verzeichnisses herauszuholen
  2. Lesen Sie jeweils einzeln in jeder Datei
  3. Teilen Sie sie für jede Zeile in der Datei in Spalten mit columns = line.split(",")
  4. Verwenden Sie datetime.date, um Strings wie "2011-05-03" in datetime.dates zu konvertieren.
  5. Subtrahieren Sie das dritte Datum vom zweiten, was eine datetime.timedelta ergibt.
  6. Setzen Sie alle Ihre Informationen in das gewünschte Format ein (Hinweis: STR (Foo) ergibt eine String -Darstellung von Foo für nahezu jeden Typ) und denken Sie für später daran, dass
  7. Schließen Sie Ihre Datei, öffnen Sie sie zum Schreiben und schreiben Sie Ihre neuen Sachen in
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top