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 osimport 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 osimport 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 osimport 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 importerenimport 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 importerenimport 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 Shutilprint(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 Shutiltotal_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 Shutilimporteer 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.