需要在多个CSV文件的每一行上做数学运算 Python

2 投票
2 回答
3103 浏览
提问于 2025-04-17 01:48

我每个月需要处理大约100个CSV文件,我一直在想这个问题,但遇到了一些困难。我开始对Python有了一些了解,但把几个东西结合起来还是让我很困惑,所以我搞不定这个问题。

这是我的问题:

我有很多CSV文件,我需要做的事情是:

在每一行的前面(或者后面也行,但前面最好)添加一个“列”。每一行有5个数据(不算要添加的文件名),格式是:

6位数字的ID,YYYY-MM-DD(1),YYYY-MM-DD(2),YYYY-MM-DD(3),1-2位数字

我需要从YYYY-MM-DD(2)中减去YYYY-MM-DD(3),对文件中的每一行都要这样做(没有表头),并且要对指定目录下的每个CSV文件进行操作。

我需要在行中包含文件名,因为我会把这些文件合并在一起(如果能在脚本中包含这个功能就太好了,但我想我可以搞定那部分),我需要知道记录来自哪个文件。文件名的格式总是'4-5位数字.csv'

希望这些描述能让你明白,如果不明白,请告诉我。我有点不知道从哪里开始,所以我没有任何样例代码能让我顺利进行。真的很沮丧,所以非常感谢你们提供的任何帮助,这个网站真棒!

Mylan

2 个回答

0

这个程序的基本步骤大概是这样的:

  1. 使用os模块来获取你感兴趣的目录里的文件名。
  2. 一次读取一个文件。
  3. 对文件中的每一行,用columns = line.split(",")把它分成几列。
  4. 使用datetime.date把像“2011-05-03”这样的字符串转换成日期格式。
  5. 把第二个日期减去第三个日期,这样就得到了一个时间间隔。
  6. 把你所有的信息整理成你想要的格式(提示:用str(foo)可以把几乎任何类型的东西变成字符串),然后记住这些信息以备后用。
  7. 关闭文件,再重新打开它进行写入,把你新的内容写进去。
7

在标准库里,有工具可以完成这些任务:

如果你想遍历一个文件夹里的所有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)

撰写回答