Python shutil
Python shutil-modulen lar en utvikler bruke filobjekter veldig enkelt og uten å gå i dypere detaljer om hvordan ting fungerer under dekslene. Denne modulen trekker i utgangspunktet bort semantikken på lavt nivå ved å opprette og administrere filobjekter, rengjøre dem når bruken er fullført, og lar oss fokusere på applikasjonens forretningslogikk. Vi vil se mange eksempler her, la oss komme i gang.
Eksempler med Python shutil-modul
Vi vil studere forskjellige eksempler som demonstrerer bruken av Python shutil modul her.
Kopiere en fil
Med Kopier fil() funksjon i shutil modul, kan vi lage en eksakt kopi av en eksisterende fil hvor som helst på maskinen. La oss se på et eksempelprogram for å demonstrere hvordan dette kan gjøres:
importer osimportere shutil
file_directory = './ Filer '
skriv ut ('Files before:', os.listdir (filkatalog))
shutil.Kopier fil('./ Filer / hei.tekst', './ Filer / hallo igjen.tekst')
skriv ut ('Files after:', os.listdir (filkatalog))
Vi har nettopp kopiert en fil som finnes i den gitte katalogen for å klone filen i samme katalog. Her er hva vi kommer tilbake med denne kommandoen:
Python shutil-filkopi
Det som er bra med denne funksjonen er at den nevnte funksjonen også tar navnet på den nye filen som skal opprettes som inndata.
Kopiere filer til en annen katalog
Det er mulig å kopiere en fil til en ny katalog med shutil's kopiere() funksjon. La oss se på det i aksjon:
importer osimportere shutil
print ('Lage en ny katalog.')
os.mkdir ('LinuxHint')
skriv ut ('Files before:', os.listdir ('LinuxHint'))
shutil.kopiere('./ Filer / hei.txt ',' LinuxHint ')
skriv ut ('Files after:', os.listdir ('LinuxHint'))
La oss se utdataene for denne kommandoen:
Kopierer filen til en ny katalog
Merk at når en fil kopieres med kopiere() funksjon, tillatelser for filen er også klonet men metadata for filen kopieres ikke. Dette betyr at når du sjekker når denne filen ble laget, vil den vise den ferske tiden da du kjørte dette skriptet.
Kopierer fil med metadata
I den siste delen så vi hvordan vi kunne lage en kopi av filen. Hva om du vil lage en nøyaktig klon av en fil som innebærer kloning av metadataene, som når filen ble laget osv. Dette er mulig også, men dette fungerer kanskje ikke på et POSIX-basert system. La oss se på et eksempel på hvordan dette kan gjøres:
importer osimportere shutil
importtid
new_directory = 'LinuxHint'
src_file = './ Filer / hei.tekst'
dest_file = './ LinuxHint / hei.tekst'
def file_metadata (fil):
stat_info = os.stat (fil)
skriv ut ('Mode:', okt (stat_info.st_mode))
print ('Laget:', tid.ctime (stat_info.st_ctime))
print ('Accessed:', tid.ctime (stat_info.st_atime))
print ('Modified:', tid.ctime (stat_info.st_mtime))
os.mkdir (ny_katalog)
skriv ut ('Metadata for kildefilen:')
file_metadata (src_file)
shutil.copy2 (src_file, new_directory)
skriv ut ('Metadata for destinasjonsfil:')
file_metadata (dest_file)
Her er hva vi kommer tilbake med denne kommandoen når vi kjører dette på et POSIX-basert system (metadata er ikke klonet helt):
Kopier fil med metadata
På ikke-POSIX-baserte systemer ville til og med opprettet og tilgjengelig tid ha matchet nøyaktig.
Kloning av fullstendig katalog
I den siste delen så vi hvordan vi kunne lage en kopi av filen. Her vil vi se hvordan vi kan klone en komplett katalog rekursivt. Dette betyr at hvis det finnes en annen katalog i katalogen vi vil klone, vil de også bli klonet.
importer pprintimportere shutil
importer os
src_directory = './ Filer '
dest_directory = './ LinuxHint '
shutil.copytree (src_directory, dest_directory)
print ('Innhold av kilde:')
pprint.pprint (os.listdir (src_directory))
print ('Destinasjonsinnhold:')
pprint.pprint (os.listdir (dest_directory))
La oss se utdataene for denne kommandoen:
Kopiere en katalog
Merk at katalogen vi sender til copytree () fungerer som målkatalogen må ikke eksistere før vi kjører dette programmet.
Slette en katalog
Slette en katalog er veldig enkelt med rmtree () funksjon i modulen. La oss se denne funksjonen i aksjon her:
importer pprintimportere shutil
importer os
delete_directory = 'LinuxHint'
current_directory = '.'
print ('Innhold før fjerning:')
pprint.pprint (os.listdir (nåværende katalog)
shutil.rmtree (delete_directory)
print ('Innhold etter fjerning:')
pprint.pprint (os.listdir (nåværende katalog))
Etter å ha kjørt skriptet, LinuxHint katalogen slettes sammen med innholdet. Her er hva vi kommer tilbake med denne kommandoen:
Slett katalog
Finne filer
Hvis du vil finne en fil som er tilstede på PATH-variabelen på maskinen din, kan vi bruke hvilken() funksjon for å finne den filen etter navn. La oss se på et demonstrasjonseksempel for denne funksjonen:
importere shutilutskrift (shutil.som ('bsondump'))
utskrift (shutil.som ('no-file-found'))
Her er hva vi kommer tilbake med denne kommandoen:
Finn filen på PATH
Overvåking av filsystemområdet
Med shutil-modulen har vi en funksjon disk_usage () der vi også kan få diskplassinformasjon om maskinen vår. La oss se på et eksempel som viser disse dataene på en lesbar måte:
importere shutiltotal_b, used_b, free_b = shutil.Diskbruk('.')
gb = 10 ** 9 # GB == gigabyte
print ('Totalt: : 6.2f GB '.format (total_b / gb))
print ('Brukt: : 6.2f GB '.format (brukt_b / gb))
print ('Gratis: : 6.2f GB '.format (free_b / gb))
Her er hva vi kommer tilbake med denne kommandoen:
Finne filsystemplass
Arkiveringskataloger
Som et siste eksempel vil vi se hvordan vi kan arkivere en katalog shutil-modul make_archive () funksjon. La oss se på eksempelprogrammet:
importere shutilimporter os
archive_directory = \
os.sti.utvidelsesbruker (os.sti.bli med ('destinasjonskatalog-bane', 'linuxhint'))
root_dir = os.sti.utvidelsesbruker (os.sti.bli med ('~', '.ssh '))
shutil.make_archive (archive_directory, 'gztar', root_dir)
Her er hva vi kommer tilbake med denne kommandoen:
Arkiveringskatalog
Hvis du tar arkiveringen av TAR-filen og ser, vil den inneholde alle .ssh katalogfiler i den.
Konklusjon
I denne leksjonen så vi på hvordan vi enkelt kan administrere filobjekter med filoperasjoner på høyt nivå shutil modul i Python. Operasjoner som å kopiere innholdet i en fil, opprette en ny kopi av en fil osv. så enkelt ut med denne modulen.