please convert this python program to rust
from distutils.log import warn
from genericpath import exists
import os
import re
import sys
import gc
import gzip
import glob
import timeit
import shutil
import multiprocessing
import io
import pandas as pd
import numpy as np
import traceback
from datetime import datetime, timedelta
import pyarrow as pa
import pyarrow.parquet as pq
import pyarrow.compute as pc
import pyarrow.dataset as ds
from pyarrow import csv
import itertools
from pathlib import Path
import platform

import warnings
def nodes\_names(path,entorno):
 nodes\_dir = os.listdir(path)
 nodes\_dir = [node for node in nodes\_dir if "tomcat" in node]
 return [re.sub("-usr.\*","",x,1) for x in nodes\_dir]

def process\_parser(parser):
 return parser.process()

def process\_parsers(parsers):
 parsers.sort(key=lambda x: x.rolls, reverse=True)
 procs = max(multiprocessing.cpu\_count()-1,1)
 with multiprocessing.Pool(procs) as pool:
 counts = pool.map(process\_parser, parsers)
 #counts = []
 #for parser in parsers:
 # counts.append(parser.process())
 for i in range(len(parsers)):
 parser = parsers[i]
 time\_line\_count, line\_count, read\_bytes, buffers = counts[i]
 parser.time\_line\_count = time\_line\_count
 parser.line\_count = line\_count
 parser.read\_bytes = read\_bytes
 parser.buffers = buffers

 
def filter\_out\_available\_days(path\_out,days):
 days\_f = []
 for day in days:
 if len(glob.glob(f"{path\_out}/\*/\*/{day}.parquet")) < 50:
 days\_f.append(day)
 return(days\_f)

def main(argv):
 yesterday = datetime.now() - timedelta(1)
 yesterday = datetime.strftime(yesterday, '%Y-%m-%d')
 entorno = "pro"
 if len(argv)>0:
 if argv[0] in ["pro","pre"]:
 entorno = argv.pop(0)
 print(f"entorno: {entorno}")
 if len(argv)>0:
 days = argv
 else:
 days = [yesterday]
 print(f"días: {days}")
 
 
 
 tic = timeit.default\_timer()
 gestiona\_path = os.path.dirname(os.path.abspath(\_\_file\_\_)) + "/../gestiona"
 if platform.system() == "Linux":
 gestiona\_path += ""
 if entorno == "pro":
 gestiona\_path\_prefix = "/intermediacion/aplicacion/"
 path\_work = "timelogsplit\_id"
 path\_out = "timelogsplit"
 node\_sufix = "-usr-local-tomcat-logs/"
 elif entorno == "pre":
 gestiona\_path\_prefix = "/intermediacion/pre-aplicacion/"
 path\_work = "timelogsplit\_pre\_id"
 path\_out = "timelogsplit\_pre"
 node\_sufix = "-usr-local-tomcat6-int-logs/"

 
 components = ["servicios", "intermediaListener.sh", "intermediaScheduler.sh"]
 #nodes = ["adposapidaprom4","adposapidapros4","sasupproma01","sasupproma03","sasupprose01","sasupprose02","sasupprose03"]
 nodes = nodes\_names(gestiona\_path + "/diarias/" + days[0].replace("-","") + gestiona\_path\_prefix,entorno)
 print(f"nodos: {nodes}")
 cols = pd.read\_excel("cols.xlsx", sheet\_name="datos", usecols=["tag","col","class","name"]) 
 parsers = []
 for node, component, day in itertools.product(nodes, components, days):
 gpath = gestiona\_path + "/diarias/" + day.replace("-","") + gestiona\_path\_prefix
 parser = Parser(node,component,gpath,day,path\_work, node\_sufix, cols)
 if parser.rolls != -1:
 parsers.append(parser)
 rolls = 0
 for parser in parsers:
 rolls += parser.rolls
 print(f"rolls para procesar totales: {rolls}")

 

 for day in days:
 tic\_day = timeit.default\_timer()
 parsers = []
 for node, component in itertools.product(nodes, components):
 gpath = gestiona\_path + "/diarias/" + day.replace("-","") + gestiona\_path\_prefix
 parser = Parser(node,component,gpath,day,path\_work, node\_sufix, cols)
 if parser.rolls != -1:
 parsers.append(parser)
 process\_parsers(parsers)
 time\_line\_count, line\_count, read\_bytes = (0, 0, 0)
 for parser in parsers:
 time\_line\_count += parser.time\_line\_count
 line\_count += parser.line\_count
 read\_bytes += parser.read\_bytes
 rolls += parser.rolls
 
 print(f"día parseado {day} rolls: {rolls:10} line\_count: {line\_count:10} time\_line\_count: {time\_line\_count:10} read\_bytes: {read\_bytes/2\*\*30:6.2f} GiB")
 concat\_nodes\_day(path\_work, path\_out, day)
 toc\_day = timeit.default\_timer()
 print(f"Tiempo procesamiento {day}: {toc\_day - tic\_day}")

 toc = timeit.default\_timer()
 print(f"Tiempo procesamiento: {toc - tic}")

 

if \_\_name\_\_ == "\_\_main\_\_":
 main(sys.argv[1:])
