如何用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
相关产品推荐
相关产品推荐

