Fișier de mutare Python. Salvarea fișierelor cu python

06-04-2013 / redVi

ÎN acest post Aș dori să sugerez să scrieți o aplicație mică care să folosească o interfață grafică. Problema alegerii instrument adecvat Implementarea acestei idei se poate dovedi a fi destul de netrivială. Python acceptă mai multe biblioteci grafice:

- wxWidgestși interfața cu această bibliotecă - wxPython. Cea mai buna alegere, dacă doriți ca aplicațiile dvs. să arate native pe orice sistem de operare cu orice GUI. Cel mai mare dezavantaj la momentul scrierii acestei postări este lipsa unei documentații extinse. Cu toate acestea, cineva poate să nu fie de acord cu acest lucru.

- tkinter- Tk este cea mai simplă și mai răspândită bibliotecă. Folosit foarte larg. Documentația este detaliată și conține tot ce aveți nevoie pentru a începe rapid.

-PyQt- interfață cu biblioteca Qt. Această bibliotecă este, de asemenea, portabilă pentru Linux, Windows și MacOS. Deși este de remarcat faptul că interfața programului, desigur, va diferi de aplicațiile „native” și numai în cazul combinației Linux + KDE va ​​arăta ca o mănușă. Cu toate acestea, este folosit pe scară largă. Documentația este excelentă. Scrierea codului este poate cea mai dificilă.

PyGTK- ca si precedenta, este legata de sistemul sau de ferestre. Nu la fel de comun ca cele trei biblioteci prezentate mai sus.

Desigur, există mult mai multe biblioteci grafice. Cele enumerate aici sunt cele principale. Autorul recomandă să alegeți între wxPython și Tkinter. Pentru a utiliza orice bibliotecă, trebuie să o instalați (excepția este OS Windows, unde python pare să vină aproape complet ambalat). Exemplul pe care îl vom analiza astăzi va folosi biblioteca tkinter și va necesita instalarea modulului tk. utilizatorii Linuxîl pot găsi folosindu-le manager de pachete sau construiți python cu cheia tk (pentru gentoo).

Cum functioneaza?

tkinter este un strat software deasupra lui Tk care permite scripturilor Limbajul Python accesați biblioteca Tk, care construiește și configurează interfețe și transmite controlul înapoi către scripturile Python care gestionează evenimentele generate de utilizator (cum ar fi clicurile mouse-ului). Deci apelurile GUI dintr-un script Python sunt direcționate către tkinter și apoi către Tk; evenimente care au loc în interfata grafica, sunt direcționate de la Tk la tkinter și apoi înapoi la scriptul Python.

~Mark Lutz - Programare Python Ed. a 4-a. Volumul I~

A început importul

# pybackup.py # #! /usr/bin/env python # -*- codificare: utf-8 -*- import os import shutil din tkinter.messagebox import * din tkinter.filedialog import *

Modulul os oferă o interfață portabilă pentru serviciile utilizate în mod obișnuit sistem de operare. O vom folosi pentru a specifica calea (os.path);

Shuil este folosit pentru operațiuni cu fișiere, cum ar fi copierea, redenumirea, ștergerea;

importul de module din tkinter.filedialog ne va oferi posibilitatea de a apela casete de dialog, din caseta de mesaje - creați mesaje, notificări pentru utilizator

Funcție pentru selectarea unui director pentru copiere, obținerea accesului la o descriere a funcției.

În primul rând, nu trebuie să uitați niciodată să vă documentați codul, cel puțin pentru ca după ceva timp să îl puteți înțelege singur. Exemplul imediat de sub funcție oferă o scurtă descriere a acesteia.

Când importați un modul, îl puteți accesa apelând comanda backup.savefiles.__doc__ - adică module_name.function_name.__description__ :

>>> backup.savefiles.__doc__ „Întrebați unde să vă salvați fișierele”

Modulul pe care l-am primit ca urmare nu este destinat extinderii sau importului, cu toate acestea, mai trebuie create șiruri de documentație.

În continuare, este utilizată variabila dst, care va lua ulterior valoarea directorului specificat de utilizator. Valoarea va fi un șir. Aici variabila este făcută globală deoarece ar trebui să fie disponibilă pentru alte funcții.

