Python 多进程 处理 CSV 文件 (读取/判读/写入)

import multiprocessing,os,csv,re
def read_all_csv_file(csv_file_root_path):
    file_list = os.listdir(csv_file_root_path)
    
    return file_list
def write_csv(new_file_name,Dictfiles):
    print("新建",new_file_name,"csv文件")
    with open(new_file_name,'w',newline='') as f:
        print("开始写入数据>>>>>>>>>>>>>>>>>>>>")
        print("写入表头字段>>>>>>>>>>>>>>>>>>>>")
        headers = ['ShipName', 'IMO', 'ShipTypeEN', 'Speed', 'Lon', 'Lat', 'Dest', 'ETA', 'UnixTime', 'Lon_d', 'Lat_d']
        writer = csv.DictWriter(f,fieldnames=headers)
        writer.writeheader()
        print("表头字段写入完毕----------------")
        print("开始写入表体数据>>>>>>>>>>>>>>>>>>>>")

        
        writecount = 0
        sumcount = len(Dictfiles)
        print("表体数据共计", sumcount, "条")
        
        for Dictfile in Dictfiles:
            writecount +=1
            print("当前写入第", writecount,"/",sumcount, "条")
            # print(">>>>>This is Dictfile>>>>>", Dictfile)
            writer.writerow(Dictfile)
def OrderDictRow_To_Dict(item):
    directItem = {}
    directItem["ShipName"]=item["ShipName"]
    directItem["IMO"]=item["IMO"]
    directItem["ShipTypeEN"]=item["ShipTypeEN"]
    directItem["Speed"]=item["Speed"]
    directItem["Lon"]=item["Lon"]
    directItem["Lat"]=item["Lat"]
    directItem["Dest"]=item["Dest"]
    directItem["UnixTime"] = item["UnixTime"]
    directItem["ETA"]=item["ETA"]
    directItem["Lon_d"]=item["Lon_d"]
    directItem["Lat_d"]=item["Lat_d"]
    return directItem
def range_dect(lat,lon):
    lat_N: float = 40.933
    lon_E: float = 122.133
    lat_S: float = 37.117
    lon_W: float = 117.55
    
    if lat<lat_N and lat>lat_S:
        if lon<lon_E and lon>lon_W:
            return True
        else:
            return False
    else:
        return False
def GeoCoord_convert_du2decimal(location):
    location = str(location)
    location_list = re.split('[° ′]',location)
    du = float(location_list[0])
    
    if len(location_list)>2:
        fen =float(location_list[1])
        fen = fen/60
    else:
        fen = 0
    GeoCoord_decimal: float = du+fen
   
    return GeoCoord_decimal

def Read_Judge_Write_CSV(csv_file_path,target_filepath):
    print(">>>>>当前子进程的编号为:",os.getpid())
    print(">>>>>当前父进程的编号为:",os.getppid())
    print("Starting function>>>>>Read_Judge_Write_CSV")
    
    print("READING CSV FILE NOW:\n》",csv_file_path)  
    result_CSV_DictRow = []
    with open(csv_file_path, 'r', encoding='gbk', errors='ignore') as f:
       
        csv_Dictreader = csv.DictReader(x.replace('\0', '') for x in f)
        next(csv_Dictreader)
        Not_In_BoHai_count = 0
        In_BoHai_count = 0
        
        print(">>>>>>>>>>Judging whether it is in BoHai area>>>>>>>>>>")
        for OrderDictrow in csv_Dictreader:
            lat = GeoCoord_convert_du2decimal(OrderDictrow["Lat"])
            lon = GeoCoord_convert_du2decimal(OrderDictrow["Lon"])
            
            Is_in_BoHai = range_dect(lat, lon)
            if Is_in_BoHai:
                In_BoHai_count = In_BoHai_count + 1
                
                Dict_Row = OrderDictRow_To_Dict(OrderDictrow)
                
                result_CSV_DictRow.append(Dict_Row)
            else:
                Not_In_BoHai_count = Not_In_BoHai_count + 1
        print("--------------------------------Judgement finished--------------------------------")
        print(">>>>>>>>>>>>>>>>当前CSV表单中在渤海范围内的数据如下(DictType)>>>>>>>>>>>>>>>>\n", result_CSV_DictRow)



        print(">>>>>>>>>>>>>>>>现在开始写入指定的文件夹中",target_filepath)
        write_csv(target_filepath, result_CSV_DictRow)
        print("\t共计", Not_In_BoHai_count, "条数据在渤海外\t", In_BoHai_count, "条数据在渤海范围内", "\n")

def MP(functionxx,c1,c2):
    # ProcessingOBJ = multiprocessing.Process(target="任务名",name="进程名”系统会进行设置一般是Process00 Processing01 Processing02 依次类推,group="进程组“ 一般为None)

    ProcessingOBJxx = multiprocessing.Process(target=functionxx,args=(c1,c2,))

    ProcessingOBJxx.start()

if __name__ == '__main__':
    
    source_CSV_root_path = "E:\\201907-2\\"
    target_CSV_root_Path = "D:\\CSV_stage01\\"
    CSV_fileNAME_list = read_all_csv_file(source_CSV_root_path)
    CSV_file_count = len(CSV_fileNAME_list)
    print("**********目录", source_CSV_root_path, "下共有", CSV_file_count, "个CSV文件**********")
    # 已经读取的文件个数的计数器
    count = 0

    for CSV_fileNAME in CSV_fileNAME_list:
        MP(Read_Judge_Write_CSV,source_CSV_root_path + CSV_fileNAME,target_CSV_root_Path + "new_CSV_" + CSV_fileNAME)
        
        count = count + 1
        print("——————————————————————————————已经开启", count, "/", CSV_file_count, "个进程用于读写处理CSV文件\n")

多线程

import threading
线程对象 = threading.Thread(target=任务名,args=(任务的参数一,任务的参数二,))
线程对象.setDaemon(True) #设置为守护主线程
线程对象.start()

多进程

import multiprocessing
进程对象 = multiprocessing.Process(target=任务,args=(任务的参数一,任务的参数二,))
进程对象.start()

多进程示例代码(多线程代码同理)

import multiprocessing,time
def task(c1,c2)
    print(">>>>>当前子进程的编号为:",os.getpid())
    print(">>>>>当前父进程的编号为:",os.getppid())
    time.sleep(0.5)
    print("当前进程参数一:",c1,"当前进程参数二:",c2)
    print("子线程:",os.getpid(),"运行完成")
if __name__ == '__main__':
    for i in range(10)
        ProcessOBJ = multiprocessing.Process(target=task,args=(i+"-hello","world!",))
        ProcessOBJ.start()
    time.sleep(0.2)
    print("主线程运行完成!")

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值