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

Python逐行写入CSV:解决MP4文件名写入列而非行的问题

问题修复方案

问题根源

你的代码存在两个核心问题导致所有文件名被写入同一行的不同列:

  1. 文件打开时机错误:把with open(...)放在for循环内部,每次循环都会重新打开文件并覆盖之前内容,且每次调用writerow(path_and_label)时,会将列表中所有元素作为同一行的多列写入。
  2. 路径不一致: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:47:12