首页 > 解决方案 > 在 csv 文件中添加一列,列值作为它所在的“文件夹”的名称

问题描述

我在每个文件夹中有多个文件夹和多个 csv 文件。我想在每个这些 csv 文件中添加一个列,其文件夹的名称是时间戳

例如:20211307

--abc.csv --def.csv

20211306

--abc.csv --def.csv

20211305

--abc.csv --def.csv

通过遍历文件夹和文件,可以使用 os.path 编写任何内容吗

标签: pythoncsvdirectoryiterationos.path

解决方案


如果您乐于使用pathlib而不是 os.path,并且乐于将每个文件作为 pandas DataFrame 处理,您可以

  • 遍历 .csv 文件的 glob(),
  • 将每个文件读入 DataFrame,
  • 插入具有文件父级名称的列,
  • 用修改后的 DataFrame 覆盖文件。这可能第一次无法正常工作,因此您需要在运行之前备份文件!更好的方法可能是使用新文件名写入,一旦您对结果感到满意,您可以回来整理以摆脱原始文件并在必要时重命名新文件。在下面的示例代码中,为了安全起见,我已经注释掉了会覆盖文件的关键行。即便如此,建议采取额外的安全措施,以确保只修改预期的文件,正如@timus所指出的那样

import pandas as pd    
from pathlib import Path

p = Path('.')

for fname in p.glob('**/*.csv'):
    print(fname.as_posix())
    parent = fname.parent.name
    df = pd.read_csv(fname)
    df.insert(0, 'parent', parent)
    print(df)
    ## df.to_csv(fname, index=False)

输出是这样的:

123/f2.csv
  parent  a
0    123  1
1    123  2
123/f1.csv
  parent  a
0    123  1
1    123  2
124/f2.csv
  parent  a
0    124  1
1    124  2
124/f1.csv
  parent  a
0    124  1
1    124  2

推荐阅读