如何实现数据逐行写入CSV?现有代码未分行问题求助
问题排查与解决:CSV数据未按预期分行显示
问题背景
需求是将统计后的每个数据单独置于CSV文件的一行一列,但运行以下代码后数据未按预期分行:
from dataclasses import field, fields import os import csv import collections y=[] Dict_New=[] a=['Name','Count'] d={} path = r"C:\Users\piotr\Desktop\CV" files = os.listdir(path) files_file = [f for f in files if os.path.isfile(os.path.join(path, f))] print(files_file) # ['file1', 'file2.txt', 'file3.jpg'] for x in files_file: y.append(x[:-4]) print(y) Counter=collections.Counter(y) print(Counter) for key, values in Counter.items(): Dict_New.append({'Name': key, "Count": values}) print(Dict_New) with open ("test.csv",'w') as f: write = csv.DictWriter(f,fieldnames=a) write.writeheader() write.writerows(Dict_New)
问题排查
- 文件名切片逻辑错误:使用
x[:-4]固定截取倒数4位前的字符串,仅适配后缀为3个字符的文件(如.txt、.jpg),但像file1这类无后缀的文件会被截取为空字符串,导致统计结果出现无效空键,直接影响CSV内容的正确性。 - Windows下换行符异常:打开文件时未指定
newline='',在Windows系统中,csv模块自动处理换行符的逻辑会受影响,可能导致输出的CSV出现多余换行,看起来像是数据未分行。
修复方案
- 用
os.path.splitext()替代固定切片,正确提取不含后缀的文件名。 - 打开CSV文件时添加
newline=''参数,避免Windows系统下的换行符问题。
修复后的完整代码
import os import csv import collections # 初始化变量 y = [] Dict_New = [] fieldnames = ['Name', 'Count'] path = r"C:\Users\piotr\Desktop\CV" # 获取目录下所有文件 files = os.listdir(path) files_file = [f for f in files if os.path.isfile(os.path.join(path, f))] print(files_file) # ['file1', 'file2.txt', 'file3.jpg'] # 正确提取文件名(不含后缀) for x in files_file: filename = os.path.splitext(x)[0] y.append(filename) print(y) # 统计文件名出现次数 counter = collections.Counter(y) print(counter) # 转换为DictWriter需要的字典格式 for key, value in counter.items(): Dict_New.append({'Name': key, "Count": value}) print(Dict_New) # 写入CSV文件,指定newline=''避免Windows换行问题 with open("test.csv", 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows(Dict_New)
说明
修复后,代码会正确统计每个文件名(不含后缀)的出现次数,并将每个键值对写入CSV的单独一行,完全符合需求。
内容的提问来源于stack exchange,提问作者Piotr Sycz
相关产品推荐
相关产品推荐

