Python

Shutil-module in Python

Shutil-module in Python
Bestandsbeheer en verwerking van bestandsobjecten worden beschouwd als een van de meest lastige taken in alle programmeertalen. Sommige programmeertalen bieden ons een aantal tools die de moeilijke delen van Bestandsafhandeling abstraheren met gebruiksvriendelijke functies en interfaces. Dit is precies wat Python's is Shutil module doet het ook.

Python-shutil

Met de Python-shutil-module kan een ontwikkelaar bestandsobjecten heel gemakkelijk gebruiken en zonder dieper in te gaan op hoe dingen onder de dekens werken. Deze module abstraheert in feite de semantiek op laag niveau van het maken en beheren van bestandsobjecten, schoon ze op zodra het gebruik is voltooid en stelt ons in staat om ons te concentreren op de bedrijfslogica van de applicatie. We zullen hier veel voorbeelden zien, laten we beginnen.

Voorbeelden met Python-shutil-module

We zullen verschillende voorbeelden bestuderen die het gebruik van Python demonstreren Shutil module hier.

Een bestand kopiëren

Met de Kopieer bestand() functie in Shutil module, kunnen we overal op de machine een exacte kopie maken van een bestaand bestand. Laten we een voorbeeldprogramma bekijken om te laten zien hoe dit kan:

importeer os
import Shutil
file_directory = './Bestanden'
print('Bestanden voor:', os.lijstmap(bestandsmap))
Shutil.Kopieer bestand('./Bestanden/hallo.tekst', './Files/hallo_opnieuw.tekst')
print('Bestanden na:', os.lijstmap(bestandsmap))

We hebben zojuist een bestand gekopieerd dat in de opgegeven map staat om het bestand in dezelfde map te klonen. Dit is wat we terugkrijgen met deze opdracht:

Python-shutil-bestand kopiëren

Het goede aan deze functie is dat de genoemde functie ook de naam van het nieuw aan te maken bestand als invoer neemt.

Bestanden kopiëren naar een andere map

Het is mogelijk om een ​​bestand naar een nieuwe map te kopiëren met Shutil's kopiëren() functie. Laten we het in actie bekijken:

importeer os
import Shutil
print('Een nieuwe map maken.')
os.mkdir('LinuxHint')
print('Bestanden voor: ', os.lijstmap('LinuxHint'))
Shutil.kopiëren('./Bestanden/hallo.txt', 'LinuxHint')
print('Bestanden na: ', os.lijstmap('LinuxHint'))

Laten we de uitvoer voor deze opdracht bekijken:

Bestand kopiëren naar een nieuwe map

Merk op dat wanneer een bestand wordt gekopieerd met de kopiëren() functie, machtigingen voor het bestand worden ook gekloond maar metadata van het bestand wordt niet gekopieerd. Dit betekent dat wanneer je controleert wanneer dit bestand is gemaakt, het de nieuwe tijd zal tonen waarop je dit script hebt uitgevoerd.

Bestand kopiëren met metadata

In het laatste gedeelte hebben we gezien hoe we een kopie van het bestand konden maken. Wat als u een exacte kloon van een bestand wilt maken, waarbij ook de metagegevens worden gekloond, zoals toen het bestand werd gemaakt, enz. Dit kan ook maar dit werkt mogelijk niet op een op POSIX gebaseerd systeem. Laten we eens kijken naar een voorbeeld van hoe dit kan worden gedaan:

importeer os
import Shutil
import tijd
new_directory = 'LinuxHint'
src_file = './Bestanden/hallo.tekst'
dest_file = './LinuxHint/hallo.tekst'
def file_metadata(bestand):
stat_info = os.stat (bestand)
print(' Mode :', oct(stat_info).st_mode))
print(' Gemaakt :', tijd.ctime(stat_info.st_ctime))
print(' Betreden:', tijd.ctime(stat_info.st_atime))
print(' Gewijzigd:', tijd.ctime(stat_info.st_mtime))
os.mkdir(nieuwe_directory)
print('Metadata voor bronbestand:')
file_metadata(src_file)
Shutil.copy2(src_file, nieuwe_directory)
print('Metadata voor bestemmingsbestand:')
file_metadata(dest_file)

Dit is wat we terugkrijgen met deze opdracht wanneer we dit uitvoeren op een POSIX-gebaseerd systeem (metadata wordt niet volledig gekloond):

Kopieer bestand met metadata

Op niet-POSIX-gebaseerde systemen zou zelfs de gecreëerde en geopende tijd exact overeenkomen.

