python多執行緒統計大檔案字數並對返回值進行計算

2022-09-22 00:06:26 字數 2590 閱讀 7153

# _*_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...