需要在Python中的几个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

我有大约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”

我希望这是有意义的,如果没有,请让我知道。我有点不知所措,甚至不知道从哪里开始,所以我没有任何示例代码真正开始为我工作。真的很沮丧,所以我很感谢你们提供的任何帮助,这个网站真是棒极了


Mylan

该计划的基本大纲如下:

  • 使用操作系统模块从感兴趣的目录中获取文件名
  • 每次读取一个文件
  • 对于文件中的每一行,使用
    columns=line.split(“,”)
  • 使用datetime.date将字符串(如“2011-05-03”)转换为datetime.dates
  • 从第二个日期中减去第三个日期,这将生成datetime.timedelta
  • 将您的所有信息以您想要的格式(提示:str(foo)生成foo的字符串表示,对于几乎任何类型),并在以后记住它
  • 关闭您的文件,重新打开以进行写入,然后在中写入新内容

  • 标准库中有一个工具,用于执行以下任务:

    要迭代目录中的所有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)