dst = askdirectory() - va cere utilizatorului să selecteze un director pentru a salva fișierele

print(type(dst)) și print(dst) vor afișa informații în consolă pentru noi, astfel încât să putem vedea ce tip s-a dovedit a fi variabila atunci când utilizatorul a selectat un director. Este posibilă eliminarea liniilor cu imprimare.

Funcție pentru selectarea fișierelor pentru backup și funcție imbricată pentru copierea fișierelor selectate

def_selectfile(): """Selectați fișierele pentru backup""" src = askopenfilenames () src = list (src ) print (type (src )) print (src ) def save (): """Save files""" for listcopy in src : listname = os . cale. join (listcopy) shutil. copy(listname, dst) print("Fișierul de rezervă este OK") save()

askopenfilenames - selectați fișierele de copiat. Deoarece vom ajunge cu un tuplu, iar tuplurile sunt imuabile, îl convertim imediat într-o listă: list(src) .

După selectarea fișierelor, este apelată o funcție pentru a le copia imediat specificat de utilizator director. Pentru a face acest lucru, utilizați traversarea listei și copierea cu modulul Shuil:

shutil.copy - copie

listname - fișiere din listă

dst - unde să copiați

Funcția de selecție a directorului și funcția de copiere recursivă imbricată

def_selectdirectory(): """Selectați directorul pentru backup""" src2 = askdirectory() print(tip(src2)) print(src2) def save2(): """Salvați directoare și fișiere""" print ("face backup" + src2 ) names = os . listdir(src2) dacă nu os. cale. există(dst): os. mkdir (dst) pentru nume în nume: srcname = os . cale. join (src2, name) dstname = os . cale. join (dst, name) if os . cale. isdir(srcname): shutil. copytree (srcname , dstname ) dacă os . cale. isfile(srcname): shutil. copy(srcname, dstname) print("Copia de rezervă este OK") save2()

askdirectory - selectați un director de copiat. Funcția include o verificare pentru copierea recursivă a subdirectoarelor. Dacă srcname este un subdirector (os.path.isdir), va fi efectuată o copie recursivă (copytree). Dacă directorul selectat, pe lângă subdirectoare, conține fișiere obișnuite(os.path.isfile), copierea acestor fișiere (copy).

os.listdir - returnează o listă care conține numele directorului. Nu puteți selecta mai multe directoare simultan (această limitare este legată de askdirectory, nu de Python în sine), dar puteți apela în mod repetat funcția de copiere a fișierelor și subdirectoarelor pentru următorul director.

os.path.join - „unește” căi

Funcție care închide programul

def close_win(): """Închide fereastra și ieși din program""" if askesno ("Ieșire", "Fă tu vrei a renunța?" ): root . distruge ()

Funcția de afișare a ferestrei de informații

