Python逐行写入CSV:解决MP4文件名写入列而非行的问题
问题修复方案
问题根源
你的代码存在两个核心问题导致所有文件名被写入同一行的不同列:
- 文件打开时机错误:把
with open(...)放在for循环内部,每次循环都会重新打开文件并覆盖之前内容,且每次调用writerow(path_and_label)时,会将列表中所有元素作为同一行的多列写入。 - 路径不一致:
os.listdir使用的路径是/mnt/storage/user/...,但os.path.join用的是/mnt/storage_6TB/user/...,属于笔误,会导致路径错误。
修复后的代码(逐行写入版)
这种方式适合处理大量文件,避免占用过多内存:
import csv import os # 统一基础路径,避免笔误 base_path = "/mnt/storage/user/kinetics400/train_256/abseiling" output_csv = "/mnt/storage/user/kinetics400/my_kinetics.csv" # 打开CSV文件(仅执行一次) with open(output_csv, 'w', newline='') as f: writer = csv.writer(f, lineterminator='\n') # 可选:写入表头(根据需求开启) # writer.writerow(["完整路径", "标签"]) for file in os.listdir(base_path): if file.endswith(".mp4"): # 生成完整文件路径 full_address = os.path.normpath(os.path.join(base_path, file)) # 获取标签(原代码通过路径索引,若base_path最后一级就是标签,可替换为Label = os.path.basename(base_path)) path_components = full_address.split(os.sep) Label = path_components[6] # 写入单行: # 若要路径和标签分两列,用[full_address, Label] # 若要两者合并为一列,用[full_address + ' ' + Label] writer.writerow([full_address, Label])
修复后的代码(批量写入版)
适合数据量较小的场景,先收集所有数据再一次性写入:
import csv import os base_path = "/mnt/storage/user/kinetics400/train_256/abseiling" output_csv = "/mnt/storage/user/kinetics400/my_kinetics.csv" data_list = [] # 先收集所有MP4文件的信息 for file in os.listdir(base_path): if file.endswith(".mp4"): full_address = os.path.normpath(os.path.join(base_path, file)) path_components = full_address.split(os.sep) Label = path_components[6] # 每个元素对应一行数据 data_list.append([full_address, Label]) # 一次性写入所有数据 with open(output_csv, 'w', newline='') as f: writer = csv.writer(f, lineterminator='\n') # 可选写入表头 # writer.writerow(["完整路径", "标签"]) writer.writerows(data_list)
关键修改点
- 将文件打开操作移到
for循环外部,确保只创建一次文件,避免重复覆盖。 - 使用
writerow(单个条目列表)确保每个文件信息对应单独一行:列表内的元素数量决定列数,单元素列表对应一列一行,多元素对应多列一行。 - 统一了基础路径,修复了原代码中的路径笔误。
内容的提问来源于stack exchange,提问作者dtr43
相关产品推荐
相关产品推荐

