Нужно сделать математическую операцию над каждой строкой в ​​нескольких файлах CSV в Python - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть около 100 CSV-файлов, с которыми мне приходится работать раз в месяц, и я пытался обернуть голову вокруг этого, но я врезался в стену. Я начинаю понимать кое-что о Python, но объединение нескольких вещей все еще вызывает у меня проблемы, поэтому я не могу понять это.

Вот моя проблема:

У меня много CSV-файлов, и вот что мне нужно сделать:

добавьте «колонку» в начале каждой строки (или сзади, на самом деле не имеет значения, но фронт идеален). Кроме того, каждая строка имеет 5 строк (не считая имени файла, которое будет добавлено), и вот формат:

6-значный идентификационный номер, ГГГГ-ММ-ДД (1), ГГГГ-ММ-ДД (2), ГГГГ-ММ-ДД (3), 1-2-значный номер

Мне нужно вычесть YYYY-MM-DD (3) из YYYY-MM-DD (2) для каждой строки в файле (нет строки заголовка), для каждого CSV в данном каталоге.

Мне нужно имя файла внутри строки, потому что я объединю файлы (что, если включить в скрипт, было бы здорово, но я думаю, что смогу разобраться с этой частью), и мне нужно знать, из какого файла пришли записи от. Формат имени файла всегда «4-5-значный номер.csv»

Надеюсь, это имеет смысл, если нет, пожалуйста, дайте мне знать. Я немного озадачен тем, с чего начать, поэтому у меня нет примера кода, который действительно начал работать для меня. Действительно расстроен, поэтому я ценю любую помощь, которую вы, ребята, можете оказать, этот сайт потрясающий!

Майлан

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

В стандартной библиотеке есть инструмент для каждой из следующих задач:

Чтобы перебрать все файлы CSV в каталоге, используйте модуль glob :

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

Для анализа файла CSV используйте модуль csv :

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

Чтобы проанализировать дату и рассчитать разницу, используйте модуль datetime :

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

Чтобы добавить значение в начало строки:

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

Чтобы добавить имя файла в конец строки:

row.append(csvfilename)

И записать строку в новый файл CSV:

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

Все вместе, вы получите:

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)
0 голосов
/ 08 сентября 2011

Основная схема программы будет выглядеть так:

  1. Используйте модуль os, чтобы получить имена файлов из интересующего каталога / каталогов
  2. Чтение каждого файла по одному
  3. Для каждой строки в файле разбить ее на столбцы с помощью columns = line.split(",")
  4. Используйте datetime.date для преобразования строк типа «2011-05-03» в datetime.dates.
  5. Вычтите третью дату из второй, что дает datetime.timedelta.
  6. Поместите всю вашу информацию в нужный вам формат (подсказка: str (foo) выдает строковое представление foo практически для любого типа) и запомните ее на потом
  7. Закройте файл, снова откройте его для записи и напишите новый материал в
...