You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python获取目录、读取CSV文件名并向对应文件写入前缀标识

问题描述

我是Python新手,拥有数百个文件夹,每个文件夹下有数千个包含时间序列数据的文件。每个文件的命名格式为「匿名唯一标识_文件编号.csv」(例如18667_0.csv、18667_1.csv)。我需要编写循环代码提取其中的唯一标识(如18667),并将其写入对应CSV文件的指定单元格中。目前已实现目录选择的部分代码,但无法正确组合读写逻辑完成任务,现有代码如下:

import tkinter as tk
import pandas as pd
from tkinter import filedialog
from os import listdir

def find_csv_filenames( path_to_dir, suffix=".csv" ):
    filenames = listdir(path_to_dir)
    return [ filename for filename in filenames if filename.endswith( suffix ) ]

root = tk.Tk()
root.withdraw()

folder_path = filedialog.askdirectory()
all_csvfiles = find_csv_filenames(folder_path, suffix= ".csv")

for filename in all_csvfiles:
    print(filename)
    a = filename
with open(a, 'w', newline="") as file:
    csvwriter = csv.writer(file) # 2. create a csvwriter object
    csvwriter.writerow(a)
解决方案

你的现有代码存在几个核心问题:

  • 循环结束后a仅保留最后一个文件名,无法批量处理所有文件
  • 使用w模式打开文件会直接清空原数据,而非修改指定单元格
  • 未导入csv模块却调用了csv.writer
  • 未实现从文件名提取唯一标识的逻辑

以下是修正后的完整代码,提供两种实现方式供你选择:

方式一:使用csv模块(适合处理大文件)

import tkinter as tk
import csv
from tkinter import filedialog
from os import listdir, path

def find_csv_filenames(path_to_dir, suffix=".csv"):
    filenames = listdir(path_to_dir)
    return [filename for filename in filenames if filename.endswith(suffix)]

root = tk.Tk()
root.withdraw()

folder_path = filedialog.askdirectory()
all_csvfiles = find_csv_filenames(folder_path, suffix=".csv")

for filename in all_csvfiles:
    # 从文件名提取唯一标识
    unique_id = filename.split('_')[0]
    # 拼接完整文件路径,避免路径错误
    full_file_path = path.join(folder_path, filename)
    
    # 读取原文件所有内容
    with open(full_file_path, 'r', newline="") as read_file:
        csv_reader = csv.reader(read_file)
        rows = list(csv_reader)
    
    # 将唯一标识写入指定单元格(示例:第一行第一列,索引从0开始)
    if rows:
        rows[0][0] = unique_id
    else:
        # 处理空文件,直接写入标识作为第一行
        rows.append([unique_id])
    
    # 将修改后的内容写回文件
    with open(full_file_path, 'w', newline="") as write_file:
        csv_writer = csv.writer(write_file)
        csv_writer.writerows(rows)
    
    print(f"已处理:{filename}")

print("所有文件处理完成!")

方式二:使用pandas(代码更简洁,适合数据量适中的场景)

import tkinter as tk
import pandas as pd
from tkinter import filedialog
from os import listdir, path

def find_csv_filenames(path_to_dir, suffix=".csv"):
    filenames = listdir(path_to_dir)
    return [filename for filename in filenames if filename.endswith(suffix)]

root = tk.Tk()
root.withdraw()

folder_path = filedialog.askdirectory()
all_csvfiles = find_csv_filenames(folder_path, suffix=".csv")

for filename in all_csvfiles:
    unique_id = filename.split('_')[0]
    full_file_path = path.join(folder_path, filename)
    
    # 读取CSV文件
    df = pd.read_csv(full_file_path)
    # 将唯一标识写入指定单元格(示例:第1行第1列,若要新增列可改为df['唯一标识'] = unique_id)
    df.iloc[0, 0] = unique_id
    # 写回文件,不保留索引列
    df.to_csv(full_file_path, index=False)
    
    print(f"已处理:{filename}")

print("所有文件处理完成!")

注意事项

  • 若要写入其他指定单元格,只需调整索引即可(如rows[2][3]代表第3行第4列,Python索引从0开始)
  • 如果需要给所有行添加唯一标识,可以遍历每一行进行赋值
  • 处理大量文件时,csv模块的内存占用更低,pandas则更易读易维护

内容的提问来源于stack exchange,提问作者Jason Johns

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:40:31