需要在Python中的几个CSV文件中的每一行上进行数学运算
我有大约100个CSV文件,我每个月都要处理一次,我当时正试图解决这个问题,但我遇到了麻烦。我开始了解Python的一些方面,但结合一些方面仍然会给我带来问题,所以我无法理解这一点 我的问题是: 我有许多CSV文件,以下是我需要完成的工作: 在每行的前面添加一个“列”(或后面,其实并不重要,但前面是理想的)。此外,每行有5行(不包括将添加的文件名),格式如下: 6位ID号,YYYY-MM-DD(1),YYYY-MM-DD(2),YYYY-MM-DD(3),1-2位数字 对于给定目录中的每个CSV,我需要从YYYY-MM-DD(2)中减去文件中的每一行(没有标题行) 我需要行内的文件名,因为我将组合文件(如果脚本中包含该文件,将非常棒,但我认为我可以找出这一部分),并且我需要知道记录来自哪个文件。文件名的格式始终为“4-5位数字.csv” 我希望这是有意义的,如果没有,请让我知道。我有点不知所措,甚至不知道从哪里开始,所以我没有任何示例代码真正开始为我工作。真的很沮丧,所以我很感谢你们提供的任何帮助,这个网站真是棒极了需要在Python中的几个CSV文件中的每一行上进行数学运算,python,csv,datestamp,Python,Csv,Datestamp,我有大约100个CSV文件,我每个月都要处理一次,我当时正试图解决这个问题,但我遇到了麻烦。我开始了解Python的一些方面,但结合一些方面仍然会给我带来问题,所以我无法理解这一点 我的问题是: 我有许多CSV文件,以下是我需要完成的工作: 在每行的前面添加一个“列”(或后面,其实并不重要,但前面是理想的)。此外,每行有5行(不包括将添加的文件名),格式如下: 6位ID号,YYYY-MM-DD(1),YYYY-MM-DD(2),YYYY-MM-DD(3),1-2位数字 对于给定目录中的每个CSV
Mylan该计划的基本大纲如下:
columns=line.split(“,”)
标准库中有一个工具,用于执行以下任务: 要迭代目录中的所有CSV文件,请使用: 要分析CSV文件,请使用: 要分析日期并计算差异,请使用: 要将值添加到行的开头,请执行以下操作:
row[0:0] = [str(delta)]
row.append(csvfilename)
要将文件名追加到行的末尾,请执行以下操作:
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)
我不明白为什么你需要在文件本身中包含文件名。打开文件时,您知道它的名称。
此外,每行有5行,您是指列吗?我最终会将所有文件合并为一个文件,因此我需要知道哪一行来自哪个文件。每个文件基本上概述了某个特定设施的一些数据,我需要知道这是用于哪个设施的,这就是为什么我希望在每一行中使用文件名。我是指专栏,对不起。我建议用替换第7步,把你的新东西写到一个临时文件中。然后8。将原始文件重命名为.bak后缀名
<代码>9。将临时文件重命名为原始文件名
。为了最大限度地降低数据丢失的风险。非常感谢,这是一个很大的帮助。非常感谢您提供的这些提示,我非常感谢您的指导。我试用了您的脚本,它似乎完全符合我的需要,但是当它到达第37行(“对于reader中的行:”),它会抛出错误“\u csv.error:迭代器应该返回字符串,而不是字节(你是在文本模式下打开文件的吗?)。我正在使用Mac OS 10.6和Python 3.2.1,如果这有什么不同的话。谢谢,我现在终于开始使用了。我忽略了更改“组合文件”\u csv从一个字符串到一个实际的文件。现在工作起来很有魅力,非常感谢!这也让我了解了如何在csv上定期执行其他任务。啊,是的;在Python 3中,csv模块的工作方式有点不同;您不以二进制模式打开文件,而且还有一个额外的参数换行符
;请参阅。您也可以这样做open(“file.csv”、“w”,newline=”“)
和writer=csv.writer(outfile,delimiter=“”)
。在使用python
标记的同时使用python-3.x
标记是一个好主意,因为没有它,大多数人都认为你在谈论python 2。再次感谢你,我仍在努力适应两者的差异。我想用python 3来证明自己是最好的,但这有点棘手有时,我发现我引用的大多数信息都是为2.x编写的,我必须将其更改为与3.x一起使用。感谢所有的帮助!
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)