亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何實現Python的多處理池來轉換數千個文件

如何實現Python的多處理池來轉換數千個文件

蝴蝶不菲 2022-08-02 15:51:34
我有一個Python腳本,可以在包含超過10,000個DBF文件的目錄中讀取,以便將它們轉換為CSV。我想將此任務視為一般化,而不是單獨轉換每個文件。我已經閱讀了Python的多處理模塊,盡管我在實現此任務時遇到了一些麻煩。具體來說,我想使用 Pool 類在 CPU 內核之間分配工作負載。這是我到目前為止的代碼:import osfrom dbfread import DBFimport pandas as pdimport multiprocessingdirectory = 'C:\\Path_to_DBF_Files' #define file directory files_in = os.listdir(directory) #store files in directory to list def convert():    for file in files_in:        if file.startswith('D') and file.endswith('.DBF'): #define parameters of filenames to convert            file_path = os.path.join(files_in, file)            print(f'\nReading in {file}...')            dbf = DBF(file_path) #create DBF object             dbf.encoding = 'utf-8' #set encoding attribute to utf-8 instead of acsii             dbf.char_decode_errors = 'ignore' #set decoding errors attribute to ignore any errors and read in DBF file as is             print('\nConverting to DataFrame...')            df = pd.DataFrame(iter(dbf)) #convert to Pandas dataframe             df.columns.astype(str) #convert column datatypes to string            print(df)            print('\nWriting to CSV...')            dest_directory = 'C:\\Path_to_output_directory\\%s.csv' % ('D' + file.strip('.DBF')) #define destination directory and names for output files             df.to_csv(dest_directory, index = False)            print(f'\nConverted {file} to CSV. Moving to next file...')        elif file.startswith('B') and file.endswith('.DBF'): #define parameters for unnecessary files             print('\nB file not needed.')            continue        elif file.endswith('.FPT'): #skip FPT files             print('Skipping FPT file.')            continue我在StackOverflow上讀到了一些與我的問題有些相似的答案;但是,我沒有看到任何適用于我的特定任務的內容。如何改進代碼,使腳本同時處理多個文件,而不是一次只讀取和轉換一個文件?感謝您提供的任何幫助。
查看完整描述

1 回答

?
MM們

TA貢獻1886條經驗 獲得超2個贊

一些一般指導:

  1. 您正在創建一個池。池大小應取決于計算機,而不是作業的大小。例如,您希望池中有 4 個進程而不是 10000 個進程,即使您有 10000 個文件要處理

  2. 在每個進程上運行的作業應該簡單但已參數化。在您的例子中,創建一個函數來獲取文件名作為輸入并執行轉換。然后將輸入文件映射到其中。過濾應在調用之前完成。map

因此,我會將您的代碼轉換為如下所示的內容:

import os

from dbfread import DBF

import pandas as pd

import multiprocessing


directory = 'C:\\Path_to_DBF_Files' #define file directory 


files_in = os.listdir(directory) #store files in directory to list 


def convert(file):

    file_path = os.path.join(files_in, file)

    print(f'\nReading in {file}...')

    dbf = DBF(file_path) #create DBF object 

    dbf.encoding = 'utf-8' #set encoding attribute to utf-8 instead of acsii 

    dbf.char_decode_errors = 'ignore' #set decoding errors attribute to ignore any errors and read in DBF file as is 

    print('\nConverting to DataFrame...')

    df = pd.DataFrame(iter(dbf)) #convert to Pandas dataframe 

    df.columns.astype(str) #convert column datatypes to string

    print(df)

    print('\nWriting to CSV...')

    dest_directory = 'C:\\Path_to_output_directory\\%s.csv' % ('D' + file.strip('.DBF')) #define destination directory and names for output files 

    df.to_csv(dest_directory, index = False)

    print(f'\nConverted {file} to CSV. Moving to next file...')


pool = multiprocessing.Pool(processes = 4)

pool.map(convert, [file for file in files_in if file.startswith('D') and file.endswith('.DBF')])

查看完整回答
反對 回復 2022-08-02
  • 1 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號