def about(): showinfo("Copie de rezervă", „Acesta este un simplu program de backup.\n (versiunea de testare)" )

root = Tk () m = Menu ( root ) root . config (meniu = m) fm = Meniu (m) m. add_cascade (etichetă = „Fișier” , meniu = fm ) fm . add_command (etichetă = "Selectați directorul pentru salvare" , comandă = savefiles ) fm . add_command (label = „Selectați fișierele pentru copiere.” , command = _selectfile ) fm . add_command (etichetă = „Selectați directoare pentru copiere” , comandă = _selectdirectory ) fm . add_command (etichetă = „Ieșire” , comandă = close_win ) hm = Meniu ( m ) m . add_cascade (etichetă = „Ajutor” , meniu = hm ) hm . add_command (label = „Despre” , comandă = despre ) txt = Text ( rădăcină , lățime = 40 , înălțime = 25 , font = „22” ) txt . pachet () rădăcină . mainloop()

root = Tk() - creează fereastra principală

m = Meniu (rădăcină) - creați un meniu legat de fereastra principală

root.config(menu=m) - pentru a crea o listă în meniu (add_cascade)

fm = Meniu(m) - crearea elementelor din listă

Orice altceva este simplu: fm.add_command - va apela acțiune specificată; etichetă - etichetă, cum va fi numit elementul de meniu; comandă - o indicație a funcției care ar trebui să fie executată atunci când se face clic pe un element de meniu; pack() - manager de locație. Este responsabil pentru modul în care widget-urile vor fi amplasate în fereastra principală.

root.mainloop() este o metodă specială necesară. Fără el, fereastra principală nu va apărea.

Ce s-a întâmplat?

Dacă înțelegi exemplul dat, poți deja să spui ce lipsește în el. De exemplu, este posibil să descoperiți că atunci când copiați obiecte din același director din nou și din nou, fișierele sunt înlocuite, dar subdirectoarele nu sunt înlocuite. Ei vă vor sublinia doar faptul că un astfel de subdirector există deja și programul va înceta să ruleze. La fel de muncă independentă Se sugerează să studiezi constructul try-except sau modulul errno și să lucrezi la acest punct. De exemplu:

def save2 (): """Salvare directoare""" try: print ("face backup " + src2 ) names = os . listdir(src2) dacă nu os. cale. există(dst): os. mkdir (dst) pentru nume în nume: srcname = os . cale. join (src2, name) dstname = os . cale. join (dst, name) if os . cale. isdir(srcname): shutil. copytree (srcname , dstname ) dacă os . cale. isfile(srcname): shutil. copy (srcname , dstname ) print ( "Copia de rezervă este OK"), cu excepția OSError: shutil . rmtree (dstname) print ("Încercați din nou") dacă os . cale. isdir(srcname): shutil. copytree (srcname , dstname ) dacă os . cale. isfile(srcname): shutil. copy(srcname, dstname) print("Copia de rezervă este OK") save2()

ÎN copie Windows fișierul/fișierele nu vor funcționa: aceasta este o consecință a acestui sistem de operare folosind căi non-ortodoxe către fișiere ( backslash). Pot fi, utilizatorii de Windows ar fi interesant să schimbi codul astfel încât această funcție a lucrat.

Apropo: Pentru a face ca programul să ruleze pe Windows când faceți dublu clic, schimbați extensia în .pyw. În plus, se recomandă să exersați cu tkinter și să afișați fereastra pop-up „Așteptați, vă rugăm!”. în timpul copierii (asemănător cu modul în care se face la închiderea programului).

Funcțiile modulului Shuil ne vor ajuta să mutăm și să copiem fișiere în directoare. Conectăm modulul Shuil la începutul scriptului nostru Python, apoi vom avea acces la funcțiile acestuia. Funcțiile modulului Shuil nu se limitează doar la copiere și mutare, vom discuta tehnici diferite folosind funcțiile acestui modul.

Funcția copyfile (Fișier de copiat, cale de copiat în)

Copiază conținutul fișierului în calea specificată și creează una nouă în locația specificată în al doilea parametru. Datele metodei nu sunt copiate, de ex. drepturi de acces etc. Dacă locul în care copiem are deja un astfel de fișier, acesta va fi suprascris. Dacă copia eșuează, este generată o excepție IOError. >>> import shutil # Conectați modulul >>> shutil.copyfile(r"/home/py/mouse.txt", r"/home/py/new-mouse.txt") >>> # Calea specificată nu va exista >>> shutil.copyfile(r"/home/py/mouse.txt", r"/go/here/no.txt") IOError: Nu există un astfel de fișier sau director „/go/here/no.txt "

Funcție copie (Fișierul de copiat, unde îl copiem)

Copiază fișierul împreună cu drepturile acestuia. Dacă fișierul a existat deja, acesta va fi suprascris. O copie eșuată va genera o excepție IOError.

Shutil.copy(r"fișierul_meu.txt", r"fișier_nou.txt")

Site-ul web avi1.ru vă va ajuta să comandați aprecieri plătite pe YouTube cu reduceri foarte mari en-gros. Grăbește-te cât durează oferta. Tot pe pagini a acestui serviciu Puteți găsi tot ce aveți nevoie pentru a promova pe YouTube: abonați, vizualizări etc.

Funcția copy2 (Fișier de copiat, cale de copiat în)

Copiază un fișier împreună cu datele metodei sale. Dacă fișierul există deja, acesta va fi suprascris.

Shutil.copy2(r"mendel.txt", r"file.txt")

Mutarea unui fișier, funcția mutare (calea către fișier, calea unde se mută)

Copiază un fișier din locație specificată, creează unul nou sau suprascrie unul existent de-a lungul unei noi căi. După finalizarea copierii, fișierul copiat este șters. Poate exista un caz în care un fișier nu poate fi șters o excepție WindowsError este generată în Windows.

Modulul Shuil conține un set de funcții nivel inalt pentru procesarea fișierelor, grupuri de fișiere și foldere. Mai exact, caracteristicile disponibile aici vă permit să copiați, să mutați și să ștergeți fișiere și foldere. Folosit adesea împreună cu .

Operații pe fișiere și directoare

shutil.copyfileobj(fsrc, fdst[, length]) - copiați conținutul unui obiect fișier (fsrc) în altul (fdst). Parametrul opțional de lungime este dimensiunea bufferului la copiere (astfel încât întregul fișier, eventual uriaș, să nu fie citit în întregime în memorie).

Mai mult, dacă poziția pointerului în fsrc nu este 0 (adică, ceva de genul fsrc.read(47) a fost făcut înainte), atunci conținutul va fi copiat începând de la poziția curentă, și nu de la începutul fișierului.

shutil.copyfile(src, dst, follow_symlinks=True) - copiază conținutul (dar nu metadatele) fișierului src în fișierul dst. Returnează dst (adică unde a fost copiat fișierul). src și dst sunt șiruri de caractere - căi către fișiere. dst ar trebui să fie Numele complet fişier.

Dacă src și dst sunt același fișier, o excepție shutil.SameFileError.

Dacă dst există, va fi suprascris.

Dacă follow_symlinks=False și src este o legătură către un fișier, atunci va fi creat unul nou legătură simbolicăîn loc să copiați fișierul la care indică această legătură simbolică.

shutil.copymode(src, dst, follow_symlinks=True) - copiează permisiunile din src în dst. Conținutul fișierului, proprietarul și grupul nu se modifică.

shutil.copystat(src, dst, follow_symlinks=True) - copiază drepturile de acces, ora ultimului acces, ultima schimbare, iar steaguri src în dst . Conținutul fișierului, proprietarul și grupul nu se modifică.

shutil.copy(src, dst, follow_symlinks=True) - copiează conținutul fișierului src într-un fișier sau folder dst. Dacă dst este un director, fișierul va fi copiat cu același nume ca și în src . Funcția returnează calea către locația noului fișier copiat.

copy() copiază conținutul și permisiunile fișierului.

shutil.copy2(src, dst, follow_symlinks=True) - ca copy() , dar încearcă să copieze toate metadatele.

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) - copiează recursiv întregul arbore de director înrădăcinat în src , returnând directorul de destinație.

