[本文出自天外歸雲的博客園]
題目要求:
1、統計英文文檔中每個單詞出現的次數。
2、統計結果先按次數降序排序,再按單詞首字母降序排序。
3、需要考慮大文件的讀取。
我的解法如下:
import chardet import re # 大文件讀取生成器 def read_big_file(f_path, chunk_size=100): f = open(f_path, 'rb') while True: # 每次讀取指定內存大小的內容 chunk_data = f.read(chunk_size) if not chunk_data: break # 獲取文件編碼並返回解碼后的字符串 detect = chardet.detect(chunk_data) # print(f'文件編碼:{detect["encoding"]}') yield chunk_data.decode(detect["encoding"]) # Pythonic大文件讀取生成器 def read_big_file_pythonic(f_path): with open(f_path, "rb") as f: for line in f.readlines(): yield line.decode() # 設定分詞符並用字典統計單詞出現次數 def words_freq(data, freq={}): for word in re.split('[,. ]', data): if word in freq: freq[word] += 1 elif word != "": freq[word] = 1 return freq if __name__ == '__main__': f_path = "en_text.txt" freq = {} for i in read_big_file_pythonic(f_path): freq = words_freq(i, freq) print(sorted(freq.items(), key=lambda x: (x[1], x[0]), reverse=True))
其中read_big_file方法存在的問題:按大小進行文件讀取可能會在邊界處將一個單詞拆分為兩個單詞,目前沒找到什么好辦法解決。
其中read_big_file_pythonic方法存在的問題:按行迭代讀取,如果大文件只有一行就不好了。
所以要看實際情況合理選擇兩種方法的使用。