编辑csv以按特定顺序显示5列,同时将格式应用于date时间字段

我有一个130 excel文件,所有被称为cplt.csv每个存储在BM文件夹下的两个子文件夹下。 即BM / 1/1 / cplt.csv BM / 2/2 / cplt.csv等等

我需要阅读每个这些csv文件,并将其从7列更改为5列。 我需要列的顺序是第七,第三,第二,第一和第六。

第一列是date时间字段,目前看起来像8/22/2015 1:19:01 AM我需要它看起来像这样 – > 2015年8月22日01.19.01或遵循ISO格式(“yyyy-MM- dd'T'HH:MM:SSZ“)。

我有两个问题,我看到它,1)我目前无法访问我的BM文件夹下的所有cplt.csv文件。 2)我不知道如何将date时间更改为我所需要的ISO格式,并将其输出回相同的csv文件。

我目前得到的代码如下:

import sys, argparse, csv, os for file in os.listdir("BM"): if file.endswith(".csv"): with open(file, 'rb') as csvfile: for line in csvfile.readlines(): array = line.split(',') newline = array[6] + "," + array[2] + "," + array[1] + "," + array[0] + "," + array[5] 

遍历每个目录并在每个文件上运行这个函数, datetime.strptime将parsing你的date并转换为isoformatitemgetter将取出你想要保留的任何列,我们使用NamedTemporaryFile写入临时文件,之后写入新内容我们用shutil.movereplace原始文件:

 def change_file(in_file,cols): with open(in_file) as f, NamedTemporaryFile("w", dir=".", delete=False) as tmp: r = csv.reader(f) wr = csv.writer(tmp) for row in r: new = [datetime.strptime(dt, "%m/%d/%Y %H:%M:%S %p").isoformat() for dt in itemgetter(*cols)(row)] wr.writerow(new) move(tmp.name, in_file) 

现在要find嵌套在子目录中的csv文件,我们可以使用pathlib :

 from pathlib import Path for fle in Path('./BM').glob('**/*.cplt.csv '): change_file(str(fle), (7, 3, 2, 1, 6)) 

使用相同的结构和几个testing文件:

 In [41]: ls BM/ test.py In [35]: ls BM 1/ 2/ In [36]: ls BM/2/ 2/ In [37]: ls BM/2/2/ file2.csv In [38]: cat BM/2/2/file2.csv 8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM 8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM,8/22/2015 1:19:01 AM In [39]: for fle in Path('./BM').glob('**/*.csv'): print(str(fle)) change_file(str(fle), (7, 3, 2, 1, 6)) ....: BM/2/2/file2.csv BM/1/1/file1.csv In [40]: cat BM/2/2/file2.csv 2015-08-22T01:19:01,2015-08-22T01:19:01,2015-08-22T01:19:01,2015-08-22T01:19:01,2015-08-22T01:19:01 2015-08-22T01:19:01,2015-08-22T01:19:01,2015-08-22T01:19:01,2015-08-22T01:19:01,2015-08-22T01:19:01