Directorul dst nu trebuie să existe. Va fi creat, împreună cu directoarele părinte lipsă.

Drepturile și orele directorului sunt copiate de copystat() , fișierele sunt copiate folosind funcția copy_function (în mod implicit shutil.copy2()).

Dacă este fals (implicit), conținutul și metadatele fișierelor la care se face referire vor fi copiate.

Dacă symlinks=False , dacă fișierul indicat de link nu există, o excepție va fi adăugată la lista de erori, în excepția shutil.Error la sfârșitul copiei.

Puteți seta steagul ignore_dangling_symlinks=True pentru a ascunde această eroare.

Dacă ignore nu este None , atunci ar trebui să fie o funcție care să ia drept argumente numele directorului în care se află în prezent copytree() și lista de conținut returnată de os.listdir() . Deoarece copytree() este apelat recursiv, ignore este apelat o dată pentru fiecare subdirector. Ar trebui să returneze o listă de obiecte relativ la numele directorului curent (adică un subset de elemente din al doilea argument). Aceste obiecte nu vor fi copiate.

shutil.ignore_patterns(*patterns) este o funcție care creează o funcție care poate fi folosită ca o ignorare pentru copytree() , ignorând fișierele și directoarele care se potrivesc cu modele de tip -style.

De exemplu:

copytree (sursă, destinație, ignore = ignore_patterns ("*.pyc", "tmp*")) # Copiază toate fișierele, cu excepția celor care se termină cu .pyc sau care încep cu tmp

shutil.rmtree(cale, ignore_errors=False, onerror=Niciuna) - Șterge directorul curent și toate subdirectoarele; calea trebuie să indice un director, nu o legătură simbolică.

