如何用代码读取并统计超大规模列表?2000万条姓名数据处理需求
高效处理千万级姓名数据集的Python方案
嘿,针对你手里2000万条姓名的数据集处理需求,我推荐用Python来搞定——毕竟之前用bat和PowerShell卡壳了,Python处理这类大文本数据的效率和灵活性都靠谱得多。核心思路就是先统计所有姓名的出现次数,再筛选出符合次数要求的条目写入新文件,下面给你两种实用的代码方案,按需选择:
基础通用版(适合大多数场景)
这个方案用collections.Counter来统计次数,代码简洁易读,内存占用在合理范围内(毕竟姓名重复率通常不低):
from collections import Counter def filter_names(input_file, output_file, min_count): # 第一步:统计所有姓名的出现次数 print("正在统计姓名出现次数...") name_counter = Counter() with open(input_file, 'r', encoding='utf-8') as f: for line in f: name = line.strip() if name: # 跳过空行,避免无效统计 name_counter[name] += 1 # 第二步:筛选符合条件的内容并写入新文件 print(f"正在筛选出现次数≥{min_count}的姓名...") with open(output_file, 'w', encoding='utf-8') as out_f: # 如果你需要输出姓名+次数(CSV格式),用下面的代码 out_f.write("姓名,出现次数\n") for name, count in name_counter.items(): if count >= min_count: out_f.write(f"{name},{count}\n") # 如果你只需要输出姓名(每行一条),替换成这段: # for name, count in name_counter.items(): # if count >= min_count: # out_f.write(f"{name}\n") if __name__ == "__main__": # 这里直接修改成你的文件路径和阈值 INPUT_FILE = "你的姓名文件.txt" # CSV格式也可以,只要每行一条姓名 OUTPUT_FILE = "筛选后的结果.csv" MIN_OCCURRENCE = 3 # 替换成你需要的x值 filter_names(INPUT_FILE, OUTPUT_FILE, MIN_OCCURRENCE) print("处理完成!")
内存优化版(适合极端多重复率低的场景)
如果你的数据集里不同姓名特别多,担心内存不够用,可以用分两次遍历文件的方式,先统计次数再筛选,内存占用会更低:
def count_name_frequency(input_file): name_counts = {} with open(input_file, 'r', encoding='utf-8') as f: for line in f: name = line.strip() if name: name_counts[name] = name_counts.get(name, 0) + 1 return name_counts def write_filtered_names(input_file, output_file, name_counts, min_count): with open(input_file, 'r', encoding='utf-8') as f, open(output_file, 'w', encoding='utf-8') as out_f: out_f.write("姓名,出现次数\n") written_names = set() # 避免重复写入同一个姓名 for line in f: name = line.strip() if name and name not in written_names: count = name_counts.get(name, 0) if count >= min_count: out_f.write(f"{name},{count}\n") written_names.add(name) if __name__ == "__main__": INPUT_FILE = "你的姓名文件.txt" OUTPUT_FILE = "筛选后的结果.csv" MIN_OCCURRENCE = 3 print("正在统计姓名次数...") frequency_dict = count_name_frequency(INPUT_FILE) print("正在筛选并写入结果...") write_filtered_names(INPUT_FILE, OUTPUT_FILE, frequency_dict, MIN_OCCURRENCE) print("搞定啦!")
针对CSV格式的特殊处理
如果你的原始文件是带表头的CSV(比如第一列是姓名),可以用Python的csv模块更规范地处理:
import csv from collections import Counter def filter_csv_names(input_file, output_file, min_count): name_counter = Counter() # 读取CSV统计姓名次数 with open(input_file, 'r', encoding='utf-8') as f: reader = csv.reader(f) next(reader) # 跳过表头行 for row in reader: if row: name = row[0].strip() name_counter[name] += 1 # 写入筛选后的CSV结果 with open(output_file, 'w', encoding='utf-8', newline='') as out_f: writer = csv.writer(out_f) writer.writerow(["姓名", "出现次数"]) for name, count in name_counter.items(): if count >= min_count: writer.writerow([name, count]) if __name__ == "__main__": filter_csv_names("原始姓名数据.csv", "筛选结果.csv", 3)
几个关键注意事项
- 编码问题:如果你的文件不是UTF-8编码(比如Windows常用的GBK),把代码里的
encoding='utf-8'改成encoding='gbk'即可,避免乱码。 - 文件路径:如果文件不在代码同一目录,要写绝对路径,比如Windows的
C:/Users/xxx/names.txt,或者Linux/macOS的/home/xxx/names.txt。 - 性能说明:2000万条数据的处理时间大概在几分钟(取决于电脑CPU和硬盘速度),比bat/PowerShell快很多,因为Python的底层循环是C实现的,效率更高。
内容的提问来源于stack exchange,提问作者Aristocrat Cash
相关产品推荐
相关产品推荐

