python 超大txt 按行分塊多線程讀取


首先:使用ultra edit 打開獲取txt行數;

然后:確定開啟的線程數量,計算每個線程讀取txt的行數設置為n_size

import time, threading
import pandas as pd
from itertools import islice

'''
Reader類,繼承threading.Thread
@__init__方法初始化
@run方法實現了讀文件的操作
'''
class Reader(threading.Thread):
  def __init__(self, file_name, n, nlong):
    super(Reader, self).__init__()
    self.file_name = file_name
    self.n = n
    self.nlong = nlong
    self.data = pd.DataFrame(columns=[
    '發展渠道編碼(全渠道)','發展渠道名稱','客戶id(脫敏后的移動用戶識別碼)','年齡','性別','產品名稱(201907)','檔位(201907)','出賬收入(201907)','產品名稱(201908)','檔位(201908)','出賬收入(201908)','產品名稱(201909)','檔位(201909)','出賬收入(201909)','產品名稱(201910)','檔位(201910)','出賬收入(201910)','產品名稱(201911)','檔位(201911)','出賬收入(201911)','產品名稱(201912)','檔位(201912)','出賬收入(201912)','入網時間','離網時間	取唯一標識','2019年7月','工作地的經緯度網格','2019年7月居住地的經緯度網格','2019年8月工作地的經緯度網格','2019年8月居住地的經緯度網格','2019年9月工作地的經緯度網格','2019年9月居住地的經緯度網格','2019年10月工作地的經緯度網格','2019年10月居住地的經緯度網格','2019年11月工作地的經緯度網格','2019年11月居住地的經緯度網格','2019年12月工作地的經緯度網格','2019年12月居住地的經緯度網格','2019年11月每個周六10:00-15:00出現頻次最多位置的經緯度網格','2019年11月每個周日10:00-15:00出現頻次最多位置的經緯度網格','2019年12月每個周六10:00-15:00出現頻次最多位置的經緯度網格','2019年12月每個周日10:00-15:00出現頻次最多位置的經緯度網格'])

  
  def run(self):
      for line in islice(open(self.file_name,'r',encoding='utf-8'),self.n,self.nlong): 
          print(self.n)
      self.data.loc[self.n] = line.split('|')
          self.n = self.n+1
      return self.data
    
  
if __name__ == '__main__':
    
    file_name = r'E:\work\渠道規划\2020年聯通營業廳規划\甲方數據\移網話單數據.rar,北京漁網-面.rar,字段名稱.xlsx\移網話單數據\YYT_ZHB1.txt'
    
    #線程數量
    thread_num = 500
    #起始時間
    start_time = time.clock()
    
    #txt按行切分n_start 起始行,n_end 終止行,n_size 切分行數
    n_size= 33101
    n_start = [x*n_size for x in range(thread_num)]
    n_end = [(x+1)*n_size for x in range(thread_num)]
    t = []

    #生成線程
    for i in range(thread_num):
      t.append(Reader(file_name, n_start[i],n_end[i]))
    #開啟線程
    for i in range(thread_num):
      t[i].start()
    for i in range(thread_num):
      t[i].join()
    #結束時間
    end_time = time.clock()
    print ("Cost time is %f" % (end_time - start_time))
    
    data = pd.DataFrame(columns=[
    '發展渠道編碼(全渠道)','發展渠道名稱','客戶id(脫敏后的移動用戶識別碼)','年齡','性別','產品名稱(201907)','檔位(201907)','出賬收入(201907)','產品名稱(201908)','檔位(201908)','出賬收入(201908)','產品名稱(201909)','檔位(201909)','出賬收入(201909)','產品名稱(201910)','檔位(201910)','出賬收入(201910)','產品名稱(201911)','檔位(201911)','出賬收入(201911)','產品名稱(201912)','檔位(201912)','出賬收入(201912)','入網時間','離網時間	取唯一標識','2019年7月','工作地的經緯度網格','2019年7月居住地的經緯度網格','2019年8月工作地的經緯度網格','2019年8月居住地的經緯度網格','2019年9月工作地的經緯度網格','2019年9月居住地的經緯度網格','2019年10月工作地的經緯度網格','2019年10月居住地的經緯度網格','2019年11月工作地的經緯度網格','2019年11月居住地的經緯度網格','2019年12月工作地的經緯度網格','2019年12月居住地的經緯度網格','2019年11月每個周六10:00-15:00出現頻次最多位置的經緯度網格','2019年11月每個周日10:00-15:00出現頻次最多位置的經緯度網格','2019年12月每個周六10:00-15:00出現頻次最多位置的經緯度網格','2019年12月每個周日10:00-15:00出現頻次最多位置的經緯度網格'])   
    for i in t:
        data = data.append(i.data)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM