Python ir failų kopijavimas / konvertavimas / redagavimas

Senokai kažką rašiau apie Pythoną. Tiesiog darbe nebuvo progų jį labiau panagrinėti, tai ir naujų dalykų neatradau. Bet praėjusią savaitę teko pasikamuoti su failų kopijavimu/konvertavimu/koregavimu, tai rezultatais pasidalinsiu čia, kad ateityje ir pačiam būtų patogu šitai susirasti.

Taigi iš karto prie esmės. Teko susidurti su dvejomis užduotimis pirma buvo paprastesnė – iš folderio, kuriame kartais atsiranda naujas excelis, o kartais ne, reikia nukopijuoti tą naujausią failą į kitą folderį, jei naujo failo neatsiranda – tada nieko nedaryti. Atrodo kvailoka užduotis, bet to reikėjo tam, kad galėčiau susikurti flow su PowerAutomate ir iš kolegės OneDrive folderio pasiimti excel failą. Mano PowerAutomate paskyra nemato su manimi pa’share’intų folderių, todėl ir reikėjo tuos failus kopijuotis į savo folderį. Tam panaudojau tokį scriptą:

import time
import os 
import shutil

directorya = r"C:\pradinis\folderis_iš_kurio_kopijuojama"
directoryb = r"C:\galutinis\folderis_į_kurį_kopijuojama"
files = [file for file in os.listdir(directorya) if os.path.isfile(os.path.join(directorya, file))]
for file in files:
    if not os.path.exists(os.path.join(directoryb, file)):
        shutil.copy(os.path.join(directorya, file), directoryb)

Po to teko kitokia užduotis – vėlgi flow, bet jau su Apache NiFi. Bėda ta, kad šitas žvėris, niekaip nesusidraugavo su Lietuviškais šriftais, nei utf-8 nei windows-1257 encodingai jam kažkaip nesuėjo. Pradžioje įsikeldavo teisingus duomenis, bet vėliau darant transformacijas Lietuviškus šriftus vis tiek makaronais paversdavo. Taigi iš to išplaukė panaši užduotis, kaip pirmoji, tik reikėjo naują failą dar atidaryti „nulietuvinti” ir tik tada išsaugoti kitame folderyje. Po ilgokų pamąstymų gimė toks kodukas:

import glob
import time
import os.path
import pandas as pd
import os
import shutil

directorya = r"C:\pradinis\folderis_iš_kurio_kopijuojama"
directoryb = r"C:\galutinis\folderis_į_kurį_kopijuojama"
files = [file for file in os.listdir(directorya) if os.path.isfile(os.path.join(directorya, file))]
for file in files:
    if not os.path.exists(os.path.join(directoryb, file)):
        df = pd.read_excel(directorya+'\\'+file)
        df = df[df.columns.dropna()]
        
        df.columns = df.columns.str.replace("Ž", "Z")
        df.columns = df.columns.str.replace("ž", "z")
        df.columns = df.columns.str.replace("Ū", "U")
        df.columns = df.columns.str.replace("ū", "u")
        df.columns = df.columns.str.replace("Ų", "U")
        df.columns = df.columns.str.replace("ų", "u")
        df.columns = df.columns.str.replace("Š", "S")
        df.columns = df.columns.str.replace("š", "s")
        df.columns = df.columns.str.replace("Į", "I")
        df.columns = df.columns.str.replace("į", "i")
        df.columns = df.columns.str.replace("Ė", "E")
        df.columns = df.columns.str.replace("ė", "e")
        df.columns = df.columns.str.replace("Ę", "E")
        df.columns = df.columns.str.replace("ę", "e")
        df.columns = df.columns.str.replace("Č", "C")
        df.columns = df.columns.str.replace("č", "c")
        df.columns = df.columns.str.replace("Ą", "A")
        df.columns = df.columns.str.replace("ą", "a")
        
        df = df.replace({'Ž': 'Z'}, regex=True)
        df = df.replace({'ž': 'z'}, regex=True)
        df = df.replace({"Ū": "U"}, regex=True)
        df = df.replace({"ū": "u"}, regex=True)
        df = df.replace({"Ų": "U"}, regex=True)
        df = df.replace({"ų": "u"}, regex=True)
        df = df.replace({"Š": "S"}, regex=True)
        df = df.replace({"š": "s"}, regex=True)
        df = df.replace({"Į": "I"}, regex=True)
        df = df.replace({"į": "i"}, regex=True)
        df = df.replace({"Ė": "E"}, regex=True)
        df = df.replace({"ė": "e"}, regex=True)
        df = df.replace({"Ę": "E"}, regex=True)
        df = df.replace({"ę": "e"}, regex=True)
        df = df.replace({"Č": "C"}, regex=True)
        df = df.replace({"č": "c"}, regex=True)
        df = df.replace({"Ą": "A"}, regex=True)
        df = df.replace({"ą": "a"}, regex=True)
        filename = os.path.basename(file).split('.')[-2]
        df.to_excel(directoryb+'\\'+filename+'.xlsx', index=False, encoding='utf-8')

Atrodo modifikacijų nuo pirmo scripto ne tiek ir daug, tačiau buvau užstrigęs gana kvailoje vietoje. Rašant šią dalį:

for file in files:
    if not os.path.exists(os.path.join(directoryb, file)):
        df = pd.read_excel(directorya+'\\'+file)

Čia kur yra eilutė prasidedanti „df”, aš ją, ir visas žemiau esančias, pirmiausia buvau parašęs viename hierarchijos lygyje su „if” eilute… dėl to scriptas kaip ir veikė, tačiau jis kiekvieną kartą pasiimdavo naujausią failą iš pradinio folderio. Bėda, kad jei pvz šiandien naujas failas neatsirado, tai jis vis tiek pasiimdavo naujausią – šiuo atveju vakarykštį.

NiFi failą gali pasiimti pagal naujausią redagavimo arba sukūrimo datą, todėl vis perrašomas esamas failas būtų kaskartą įkeliamas į duombazę, kas reikštų duomenų dubliavimąsi, trigubinimąsi ir t.t.

Tai suprasti, kad reikia tą df eilutę pastumti užtruko… tiesą sakant, atsitiktinai tą atradau 🙂 Bet dabar scriptas puikiai veikia, ir tas žiauriai fainai 🙂

Parašykite komentarą