Нужно выполнить математику на каждой строке в нескольких файлах CSV в Python

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

  •  28-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

Милан

Это было полезно?

Решение

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

Для итерации по всем файлам 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)

Другие советы

Основной план программы будет таким:

  1. Используйте модуль ОС, чтобы вывести имена файлов из каталога/каталогов, представляющих интерес
  2. Читать в каждом файле по одному
  3. Для каждой строки в файле разделите его на столбцы с columns = line.split(",")
  4. Используйте DateTime.Date для преобразования строк, таких как «2011-05-03» в DateTime.Dates.
  5. Вычтите третью дату со второй, которая дает DateTime.timedelta.
  6. Поместите всю свою информацию в желаемый формат (подсказка: str (foo) дает строковое представление Foo, практически для любого типа) и помните его на потом
  7. Закройте свой файл, откройте его для написания и напишите свои новые вещи в
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top