说明
需求:把txt里的英语单词按照出现次数排序并生成csv文件,次数相同按单词的md5值排序
Python版本:3.10
Pycharm版本:PyCharm 2022.2.3 (Community Edition)
用到的包:csv, hashlib, pandas
开始实现
步骤1:读取txt文件,使用使用空格分词,得到单词列表 (如果有其他特殊符号,可以继续使用replace()
函数替换,暂时没有想到其他更好的方法,欢迎各位多多指教)
# 使用with open读取txt文本中的内容,txt_file_path是txt文本的路径
with open(txt_file_path, 'r', encoding='utf-8') as f:
txt_data = f.read()
# 把文本中的符号替换成空格
word_list = txt_data.replace('\n', ' ').replace(',', ' ').replace('.', ' ').split()
步骤2:统计每个单词出现的次数,保存在字典里 (字典的结构:{"单词1": 次数1, "单词2": 次数2}
)
# 统计单词次数
word_count = {}
for word in word_list:
if word in word_count:
# 如果字典中存在本次遍历的单词,则把对应的value值+1
word_count[word] += 1
else:
# 如果字典中不存在本次遍历的单词,则在字典中新增一个key-value
word_count[word] = 1
步骤3:构建一个pandas的数据帧,用于下一步的排序
# 使用单词,频次,MD5值构建一个pandas的数据帧
data_frame = {'word': [], 'count': [], 'MD5': []}
for key, value in zip(word_count.keys(), word_count.values()):
data_frame['word'].append(key)
data_frame['count'].append(value)
data_frame['MD5'].append(hashlib.md5(key.encode('utf-8')).hexdigest())
步骤4:使用pandas对数据进行分组、排序
如果有更好的方法欢迎留言分享,或者私信博主
data = pd.DataFrame(data_frame)
group_result = data.groupby(['count', 'MD5', 'word']) # 根据次数和MD5分组,排序
步骤5:把pandas分组排序后的结果提取出来,保存到list中
# 构造保存到csv文件的数据
csv_data = []
for word_info in list(group_result):
csv_data.append(word_info[0][::-1]) # 把排序后的结果提取出来存放到列表中
步骤6:把结果保存到csv文件中
# 结果写入csv文件(csv_file_path`是csv文件的路径)
with open(csv_file_path, 'w', encoding='utf-8', newline='') as f_w:
writer = csv.writer(f_w) # 构建一个写入csv文件的对象
writer.writerow(['word', 'count', 'MD5']) # 写入第一行标题
writer.writerows(csv_data) # 写入结果
完整代码 (欢迎大家留言讨论)
import csv
import hashlib
import pandas as pd
txt_file_path = 'source.txt' # 更换为自己的txt路径
csv_file_path = 'return.csv' # 更换为自己的csv路径
with open(txt_file_path, 'r', encoding='utf-8') as f:
txt_data = f.read()
word_list = txt_data.replace('\n', ' ').replace(',', ' ').replace('.', ' ').split()
# 统计单词次数
word_count = {}
for word in word_list:
if word in word_count:
word_count[word] += 1
else:
word_count[word] = 1
print(word_count)
# 使用单词,频次,MD5值构建一个pandas的数据帧
data_frame = {'word': [], 'count': [], 'MD5': []}
for key, value in zip(word_count.keys(), word_count.values()):
data_frame['word'].append(key)
data_frame['count'].append(value)
data_frame['MD5'].append(hashlib.md5(key.encode('utf-8')).hexdigest())
data = pd.DataFrame(data_frame)
group_result = data.groupby(['count', 'MD5', 'word']) # 根据次数和MD5分组,排序
# 构造最终结果
csv_data = []
for word_info in list(group_result):
csv_data.append(word_info[0][::-1])
# 最终结果写入csv
with open(csv_file_path, 'w', encoding='utf-8', newline='') as f_w:
writer = csv.writer(f_w)
writer.writerow(['word', 'count', 'MD5'])
writer.writerows(csv_data)