Dacă ignore_errors=True , atunci erorile rezultate dintr-o ștergere eșuată vor fi ignorate. Dacă False (implicit), aceste erori vor fi transmise handler-ului onerror, sau dacă nu există nimeni, atunci o excepție.

Pe sistemele de operare care acceptă funcții bazate pe descriptori de fișiere, versiunea implicită a rmtree() nu este vulnerabilă la atacurile prin linkuri simbolice.

Nu este cazul pe alte platforme: având în vedere momentul și circumstanțele potrivite, un „hacker” poate, manipulând link-uri, să ștergă fișiere care altfel îi sunt inaccesibile.

Pentru a verifica dacă un sistem este vulnerabil la astfel de atacuri, puteți utiliza atributul rmtree.avoids_symlink_attacks.

Dacă se dă onerror, aceasta trebuie să fie o funcție cu 3 parametri: function , path , excinfo .

Primul parametru, funcția , este funcția care a lansat excepția; depinde de platformă și de interpret. Al doilea parametru, calea , este calea transmisă funcției. Al treilea parametru, excinfo, este informațiile de excepție returnate de sys.exc_info(). Excepțiile aruncate de onerror nu sunt gestionate.

shutil.mutare(src, dst, copy_function=copy2) - mută recursiv un fișier sau un director (src) într-o altă locație (dst) și returnează destinația.

Dacă dst este un director existent, atunci src este mutat în director. Dacă dst există, dar nu directorul, atunci acesta poate fi suprascris.

shutil.disk_usage(cale) - returnează statistici de utilizare spatiu pe disc ca si in cazul atributelor total, folosit si liber, in octeti.

shutil.chown(cale, utilizator=Niciunul, grup=Niciunul) - schimbă proprietarul și/sau grupul unui fișier sau director.

shutil.care(cmd, mode=os.F_OK | os.X_OK, path=None) - returnează calea către fisier executabil conform unei comenzi date. Dacă nu există nicio potrivire cu niciun fișier, atunci Nici unul. modul este permisiunile necesare pentru fișier, în mod implicit caută doar executabile.

Arhivare

Funcții de nivel înalt pentru crearea și citirea arhivate și fișiere comprimate. Pe baza funcțiilor din modulele zipfile și tarfile.

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) - creează o arhivă și returnează numele acesteia.

nume_base este numele fișierului de creat, inclusiv calea, dar fără extensii (nu este nevoie să scrieți „.zip”, etc.).

format - format de arhivă.

root_dir - directorul (relativ cu cel curent) pe care îl arhivăm.

base_dir - directorul în care va fi arhivat (adică toate fișierele din arhivă vor fi în acest folder).

Dacă dry_run=True , arhiva nu va fi creată, dar operațiunile care ar fi trebuit efectuate vor fi scrise în logger .

proprietarul și grupul sunt folosite la crearea unei arhive tar.

shutil.get_archive_formats() - lista de formate disponibile pentru arhivare.

>>> shutil. get_archive_formats() [("bztar", "bzip2"ed tar-file"), ("gztar", "gzip"ed tar-file"), ("tar", "fișier tar necomprimat"), ("xztar", "xz „ed tar-file”), („zip”, „fișier ZIP”)]

shutil.unpack_archive(filename[, extract_dir[, format]]) - despachetează arhiva. nume de fișier - calea plină la arhivă.

extract_dir - unde va fi extras conținutul (în mod implicit la cel curent).

format - format de arhivă (în mod implicit încearcă să ghicească după extensia fișierului).

shutil.get_unpack_formats() - lista de formate disponibile pentru dezarhivare.

Solicitați dimensiunea terminalului de ieșire

shutil.get_terminal_size(fallback=(coloane, linii)) - returnează dimensiunea ferestrei terminalului.

fallback va reveni dacă nu a fost posibil să aflați dimensiunea terminalului (terminalul nu acceptă astfel de solicitări sau programul rulează fără terminal). Implicit (80, 24).

>>> shutil. get_terminal_size() os.terminal_size(coloane=102, linii=29)>>> shutil. get_terminal_size () # Reduceți fereastra os.terminal_size(coloane=67, linii=17)