임대 이 파이썬 프로그램을 녹으로 변환합니다.distutils.log에서 가져 오기 경고제네릭 경로에서 임포트가 존재합니다import osimport reimport sysimport gcimport gzipglob 임포트import timeitimport shutil다중 처리 가져오기import io팬더를 pd로 가져 오기numpy를 np로 임포트트레이스백 가져오기날짜 시간에서 날짜 시간, 시간 델타 가져 오기pyarrow를 pa로 가져 오기pyarrow.parquet를 pq로 가져옵니다.pyarrow.compute를 pc로 가져옵니다.pyarrow.dataset를 ds로 가져옵니다.pyarrow에서 csv 임포트import itertoolspathlib에서 Path플랫폼 가져 오기경고 가져오기def nodes\_names(경로,엔토르노): nodes\_dir = os.listdir(경로) nodes\_dir = [nodes\_dir의 노드에 대해 노드에 "tomcat"이 있으면 노드] return [re.sub("-usr.\*","",x,1) for x in nodes\_dir]def 프로세스\_파서(파서): return parser.process()def process\_parsers(파서): parsers.sort(key=lambda x: x.rolls, reverse=True) procs = max(multiprocessing.cpu\_count()-1,1) multiprocessing.Pool(procs)을 풀로 사용합니다: 카운트 = pool.map(프로세스\_파서, 파서) #counts = [] #구문 분석기의 구문 분석기용: # counts.append(parser.process()) for i in range(len(parsers)): 파서 = 파서[i] time\_line\_count, line\_count, read\_bytes, buffers = counts[i] parser.time\_line\_count = time\_line\_count parser.line\_count = line\_count parser.read\_bytes = 읽기\_바이트 parser.buffers = 버퍼 def filter\_out\_available\_days(path\_out,days): days\_f = [] 일 단위의 일수입니다: if len(glob.glob(f"{path\_out}/\*/\*/{day}.parquet")) < 50: days\_f.append(day) return(days\_f)def main(argv): yesterday = datetime.now() - timedelta(1) yesterday = datetime.strftime(yesterday, '%Y-%m-%d') entorno = "프로" if len(argv)>0: if argv[0] in ["pro","pre"]: 엔토르노 = argv.pop(0) print(f"엔토르노: {엔토르노}") len(argv)>0: days = argv else: days = [어제] print(f"días: {days}")    틱 = timeit.default\_timer() gestiona\_path = os.path.dirname(os.path.abspath(\_\_file\_\_)) + "/../gestiona" platform.system() == "Linux": gestiona\_path += "" 만약 엔토르노 == "프로": gestiona\_path\_prefix = "/intermediacion/aplicacion/" 경로\_작업 = "타임로그스플릿\_ID" 경로\_아웃 = "타임로그 분할" 노드\_sufix = "-usr-local-tomcat-logs/" 엔토르노 == "pre": gestiona\_path\_prefix = "/intermediacion/pre-aplicacion/" 경로\_작업 = "timelogsplit\_pre\_id" 경로\_out = "timelogsplit\_pre" node\_sufix = "-usr-local-tomcat6-int-logs/"  구성 요소 = ["서비스", "인터미디어 리스너.sh", "인터미디어 스케줄러.sh"] #노드 = ["adposapidaprom4","adposapidapros4","sasupproma01","sasupproma03","sasupprose01","sasupprose02","sasupprose03"] 노드 = 노드\_이름(게스티오나\_경로 + "/디아리아스/" + 일[0].대체("-","") + 게스티오나\_경로\_접두사,엔토르노) print(f"노드: {노드}") cols = pd.read\_excel("cols.xlsx", sheet\_name="datos", usecols=["tag","col","class","name"])  파서 = [] for node, component, day in itertools.product(nodes, components, days): gpath = gestiona\_path + "/디아리아스/" + day.replace("-","") + gestiona\_path\_prefix 파서 = 파서(노드, 컴포넌트, gpath, 일, 경로\_작업, 노드\_sufix, 콜) if parser.rolls != -1: parsers.append(파서) 롤스 = 0 파서에서 파서의 경우: 롤스 += 파서.롤스 print(f"총 처리할 롤: {rolls}")  일 단위의 일수입니다: tic\_day = timeit.default\_timer() 파서 = [] for node, component in itertools.product(nodes, components): gpath = gestiona\_path + "/디아리아스/" + day.replace("-","") + gestiona\_path\_prefix 파서 = 파서(노드, 컴포넌트, gpath, 일, 경로\_작업, 노드\_sufix, 콜) if parser.rolls != -1: 파서.추가(파서) 프로세스\_파서(파서) time\_line\_count, line\_count, read\_bytes = (0, 0, 0) 파서의 파서에 대해: time\_line\_count += parser.time\_line\_count line\_count += parser.line\_count 읽기\_바이트 += 파서.읽기\_바이트 롤스 += 파서.롤스  print(f"날 파싱된 {날} 롤스: {rolls:10} line\_count: {line\_count:10} time\_line\_count: {time\_line\_count:10} read\_bytes: {read\_bytes/2\*\*30:6.2f} GiB") concat\_nodes\_day(경로\_작업, 경로\_아웃, 일) toc\_day = timeit.default\_timer() print(f"작업 시간 {일}: {toc\_day - 틱\_day}") toc = timeit.default\_timer() print(f"처리 시간: {toc - tic}") if \_\_name\_\_ == "\_\_main\_\_": main(sys.argv[1:])