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

如何将多个词频降序排列的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:52:38