Volledige directory klonen

In de laatste sectie hebben we gezien hoe we een kopie van het bestand konden maken. Hier zullen we zien hoe we een volledige map recursief kunnen klonen. Dit betekent dat als er een andere map bestaat in de map die we willen klonen, deze ook gekloond zal worden.

pprint importeren
import Shutil
importeer os
src_directory = './Bestanden'
dest_directory = './LinuxHint'
Shutil.copytree(src_directory, dest_directory)
print('Inhoud van bron:')
pprint.pprint(os.lijstmap(src_directory))
print('Inhoud van bestemming:')
pprint.pprint(os.lijstmap (bestemmingsmap))

Laten we de uitvoer voor deze opdracht bekijken:

Een map dupliceren

Merk op dat de map die we doorgeven aan copytree() functioneert als bestemmingsmap mag niet bestaan ​​voordat we dit programma uitvoeren.

Een telefoonboek verwijderen

Het verwijderen van een map is heel eenvoudig met de rmboom() functie in de module. Laten we deze functie hier in actie zien:

pprint importeren
import Shutil
importeer os
delete_directory = 'LinuxHint'
huidige_directory = '.'
print('Inhoud voor verwijdering:')
pprint.pprint(os.lijstmap(huidige_map))
Shutil.rmtree(verwijder_directory)
print('Inhoud na verwijdering:')
pprint.pprint(os.lijstmap(huidige_map))

Na het uitvoeren van het script, LinuxHint map wordt verwijderd samen met de inhoud. Dit is wat we terugkrijgen met deze opdracht:

Directory verwijderen

Bestanden zoeken

Als u een bestand wilt vinden dat aanwezig is op de PATH-variabele op uw machine, kunnen we de . gebruiken welke() functie om dat bestand op naam te vinden. Laten we een demonstratievoorbeeld voor deze functie bekijken:

import Shutil
print(shutil).welke('bsondump'))
print(shutil).welke('geen-bestand-gevonden'))

Dit is wat we terugkrijgen met deze opdracht:

Zoek bestand op PATH

Ruimte in het bestandssysteem bewaken

Met de Shutil-module hebben we een functie disk_usage() waarmee we ook schijfruimte-informatie over onze machine kunnen krijgen. Laten we eens kijken naar een voorbeeld waarin deze gegevens op een voor mensen leesbare manier worden weergegeven:

import Shutil
total_b, used_b, free_b = Shutil.schijfgebruik('.')
gb = 10 ** 9 # GB == gigabyte
print('Totaal: :6.2f GB'.formaat (totaal_b / gb))
print('Gebruikt : :6.2f GB'.formaat (gebruikt_b / gb))
print('Gratis : :6.2f GB'.formaat (free_b / gb))

Dit is wat we terugkrijgen met deze opdracht:

Ruimte in het bestandssysteem vinden

Mappen archiveren

Als laatste voorbeeld zullen we zien hoe we een directory-shutil-module kunnen archiveren make_archive() functie. Laten we eens kijken naar het voorbeeldprogramma:

import Shutil
importeer os
archiefmap = \
os.pad.expanduser(os.pad.join('bestemmingsmap-pad', 'linuxhint'))
root_dir = os.pad.expanduser(os.pad.join('~', '.ssh'))
Shutil.make_archive(archiefmap, 'gztar', root_dir)

Dit is wat we terugkrijgen met deze opdracht:

Archiefmap

Als u het TAR-bestand uit het archief haalt en een kijkje neemt, bevat het alle .ssh directory-bestanden erin.

Conclusie

In deze les hebben we gekeken hoe we bestandsobjecten gemakkelijk kunnen beheren met bestandsbewerkingen op hoog niveau met: Shutil module in Python. Bewerkingen zoals het kopiëren van de inhoud van een bestand, het maken van een nieuwe kopie van een bestand enz. zag er gemakkelijk uit met deze module.

Beste gameconsole-emulators voor Linux
Dit artikel bevat een lijst van populaire emulatiesoftware voor gameconsoles die beschikbaar is voor Linux. Emulatie is een softwarecompatibiliteitsla...
Beste Linux-distributies voor gaming in 2021
Het Linux-besturingssysteem heeft een lange weg afgelegd van zijn oorspronkelijke, eenvoudige, servergebaseerde uiterlijk. Dit besturingssysteem is de...
Hoe u uw gamesessie op Linux kunt vastleggen en streamen
In het verleden werd het spelen van games alleen als een hobby beschouwd, maar met de tijd zag de game-industrie een enorme groei in termen van techno...