如何用Python将TXT内容写入CSV单单元格并关联文件名
问题解决思路与修正代码
为啥会出问题?
- 文本被拆成单个字符:
writerow()函数需要接收列表/元组这类可迭代对象,直接传字符串的话,它会把每个字符当成单独的单元格内容,自然就拆得稀碎。必须把文件名和文本打包成一个列表传进去。 - 没包含文件名:之前的代码只写了文本内容,没把当前处理的文件名一起写入,循环时把文件名和文本放在同一行就行。
顺便优化的小细节
- 原代码里
file_list在os.walk循环内初始化,会导致最后只保留最后一个目录下的TXT文件,得把file_list = []移到循环外面。 - 每次循环都打开关闭CSV文件太折腾,不如一次性打开,写完所有内容再关闭,效率更高。
- 加个CSV表头,打开文件时能一眼分清列的含义。
修正后的完整代码
import os import csv # 直接导入csv模块更规范 # 目标文件夹路径 path = "/Users/dominik/nltk_data/corpora/my_corpus" file_list = [] # 遍历文件夹收集所有TXT文件 for root, dirs, files in os.walk(path): for file_name in files: if file_name.endswith('.txt'): file_list.append(file_name) print("收集到的TXT文件:", file_list) # 切换到目标目录 os.chdir(path) # 写入CSV:先写表头,再循环写入每个文件的文件名和文本 with open('test.csv', 'w', newline='', encoding='utf-8') as output: writer_obj = csv.writer(output) # 写入表头 writer_obj.writerow(["文件名", "文本内容"]) # 循环处理每个TXT文件 for file_name in file_list: with open(file_name, 'r', encoding='utf-8') as input_file: txt_content = input_file.read() # 把文件名和文本打包成列表,作为一行写入 writer_obj.writerow([file_name, txt_content]) print("文件写入完成!")
代码说明
- 收集文件:把
file_list初始化移到os.walk外面,确保能收集到所有子目录下的TXT文件。 - 写入逻辑:
writerow([file_name, txt_content])会把文件名放到第一列,完整文本放到第二列,彻底解决字符拆分的问题。newline=''是为了避免Windows系统下CSV出现空行。- 指定
encoding='utf-8'保证中文等特殊字符能正常写入。
- 效率提升:只打开一次CSV文件,循环写入所有内容,比每次打开关闭更省资源。
修改后输出的CSV就完全符合你的预期:第一列是文件名,第二列是完整的文本内容,不会再出现字符拆分的情况。
内容的提问来源于stack exchange,提问作者Dominik
相关产品推荐
相关产品推荐

