需要在多个CSV文件的每一行上做数学运算 Python
我每个月需要处理大约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
这个程序的基本步骤大概是这样的:
- 使用os模块来获取你感兴趣的目录里的文件名。
- 一次读取一个文件。
- 对文件中的每一行,用
columns = line.split(",")
把它分成几列。 - 使用datetime.date把像“2011-05-03”这样的字符串转换成日期格式。
- 把第二个日期减去第三个日期,这样就得到了一个时间间隔。
- 把你所有的信息整理成你想要的格式(提示:用str(foo)可以把几乎任何类型的东西变成字符串),然后记住这些信息以备后用。
- 关闭文件,再重新打开它进行写入,把你新的内容写进去。
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)