我有大约 100 个 CSV 文件,我每个月必须对其进行一次操作,我正试图解决这个问题,但我遇到了困难。我开始了解有关 Python 的一些事情,但结合几件事仍然给我带来问题,所以我无法弄清楚。
这是我的问题:
我有很多 CSV 文件,这是我需要做的:
在每一行的前面添加一个“列”(或后面,真的不重要,但前面是理想的)。此外,每行有5行(不包括将添加的文件名),格式如下:
6位身份证号码,YYYY-MM-DD(1),YYYY-MM-DD(2),YYYY-MM-DD(3),1-2位号码
对于给定目录中的每个 CSV,我需要从文件中的每一行(没有标题行)的 YYYY-MM-DD(2) 中减去 YYYY-MM-DD(3)。
我需要行内的文件名,因为我将合并文件(如果包含在脚本中会很棒,但我想我可以弄清楚那部分),我需要知道记录来自哪个文件从。文件名的格式总是'4-5-digit-number.csv'
我希望这是有道理的,如果没有,请告诉我。我什至不知道从哪里开始,所以我没有任何真正开始为我工作的示例代码。真的很沮丧,所以我很感谢你们提供的任何帮助,这个网站太棒了!
迈兰
最佳答案
标准库中有一个工具可以完成这些任务:
要遍历目录中的所有 CSV 文件,请使用 glob
module :
import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
#do_something
要解析 CSV 文件,请使用 csv
module :
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
module :
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)
关于python - 需要对 Python 中的几个 CSV 文件中的每一行进行数学运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7350851/