如何将多个词频降序排列的CSV文件合并为单个CSV文件
合并多个词频CSV文件的解决方案
看了下你的freq_sort函数,它生成的FREQ文件其实是把Counter的结果转成字符逐个写入的(比如遇到)就换行,最终内容类似(('calvià', 1428) , ('ajuntament', 602) , ...)),不是标准的CSV结构。为了后续合并更顺畅,我给你两种方案:一种是先调整原函数生成标准CSV,再合并;另一种是直接读取现有非标准文件进行合并。
方案一:先优化词频生成函数(推荐)
先把你的freq_sort改成生成标准CSV格式(每行是单词,词频),这样后续读取和合并会更简单:
import csv from collections import Counter from itertools import chain, takewhile def truth(x): # 这里假设你的truth函数是判断行非空,有其他逻辑可以自行调整 return bool(x.strip()) if isinstance(x, str) else bool(x) def freq_sort(name): with open(f"CSV_{name[:-4]}.csv", encoding='utf-8') as f: reader = csv.reader(f, delimiter=',') counter = Counter(chain.from_iterable(takewhile(truth, reader))) print("freq list created") # 写入标准CSV,每行对应一组单词和词频 with open(f"FREQ_{name}", 'w', encoding='utf-8', newline='') as writefreq: writer = csv.writer(writefreq) # 可选:写入表头,不需要就注释掉这行 writer.writerow(['单词', '词频']) for word, count in counter.most_common(): writer.writerow([word, count])
修改后生成的FREQ文件会是这种标准结构:
单词,词频 calvià,1428 ajuntament,602 amb,79 ...
然后编写合并函数
这个函数会遍历所有FREQ_开头的CSV,累加相同单词的词频,最后按总词频降序输出:
import os import csv from collections import Counter def merge_freq_csvs(output_filename="merged_freq.csv"): total_counter = Counter() # 遍历当前目录下所有目标CSV文件 for filename in os.listdir('.'): if filename.startswith('FREQ_') and filename.endswith('.csv'): print(f"正在处理文件: {filename}") with open(filename, encoding='utf-8') as f: reader = csv.reader(f) # 跳过表头(如果没写表头就注释掉这行) next(reader) for row in reader: if len(row) != 2: continue # 跳过无效行 word, count = row try: total_counter[word] += int(count) except ValueError: print(f"跳过无效数据行: {row}") # 写入合并后的结果 with open(output_filename, 'w', encoding='utf-8', newline='') as out_f: writer = csv.writer(out_f) writer.writerow(['单词', '总词频']) for word, total_count in total_counter.most_common(): writer.writerow([word, total_count]) print(f"合并完成!结果已保存到 {output_filename}")
方案二:直接读取现有非标准文件
要是你不想修改之前的freq_sort函数,可以直接解析那些包含元组列表字符串的文件:
import os from collections import Counter def parse_non_std_freq_file(filename): counter = Counter() with open(filename, encoding='utf-8') as f: content = f.read().strip() # 去掉换行和多余空格,把内容还原成完整的列表字符串 content = content.replace('\n', '').replace(' ', '') # 用eval解析字符串为列表(注意:仅当文件是自己生成的安全内容时使用) try: freq_list = eval(content) for word, count in freq_list: counter[word] += count except Exception as e: print(f"解析文件 {filename} 出错: {e}") return counter def merge_non_std_freq_files(output_filename="merged_freq.csv"): total_counter = Counter() for filename in os.listdir('.'): if filename.startswith('FREQ_') and filename.endswith('.csv'): print(f"正在处理文件: {filename}") file_counter = parse_non_std_freq_file(filename) total_counter.update(file_counter) # 写入标准CSV with open(output_filename, 'w', encoding='utf-8', newline='') as out_f: out_f.write("单词,总词频\n") for word, total_count in total_counter.most_common(): out_f.write(f"{word},{total_count}\n") print(f"合并完成!结果已保存到 {output_filename}")
注意事项
- 用
eval解析非标准文件时,一定要确保文件是你自己生成的,没有恶意代码,避免安全风险。 - 如果单词中包含逗号(词频统计中很少见),务必用
csv.writer写入,不要直接拼接字符串,避免格式错误。
内容的提问来源于stack exchange,提问作者texxter
相关产品推荐
相关产品推荐

