python

python分块读文件

2019-11-20  本文已影响0人  迷糊银儿

一、思路

  1. 分块读取文件的所有内容,按块为单位存入到队列中(块的大小=文件的总行数/线程数)
  2. 每个线程从队列中读数据(当然单位是原来的块)

如何实现分块读???

  1. 定义一个列表A,该列表存储每一个块的起始和终止位置。
  2. 根据列表A的元素(元素为列表,存储每一个块的起始和终止位置),读取文件,并将内容存储至队列(该队列为全局变量)中。

全部代码

import threading
import time
import queue

class Reader(threading.Thread):
    def __init__(self,Thread_id):
        super(Reader, self).__init__()
        self.Thread_id=Thread_id

    def run(self):
        global q
        temp_list=q.get()
        for text in temp_list:
            colums=text.split('\n')
            print ("Thread_id",self.Thread_id,' get了:',colums)

class PartionFile:
    def __init__(self,file_name,thread_num):
        self.file_name=file_name
        self.block_num=thread_num

    def partqueue(self):
        pos_list=[]
        file_size=self.getLines()         #
        block_size=file_size/self.block_num

        global q

        start_pos=0
        for i in range(self.block_num):       #总共需记录线程数个位置对
            if i==self.block_num-1:     #如果是文件的最后一块内动,则其end_pos=file_size-1
                end_pos=file_size-1
                pos_list.append((start_pos,end_pos))
                break
            end_pos=start_pos+block_size-1
            if end_pos>=file_size:
                end_pos=file_size-1
            if start_pos>=file_size:
                break
            pos_list.append((start_pos, end_pos))
            start_pos=end_pos+1


        fd=open(self.file_name)
        for pos_item in pos_list:       #根据位置对读源文件并把文件内容存储到队列中
            temp_text=[]
            start=pos_item[0]
            end=pos_item[1]
            while start<=end:
                text=fd.readline().strip('\n')
                temp_text.append(text)
                start=start+1
            q.put(temp_text)
        fd.close

    def getLines(self):       #获取一个文件有多少行
        count=0
        fo=open(self.file_name,'r')
        for line in fo.readlines():
            count=count+1
       # print (count)
        fo.close()
        return count

if __name__=='__main__':
    file_name='sing.txt'
    q = queue.Queue()
    thread_num=4
    p=PartionFile(file_name, 4)
    p.partqueue()

    t=[]
    for i in range(thread_num):
        t.append(Reader(i))
    for i in range(thread_num):
        t[i].start()
    for i in range(thread_num):
        t[i].join()


上一篇下一篇

猜你喜欢

热点阅读