# _*_coding:utf-8_*_import time
import threading
import configparser
import os
from datetime import datetime
class mythread(threading.thread):
def __init__(self, func, args=()):
super(mythread, self).__init__()
self.func = func
self.args = args
self.result = none
def run(self):
self.result = self.func(*self.args)
def get_result(self):
try:
return self.result
except exception as e:
return none
def word_count(file, start, size):
# print("移動的大小", size)
words = {}
# 分段時以 rb 形式開啟,所以這裡也要以rb開啟,否則資料不對
with open(file, 'rb') as fd:
fd.seek(start, 0)
# print("移動前位置", k)
lines = fd.read(size)
# 把 byte 轉換成 string 指定編碼格式
lines = str(lines, encoding='gbk')
for l in lines:
for w in l:
if w not in words:
words[w] = 1
else:
words[w] += 1
fd.close()
return words
"""tell():返回檔案讀取指標的位置
seek()的三種模式:(如果offset的值非零的時候,一定要以 b 的方式開啟,否則則丟擲 io.unsupportedoperation 錯誤)
(1)f.seek(p,0) 移動當檔案第p個位元組處,絕對位置
(2)f.seek(p,1) 移動到相對於當前位置之後的p個位元組
(3)f.seek(p,2) 移動到相對文章尾之後的p個位元組
"""
def chunk_file(file, size=1024*1024*20):
if not os.path.exists(file):
exit("file not exists")
else:
size_count = os.path.getsize(file)
with open(file, 'rb') as f:
end = 0
while true:
start = end
f.seek(size, 1)
end = f.tell()
yield start, end - start
if end >= size_count:
break
f.close()
if __name__ == '__main__':
'''讀取配置檔案
'''config = configparser.configparser()
config.read('conf.ini')
# 檔名
file_name = config.get('info', 'filename')
# 執行緒數量
thread_num = int(config.get('info', 'threadnum'))
# 起始時間
start_time = datetime.now()
t =
for start, size in chunk_file(file_name):
th = mythread(word_count, args=(file_name, start, size,))
th.start()
th.join()
results = {}
for k in t:
k.join()
result = k.get_result()
for i, v in result.items():
if i in results:
results[i] += v
else:
results[i] = v
print(results)
end_time = datetime.now()
print(end_time - start_time)
conf.ini
[info]filename=d:\files\projects\test\word_deal\result.txt
threadnum=5
結論:如果你也測試了,請在下方讓我知道你的測試結果
Python 多執行緒統計所有csv檔案的行數
統計某資料夾下的所有csv檔案的行數 多執行緒 import threading import csv import os class mythreadline threading.thread 用於統計csv檔案的行數的執行緒類 def init self,path threading.threa...
python多執行緒讀取檔案
coding utf 8 importos,time import threading rlock threading rlock curposition 0 class reader threading thread def init self res self res res super rea...
python 多執行緒寫入檔案
python 多執行緒寫入檔案 在python中,對檔案的操作時很簡潔的,一般是通過開啟檔案,獲取檔案物件,然後對檔案物件進行寫入。這是file 的一些常用方法 class file object def close self real signature unknown restored from...