Ĉapitro 9 - Organizado Dosieroj
Subtenu la Aŭtoro: Aĉeti la libron sur Amazono aŭ
la libro / ebook pakaĵo rekte Neniu amelo Gazetaro .
Legi la aŭtora aliaj liberaj Python libroj:
Organiza Dosieroj
En la antaŭa ĉapitro, vi lernis kiel krei kaj skribi al novaj dosieroj en Python. Viaj programoj povas ankaŭ organizi preexistente dosierojn sur la malmola disko.
Eble vi havis la sperton iri tra dosierujo plena de dekoj, centoj aŭ eĉ
miloj de dosieroj kaj kopiado, renomante, movanta, aŭ kunpremante ilin
ĉiujn mane. Aŭ konsideri taskoj kiel tiuj:
- Farante kopioj de ĉiu PDF dosieroj (kaj nur la PDF dosierojn) en ĉiu sub-dosierujo de dosierujo
- Forigante la kondukante nuloj en la dosiernomojn por ĉiu dosiero en dosierujo de centoj de dosieroj nomita spam001.txt, spam002.txt, spam003.txt, kaj tiel plu
- Kunpremante la enhavon de pluraj dosierujoj en unu ZIP-dosiero (kiu povus esti simpla rezerva sistemo)
Ĉiuj ĉi enuaj estas simple petante esti aŭtomatigitaj en Python.
Per programado vian komputilon fari tiujn taskojn, vi povas transformi
ĝin en rapida-laborista dosiero komizo kiu neniam faras erarojn.
Kiel vi komencos labori kun dosieroj, vi povas trovi ĝin utila por povi rapide vidi kio la pligrandigo (. Txt,. Pdf,. Jpg, kaj tiel plu) de dosiero. Kun OS X kaj Linukso, vian dosieron retumilo plej verŝajna montras etendoj aŭtomate. Kun Vindozo, dosieraj sufiksoj povas esti kaŝita defaŭlte. Montri etendojn, iru al Start ▸ Kontrolo Panelo ▸ Ŝajno kaj Personigo ▸ Dosierujo Ebloj. Sur la Vido langeto, sub Altnivelaj agordoj, malmarku la Kaŝi etendojn por konata dosiertipoj markobutono.
La shutil Modulo
La
shutil
(aŭ ŝelo utilecoj) modulo havas funkciojn lasi vin kopii, movi, renomi, kaj forviŝi dosierojn en via Python programoj. Uzi la shutil
funkciojn, vi unue bezonas uzi import shutil
. Kopiado Fajliloj kaj Dosierujoj
La
shutil
modjulo provizas por kopiado dosierojn, tiel kiel tutaj dosierujoj.
Nomante
shutil.copy(
source, destination
)
kopios la dosieron ĉe la vojo source
al la dosierujo en la vojo destination
. (Ambaŭ source
kaj destination
estas ŝnuroj.) Se destination
estas dosiernomo, ĝi estos uzita kiel la nova nomo de la kopiita dosieron. Tiu funkcio redonas ĉenon de la vojo de la kopiita dosieron.
Eniri la sekva en la interaga ŝelo vidi kiel
shutil.copy()
funkcias: >>> Import shutil, os >>> Os.chdir ( 'C: \\') ❶ >>> shutil.copy ( 'C: \\ spam.txt', 'C: \\ bongustega') 'C: \\ bongustega \\ spam.txt' ❷ >>> shutil.copy ( 'eggs.txt', 'C: \\ bongustega \\ eggs2.txt') 'C: \\ bongustega \\ eggs2.txt'
La unua
shutil.copy()
alvoko kopioj la dosieron je C: \ spam.txt al la dosierujo C: \ bongustega. La reveno valoro estas la vojo de la nove kopiis dosiero. Noti ke ekde dosierujo specifis kiel la celloko ❶, la originalaj spam.txt dosiernomo estas uzata por la nova, kopiis dosiero dosiernomo. La dua shutil.copy()
vokas ❷ ankaŭ kopias la dosieron je C: \ eggs.txt al la dosierujo C: \ bongusta sed donas la kopiitaj dosiero la nomo eggs2.txt.
Dum
shutil.copy()
kopios sola dosiero, shutil.copytree()
kopios tuta dosierujo kaj ĉiu dosierujo kaj dosiero enhavis en gxi. Nomante shutil.copytree(
source, destination
)
kopios la dosierujo ĉe la vojo source
, kune kun ĉiuj ties dosieroj kaj subdosierujojn, al la dosierujo en la vojo destination
. La source
kaj destination
parametroj estas ambaŭ kordoj. La funkcio redonas ĉenon de la vojo de la kopiitaj dosierujo.
Eniri la sekva en la interaga konko:
>>> Import shutil, os >>> Os.chdir ( 'C: \\') >>> Shutil.copytree ( 'C: \\ lardo', 'C: \\ bacon_backup') 'C: \\ bacon_backup'
La
shutil.copytree()
alvoko kreas novan dosierujon nomita bacon_backup kun la sama enhavo kiel la originala lardo dosierujo. Vi nun sekure asist viajn altvalora, grandvalora lardo. Movante kaj Renomado Fajliloj kaj Dosierujoj
Nomante
shutil.move(
source, destination
)
movos la dosiero aŭ dosierujo ĉe la vojo source
por la vojo destination
kaj revenos kordo de la absoluta pado de la nova loko.
Se
destination
punktoj al dosierujo, la source
dosiero iĝas proponita en destination
kaj subtenas lian aktualan dosiernomon. Ekzemple, tajpu la sekvajn en la interaga konko: >>> Import shutil >>> Shutil.move ( 'C: \\ bacon.txt', 'C: \\ ovojn') 'C: \\ ovojn \\ bacon.txt'
Supozante dosierujo nomita ovojn jam ekzistas en la C: \ dosierujo, ĉi
shutil.move()
alvokas diras, "Move C: \ bacon.txt en la dosierujo C: \ ovojn."
Se estus donita bacon.txt dosiero jam en C: \ ovojn, ĝi estus anstataŭigataj. Ĉar ĝi estas facile hazarde anstataŭigi dosierojn tiamaniere, vi devus preni iun zorgon uzinte
move()
.
La
destination
vojo povas ankaŭ specifi dosiernomo. En jena ekzemplo, la source
dosiero estas movita kaj renomita. >>> Shutil.move ( 'C: \\ bacon.txt', 'C: \\ ovojn \\ new_bacon.txt') 'C: \\ ovojn \\ new_bacon.txt'
Tiu linio diras, "Movu C: \ bacon.txt en la dosierujo C: \ ovojn, kaj dum vi estas en ĝi, renomi ke bacon.txt dosiero new_bacon.txt."
Ambaŭ de la antaŭaj ekzemploj laboris sub la premiso ke okazis dosierujo ovojn en la C: \ dosierujo. Sed se ne cxeestas ovojn dosierujo, tiam
move()
estos renomi bacon.txt al dosiero nomita ovojn. >>> Shutil.move ( 'C: \\ bacon.txt', 'C: \\ ovojn') 'C: \\ ovojn'
Tie,
move()
ne trovos dosierujon nomita ovojn en la C: \ dosierujon kaj tiel supozas ke destination
devas preciziganta dosiernomo, ne estas dosierujo. Tial la bacon.txt teksto dosiero estas renomita al ovoj (tekstdosiero sen la .txt dosiersufikso) -probably ne kion vi volis! Tio povas esti malmola-al-punkto cimo en viaj programoj ekde la move()
alvoko povas feliĉe fari iun kiu povus esti tre malsama de kion vi atendis. Ĉi estas ankoraŭ alia kialo esti zorgema uzinte move()
.
Fine, la dosierujojn kiuj konsistigas la celloko devas jam ekzisti, alie Python ĵetos escepton. Eniri la sekva en la interaga konko:
>>> Shutil.move ( 'spam.txt', 'c: \\ does_not_exist \\ ovojn \\ ŝinko') Traceback (plej lasta alvoko lasta): Dosiera "C: \ Python34 \ lib \ shutil.py", linio 521, en movado os.rename (src, real_dst) FileNotFoundError: [WinError 3] La sistemo ne povas trovi la vojon specifita: 'Spam.txt' -> 'c: \\ does_not_exist \\ ovojn \\ ŝinko' Dum uzado de la supre escepto, alia escepto okazis: Traceback (plej lasta alvoko lasta): Dosiero "<pyshell # 29>", linio 1, en <modulo> shutil.move ( 'spam.txt', 'c: \\ does_not_exist \\ ovojn \\ ŝinko') Dosiera "C: \ Python34 \ lib \ shutil.py", linio 533, en movado copy2 (src, real_dst) Dosiera "C: \ Python34 \ lib \ shutil.py", linio 244, en copy2 copyfile (src, dst, follow_symlinks = follow_symlinks) Dosiera "C: \ Python34 \ lib \ shutil.py", linio 108, en copyfile kun malferma (DST 'WB') kiel fdst: FileNotFoundError: [errno 2] Neniu tia dosiero aŭ dosierujo: 'c: \\ does_not_exist \\ ovojn \\ ŝinko '
Python serĉas ovojn kaj ŝinkon ene la dosierujo does_not_exist. Ĝi ne trovas la inexistente dosierujo, do ĝi ne povas movi spam.txt al la vojo vi specifitaj.
Konstante Forigo Fajliloj kaj Dosierujoj
Vi povas forviŝi sola dosiero aŭ ununura malplena dosierujo kun funkcioj en la
os
modulo, dum forviŝi dosierujon kaj ĉiuj liaj enhavoj, vi uzu la shutil
modulo. - Nomante
os.unlink(
path
)
viŝos la dosieron ĉepath
. - Nomante
os.rmdir(
path
)
viŝos la dosierujo ĉepath
. Ĉi dosierujo devas esti malplenaj de ajna dosierojn aŭ dosierujojn. - Nomante
shutil.rmtree(
path
)
forigos la dosierujo ĉepath
kaj ĉiujn dosierojn kaj dosierujojn enhavas ankaŭ estos forigitaj.
Estu zorgema kiam uzas tiujn funkciojn en viaj programoj! Ĝi estas ofte bona ideo unue kuri via programo kun tiuj alvokoj komentis ekstere kaj kun
print()
alvokoj aldonis montri la dosierojn kiu estus forigita. Jen Python programo kiu celas forigi dosierojn kiuj havas la .txt dosiersufikso sed havas tajperaro (elstarigitaj en aŭdaca) kiu igas ĝin forigi .rxt dosierojn anstataŭ: import os por dosiernomo en os.listdir (): se filename.endswith ( '. r xt'): os.unlink (dosiernomo)
Se vi havus ajnan gravan dosierojn finante kun .rxt, ili estus estinta hazarde, konstante forigita. Anstataŭe, vi devus havi unuan kuron la programon tiel:
import os por dosiernomo en os.listdir (): se filename.endswith ( '. rxt'): # Os.unlink (dosiernomo) print (dosiernomo)
Nun la
os.unlink()
alvoko estas diritaj, do Pitono ignoras. Anstataŭe, vi presos la dosiernomo de la dosiero kiu estis forigita. Kurante ĉi tiu versio de la programo unua montros vin ke vi hazarde sciigis la programo por forviŝi .rxt dosierojn anstataŭ .txt dosierojn.
Unufoje vi scias la programo funkcias kiel intencita, forigi la
print(filename)
linio kaj uncomment la os.unlink(filename)
linio. Poste ekzekuti la programo denove reale forigi la dosierojn. Sekura Viŝas per send2trash Modulo
Ekde Python korpigita
shutil.rmtree()
funkcio neinversigeble forigas dosierojn kaj dosierujojn, ĝi povas esti danĝera por uzi. Multe pli bona maniero forigi dosierojn kaj dosierujojn estas la triaj send2trash
modulo. Vi povas instali tiun modulon per kurado pip install send2trash
de Terminal fenestro. (Vidu Apendico A por pli detala ekspliko de kiel instali triaj moduloj.)
Uzante
send2trash
estas multe pli sekura ol Python regula delete funkcioj, ĉar ĝi sendos
dosierujojn kaj dosierojn al via komputilo rubo aŭ recicla bin anstataŭ
konstante forigi ilin. Se cimo en via programo forigas ion kun send2trash
vi ne intencis forviŝi, vi povas poste redoni ĝin de la recicla bin.
Post vi instalis
send2trash
, eniri la sekva en la interaga konko: >>> Import send2trash >>> BaconFile = malfermita ( 'bacon.txt', 'a') # kreas la dosieron >>> BaconFile.write ( 'Bacon ne estas legomo.') 25 >>> BaconFile.close () >>> Send2trash.send2trash ( 'bacon.txt')
Ĝenerale, vi devus ĉiam uzi la
send2trash.send2trash()
funkcion por forviŝi dosierojn kaj dosierujojn.
Sed dum sendo dosierojn al la recicla bin permesas rekuperi ilin poste,
ĝi ne liberigi diskspaco kiel konstante viŝante ilin faras. Se vi volas vian programon por liberigi diskospaco, uzi la os
kaj shutil
funkcioj por forigi dosierojn kaj dosierujojn. Notu ke la send2trash()
funkcio povas nur sendi dosierojn al la recicla bin; ĝi ne povas tiri dosierojn el ĝi. Marŝinte Gvidlibro Arbo
Diru vi volas renomi ĉiun dosieron en iu dosierujo kaj ankaŭ ĉiu dosiero en ĉiu subdosierujo de tiu dosierujo. Te vi volas promeni tra la arbo, pri ĉiu dosiero kiel vi iras. Skribi programon por fari ĉi povus akiri malfacila; feliĉe, Python provizas funkcio por manipuli ĉi procezo por vi.
Ni rigardu la C: \ bongustega dosierujo kun lia enhavo, montrita en Figuro 9-1 .
Figuro 9-1. Ekzemplo dosierujo kiu enhavas tri dosierujojn kaj kvar dosierojn
Jen ekzemplo programo kiu uzas la
os.walk()
funkcio sur la arbo de Figuro 9-1 : import os por folderName, subdosierujojn, dosiernomoj en os.walk ( 'C: \\ bongustega'): print ( 'La nuna dosierujo estas' + folderName) por subdosierujo en subdosierujojn: print ( 'subdosierujo de' + folderName + ':' + subdosierujon) por dosiernomo en dosiernomoj: print ( 'DOSIERO INSIDE' + folderName + ':' + dosiernomo) print ( '')
La
os.walk()
funkcio estas pasita sola kordoj valoro: la vojeto de dosierujo. Vi povas uzi os.walk()
en for
buklo komunikaĵo marŝi dosieruja arbo, tre kiel kiel vi povas uzi la range()
funkcio piediri trans vico da nombroj. Kontraste range()
, la os.walk()
funkcio estos redoni tri valoroj sur ĉiu ripeto tra la buklo: - Kordo de la aktuala dosierujo nomon
- Listo de kordoj de la dosierujoj en la nuna leterujo
- Listo de kordoj de la dosierojn en la nuna dosierujo
(Per nuna dosierujo, mi signifas la dosierujo por la aktuala ripeto de la
for
buklo. La nuna laboranta dosierujo de la programo ne ŝanĝis de os.walk()
.)
Nur ŝatas vin povas elekti la variablo nomo
i
en la kodo for i in range(10):
, Vi povas ankaŭ elekti la variablo nomoj por la tri valoroj antaŭe listigita. Mi kutime uzas la nomojn foldername
, subfolders
kaj filenames
.
Kiam vi kuros ĉi programo, ĝi eligo la sekvaj:
La nuna dosierujo estas C: \ bongustega Subdosierujo de C: \ bongustega: katoj Subdosierujo de C: \ bongustega: juglando Dosieron ene C: \ bongustega: spam.txt La nuna dosierujo estas C: \ bongustega \ katoj Dosieron ene C: \ bongustega \ katoj: catnames.txt Dosieron ene C: \ bongustega \ katoj: zophie.jpg La nuna dosierujo estas C: \ bongustega \ juglando Subdosierujo de C: \ bongustega \ juglando: waffles La nuna dosierujo estas C: \ bongustega \ juglando \ waffles Dosieron ene C: \ bongustega \ juglando \ waffles: butter.txt.
Ekde
os.walk()
redonas listoj de kordoj por la subfolder
kaj filename
variabloj, vi povas uzi tiujn listojn en ilia propra for
bukloj. Anstataŭi la print()
funkcio alvokoj kun via propra kutimo kodo. (Aŭ se vi ne bezonas unu aŭ ambaŭ el ili, forigi la for
bukloj.) Kunpremante Dosieroj kun la zipfile Modulo
Vi povas esti konata kun ZIP- dosierojn (kun la .zip dosiersufikso), kiu povas okazigi la kunpremita enhavo de multaj aliaj dosieroj. Kunpremante dosiero reduktas lian grandecon, kiu estas utila kiam translokiganta ĝin super la Interreto. kaj
ekde ZIP dosiero povas enhavi multoblajn dosierojn kaj subdosierujojn,
estas oportuna maniero por paki plurajn dosierojn en unu. Ĉi unuope, nomata arkivon, tiam povas esti, ekzemple, alkroĉita al mesaĝo.
Via Python programoj povas ambaŭ krei kaj malfermita (aŭ ekstrakto) ZIP dosierojn uzante funkciojn en la
zipfile
modulo. Diru vi havas ZIP- dosiero nomita example.zip kiu havas la enhavon montrita en Figuro 9-2 .
Vi povas elŝuti ĉi ZIP- dosiero el http://nostarch.com/automatestuff/ aŭ simple sekvi kune uzante ZIP- dosiero jam en via komputilo.
Figuro 9-2. La enhavo de example.zip
Legante Poŝtkodo Dosieroj
Legi la enhavon de ZIP-dosiero, unue vi devas krei
ZipFile
objekto (rimarku la majuskloj Z kaj F). ZipFile
objektoj estas koncepte similaj al la File
celoj vi vidis revenis por la open()
funkcio en la antaŭa ĉapitro: Ili estas valoroj tra kiu la programo interagas kun la dosiero. Krei ZipFile
objekto, invitu zipfile.ZipFile()
funkcio, pasante ĝin ŝnuro de la .zip dosiero dosiernomo. Notu ke zipfile
estas la nomo de la Python modulo kaj ZipFile()
estas la nomo de la funkcio.
Ekzemple, tajpu la sekvajn en la interaga konko:
>>> Import zipfile, os >>> Os.chdir ( 'C: \\') # movon al la dosierujo kun example.zip >>> ExampleZip = zipfile.ZipFile ( 'example.zip') >>> ExampleZip.namelist () [ 'Spam.txt', 'katoj /', 'katoj / catnames.txt', 'katoj / zophie.jpg'] >>> SpamInfo = exampleZip.getinfo ( 'spam.txt') >>> spamInfo.file_size 13908 >>> spamInfo.compress_size 3828 ❶ >>> 'Kunpremita dosiero% sx malgrandaj! % (Ronda (spamInfo.file_size / spamInfo .compress_size, 2)) 'Kunpremita dosiero 3.63x malgrandaj! >>> ExampleZip.close ()
A
ZipFile
objekto havas namelist()
metodo kiu resendas liston de kordoj por ĉiuj dosieroj kaj dosierujoj enhavita en la ZIP-dosiero. Tiuj kordoj povas esti pasita al la getinfo() ZipFile
metodo redoni ZipInfo
objekto sur tiu aparta dosiero. ZipInfo
objektoj havas siajn proprajn atributojn, kiel file_size
kaj compress_size
en bajtoj, kiuj tenas entjeroj de la originala dosiero grandeco kaj kunpremita dosiero grandeco, respektive. Dum ZipFile
objekto reprezentas tutan arkivon, oni ZipInfo
objekto tenas utilaj informoj pri ununura dosiero en la arkivo.
La komando ĉe ❶ kalkulas kiom efike example.zip
estas kunpremita per dividanta la originala dosiero grandeco de la
kunpremita dosiero grandeco kaj presaĵoj tiun informon uzante ŝnuro
formateados kun
%s
. Ĉerpi el Poŝtkodo Dosieroj
La
extractall()
metodo por ZipFile
objektoj eltiraĵoj ĉiujn dosierojn kaj dosierujojn de ZIP-dosiero en la aktuala labordosierujon. >>> Import zipfile, os >>> Os.chdir ( 'C: \\') # movon al la dosierujo kun example.zip >>> ExampleZip = zipfile.ZipFile ( 'example.zip') ❶ >>> exampleZip.extractall () >>> ExampleZip.close ()
Post kuri tiun kodon, la enhavo de example.zip ĉerpos al C: \. Laŭvole, vi povas pasi dosierujo nomo por
extractall()
havi ĝin ekstrakti la dosierojn en dosierujo alia ol la nuna labordosierujon. Se la dosierujo pasis al la extractall()
metodo ne ekzistas, ĝi estos kreita. Ekzemple, se vi anstataŭigis la alvokon ĉe ❶ kun exampleZip.extractall('C:\\ delicious')
, la kodo estus eltiri la dosierojn el example.zip en nove kreita C: \ bongustega dosierujo.
La
extract()
metodo por ZipFile
objektoj ĉerpos sola dosiero de la ZIP-dosiero. Daŭrigi la interaga ŝelo ekzemple: >>> ExampleZip.extract ( 'spam.txt') 'C: \\ spam.txt' >>> ExampleZip.extract ( 'spam.txt', 'C: \\ iuj \\ nova \\ dosierujoj') 'C: \\ iuj \\ nova \\ dosierujoj \\ spam.txt' >>> ExampleZip.close ()
La kordoj pasas al
extract()
devas kongrui unu el la kordoj en la listo revenis por namelist()
. Laŭvole, vi povas pasi dua argumento por extract()
ĉerpi la dosieron en dosierujo alia ol la nuna labordosierujon. Se tiu dua argumento estas dosierujo kiu ankoraŭ ne ekzistas, Pitono kreos dosierujon. La valoro kiu extract()
redonas estas la absoluta pado al kiu la dosiero ĉerpis. Kreado kaj Aldonante Poŝtkodo Dosieroj
Krei vian propran kunpremita Poŝtkodo dosierojn, vi devas malfermi la
ZipFile
objekto en registran reĝimo pasante 'w'
kiel la dua argumento. (Tio estas simila al malfermanta tekstdosiero en registran reĝimo pasante 'w'
por la open()
funkcio.)
Kiam vi pasas padon al la
write()
metodon de ZipFile
objekto, Pitono estos kunpremi la dosieron en tiu vojo kaj aldoni ĝin en la ZIP-dosiero. La write()
metodon unua argumento estas ĉeno de la dosiernomo aldoni. La dua argumento estas la kunpremo tipo parametro, kiu rakontas la komputilo kio algoritmo devus uzi por kunpremi la dosierojn; vi povas ĉiam nur povas tion valoro al zipfile.ZIP_DEFLATED
. (Tiu specifas la deflate kunpremo algoritmo, kiu laboras bone sur ĉiuj tipoj de datumoj.) Enmetu la sekva en la interaga konko: >>> Import zipfile >>> NewZip = zipfile.ZipFile ( 'new.zip', 'w') >>> NewZip.write ( 'spam.txt', compress_type = zipfile.ZIP_DEFLATED) >>> NewZip.close ()
Tiu kodo kreos novan ZIP- dosiero nomita new.zip kiu havas la kunpremita enhavo de spam.txt.
Memoru ke, kiel kun skribanta al dosieroj, skribu mode forviŝos ĉiun ekzistantan enhavon de ZIP-dosiero. Se vi volas simple aldoni dosierojn al ekzistanta ZIP- dosiero, pasas
'a'
kiel la dua argumento al zipfile.ZipFile()
malfermi la ZIP-dosiero en append reĝimo. Projekto: alinomi dosierojn kun American-Style Datoj por Eŭropa-stilo Datoj
Diri vian estron retpoŝtojn vin miloj de dosieroj kun American-stila
datoj (MM-DD-YYYY) en siaj nomoj kaj bezonas ilin renomita al eŭropa
stilo datoj (DD-MM-YYYY). Tiu enuiga tasko povis preni tutan tagon por fari mane! Ni skribi programon por fari ĝin anstataŭe.
Jen kion la programo faras:
- Ĝi serĉas ĉiuj dosiernomoj en la nuna laboranta dosierujo por American-stila datoj.
- Kiam oni troviĝas, ĝi renomas la dosieron kun la monato kaj tago interŝanĝis por fari ĝin eŭropa stilo.
Tio signifas la kodo devas fari la sekvajn:
- Krei regex kiu povas identigi la teksto padrono de usona stilo datoj.
- Voku
os.listdir()
por trovi ĉiujn dosierojn en la labordosierujon. - Buklo super ĉiu dosiernomo, uzante la regex kontroli ĉu ĝi havas daton.
- Se ĝi havas daton, renomi la dosieron kun
shutil.move()
.
Por tiu projekto, malfermi novan dosieron redaktanto fenestro kaj savu vian kodo kiel renameDates.py.
Paŝo 1: Krei Regex por American-Style Datoj
La unua parto de la programo bezonos importi la necesajn modulojn kaj krei regex kiu povas identigi MM-DD-YYYY datoj. La por-do komentojn vin memorigos kio restas al skribi en ĉi tiu programo. Entajpigo kiel
TODO
igas ilin facile trovi uzante sencela la CTRL -F trovi karakterizaĵo. Fari vian kodo aspektas kiel la sekvaj: #! python3 # RenameDates.py - renomas dosiernomoj kun usonano MM-DD-YYYY daton formato # Al Eŭropa DD-MM-YYYY. ❶ importado shutil, os, re # Krei regex kiu kongruas dosierojn kun la usona daton formaton. ❷ datePattern = re.compile (r "" "^ (. *?) # Tutan tekston antaŭ la dato ((0 | 1)? \ D) - # unu aŭ du ciferoj por la monato ((0 | 1 | 2 | 3)? \ D) - # unu aŭ du ciferoj por la tago ((19 | 20) \ d \ d) # kvar ciferoj por la jaro (. *?) $ # Tutan tekston post la dato ❸ "" ", re.VERBOSE) # TODO: Loop super la dosierojn en la labordosierujon. # TODO: Rekte dosierojn sen dato. # TODO: Akiru la malsamaj partoj de la dosiernomo. # TODO: Formu la eŭropa stilo dosiernomo. # TODO: Akiri la plenan absolutan dosiero vojojn. # TODO: Alinomi la dosierojn.
El tiu ĉapitro, vi konas la
shutil.move()
funkcio povas esti uzata por renomi dosierojn: Lia argumentoj estas la nomo de la dosiero renomi kaj la nova dosiernomo. Ĉar tiu funkcio ekzistas en la shutil
modulo, vi devas importi ke modulo ❶.
Sed antaŭ renomante la dosierojn, vi devas identigi kiuj dosierojn vi volas renomi. Dosiernomoj kun datoj kiel spam4-4-1984.txt kaj 01-03-2014eggs.zip devus esti renomita, dum dosiernomoj sen datoj kiel littlebrother.epub povas esti ignorita.
Vi povas uzi regula esprimo identigi desegno. Post importi la
re
modulo ĉe la supro, voki re.compile()
por krei Regex
objekto ❷. Pasante re.VERBOSE
por la dua argumento ❸ permesos spaceto kaj komentoj en la regex ĉeno por fari ĝin pli legebla.
La regula esprimo ŝnuro komencas kun
^(.*?)
Por kongrui ajna teksto ĉe la komenco de la dosiernomo kiuj povus veni antaŭ la dato. La ((0|1)?\d)
grupmatĉoj la monato. La unua cifero povas esti aŭ 0
aŭ 1
, por la regex egalas 12
por decembro sed ankaŭ 02
por februaro. Tiu cifero estas ankaŭ nedeviga por ke la monato povas esti 04
aŭ 4
por aprilo. La grupo por la tago estas ((0|1|2|3)?\d)
kaj sekvas similan logikon; 3
, 03
, kaj 31
estas ĉiuj valida nombroj por tagoj. (Jes, tiu regex akceptos iuj nevalidaj datojn kiel 4-31-2014
, 2-29-2013
, kaj 0-15-2014
. Datoj havas multajn dornaj specialaj kazoj kiuj povas esti facile
perdiĝas. Sed por simpleco, la regex en tiu programo funkcias bone
sufiĉe.)
Dum 1885 estas valida jaro, vi povas simple serĉi jaroj en la 20-a aŭ 21-a jarcento. Ĉi gardos vian programon el hazarde egalante nondate dosiernomoj kun dato-simila formato, kiel ekzemple 10-10-1000.txt.
La
(.*?)$
Parton de la regex kongruas ajna teksto kiu venas post la dato. Paŝo 2: Identigi la dato Partoj de la Nomoj de dosieroj
Tuj poste, la programo devos buklo super la listo de dosiernomo kordoj cxesis
os.listdir()
kaj kongruas ilin kontraŭ la regex. Ajna dosierojn kiuj ne havas daton en ili oni saltis. Por dosiernomoj, kiuj havas daton, la kongruis teksto estos stokitaj en pluraj variabloj. Plenigi la unuaj tri TODO
s en via programo kun la sekvan kodon: #! python3 # RenameDates.py - renomas dosiernomoj kun usonano MM-DD-YYYY daton formato # Al Eŭropa DD-MM-YYYY. - Snip - # Loop super la dosierojn en la labordosierujon. por amerFilename en os.listdir ( '.'): mo = datePattern.search (amerFilename) # Skip dosierojn sen dato. ❶ se mo == None: ❷ daŭrigi ❸ # Akiri la malsamaj partoj de la dosiernomo. beforePart = mo.group (1) monthPart = mo.group (2) dayPart = mo.group (4) yearPart = mo.group (6) afterPart = mo.group (8) - Snip -
Se la
Match
objekto revenis de la search()
metodo estas None
❶, tiam la dosiernomo en amerFilename
ne kongruas la regula esprimo. La continue
deklaro ❷ saltos la resto de la buklo kaj pluiri al la sekva dosiernomo.
Alie, la diversaj ĉenoj egalita en la regula esprimo grupoj estas stokitaj en variabloj nomita
beforePart
, monthPart
, dayPart
, yearPart
kaj afterPart
❸. La kordoj en tiuj variabloj estos uzataj por formi la eŭropa stilo dosiernomo en la venonta paŝo.
Teni la grupo nombroj rekte, provu legi la regex de la komenco kaj kalkuli ĉiun tempon vi renkontas malfermaĵo parentezo. Sen pensi pri la kodon, simple skribu skizon de la regula esprimo. Tio povas helpi vin bildigi la grupoj. Ekzemple:
datePattern = re.compile (r "" "^ (1) # tutan tekston antaŭ la dato (2 (3)) - # unu aŭ du ciferoj por la monato (4 (5)) - # unu aŭ du ciferoj por la tago (6 (7)) # kvar ciferoj por la jaro (8) $ # tutan tekston post la dato "" ", Re.VERBOSE)
Tie, la nombroj
1
tra 8
reprezentas la grupoj en la regula esprimo vi verkis.
Farante skizon de la regula esprimo, kun nur la krampoj kaj grupo
nombroj, povas doni al vi pli klaran komprenon de via regex antaŭ pluiri
kun la resto de la programo. Paŝo 3: Formu la Nova Dosiernomo kaj Alinomi la dosierojn
Kiel la fina paŝo, concatenate la kordoj en la variabloj faris en la
antaŭa paŝo kun la eŭropa stilo Dato: La dato venas antaŭ la monato. Plenigi la tri ceteraj
TODO
s en via programo kun la sekvan kodon: #! python3 # RenameDates.py - renomas dosiernomoj kun usonano MM-DD-YYYY daton formato # Al Eŭropa DD-MM-YYYY. - Snip - # Formo la eŭropa stilo dosiernomo. ❶ euroFilename = beforePart + dayPart + '-' + monthPart + '-' + yearPart + afterPart # Akiri la plenan absolutan dosiero vojojn. absWorkingDir = os.path.abspath ( '.') amerFilename = os.path.join (absWorkingDir, amerFilename) euroFilename = os.path.join (absWorkingDir, euroFilename) # Alinomi la dosierojn. ❷ print ( 'renombró "% s" al "% s" ...'% (amerFilename, euroFilename)) ❸ # shutil.move (amerFilename, euroFilename) # uncomment post testado
Stoki la seria ĉeno en variablo nomata
euroFilename
❶. Tiam, pasi la originala dosiernomo en amerFilename
kaj la nova euroFilename
variablo al la shutil.move()
funkcion por renomi la dosieron ❸.
Tiu programo havas la
shutil.move()
vokas komentis eksteren kaj anstataŭe presas la dosiernomoj kiu estos renomita ❷. Kurante la programo kiel ĉi tiu unua povas lasi vin duoble kontroli ke la dosieroj estas renomita korekte. Tiam vi povas uncomment la shutil.move()
alvoko kaj kuri la programon denove reale renomi dosierojn. Ideoj por Similaj Programoj
Ekzistas multaj aliaj kialoj kial vi eble volas renomi granda nombro de dosieroj.
- Aldoni prefikson al la komenco de la dosiernomo, kiel aldono spam_ renomi eggs.txt al spam_eggs.txt
- Ŝanĝi dosiernomoj kun eŭropa stilo datoj al usona stilo datoj
- Forigi la nuloj de dosieroj kiel spam0042.txt
Projekto: subtenanta supre Dosierujo en ZIP Dosiero
Diru vi laboras en projekto kies dosierojn vi tenas en dosierujo nomita C: \ AlsPythonBook. Vi estas maltrankvilita pri perdanta vian laboron, do vi ŝatus krei ZIP- dosiero "instantáneas" de la tuta dosierujo. Vi ŝatus teni malsamaj versioj, do vi volas la ZIP dosiero dosiernomo pliigo ĉiu tempo ĝi estas farita; ekzemple, AlsPythonBook_1.zip, AlsPythonBook_2.zip, AlsPythonBook_3.zip, kaj tiel plu. Vi povus fari tion mane, sed estas prefere ĝena, kaj vi povus hazarde misnumber la ZIP dosierojn 'nomoj. Estus multe pli simple ruli programon kiu faras ĉi enuiga tasko por vi.
Por tiu projekto, malfermi novan dosieron redaktanto fenestro kaj savi ĝin kiel backupToZip.py.
Paŝo 1: Figuro El la ZIP dosiernomo
La kodo por tiu programo estos metita en funkcio nomita
backupToZip()
. Tiu faros ĝin facile kopii kaj almeti la funkcio en aliaj Python programoj kiuj bezonas tiun funkcion. Fine de la programo, la funkcio estos vokita plenumi la apogilo. Fari vian programon aspektas tiel: #! python3 # BackupToZip.py - Kopioj tuta dosierujo kaj ĝia enhavo en # ZIP dosiero kies dosiernomo pliigoj. ❶ importado zipfile, os def backupToZip (dosierujo): # Backup la tuta enhavo de "dosierujo" en ZIP-dosiero. dosierujo = os.path.abspath (dosierujo) # certigi dosierujo estas absoluta # Figure la dosiernomo tiu kodo devas uzi surbaze # Kion dosieroj jam ekzistas. ❷ nombro = 1 ❸ dum Vera: zipFilename = os.path.basename (dosierujo) + '_' + str (nombro) + '.zip' se ne os.path.exists (zipFilename): paŭzo nombro = nombro + 1 ❹ # TODO: Krei la ZIP-dosiero. # TODO: Iradu la tuta dosierujo arboj kaj kunpremi la dosierojn en ĉiu dosierujo. print ( 'Farita.') backupToZip ( 'C: \\ bongustega')
Fari la fundamentojn unua: Aldoni la shebang (
#!
) Linio, priskribi kion la programo faras, kaj importi la zipfile
kaj os
moduloj ❶.
Difini
backupToZip()
funkcio kiu prenas nur unu parametro, folder
. Ĉi parametro estas ĉeno padon al la dosierujo kies enhavo devus esti subtenita supre. La funkcio determinos kion dosiernomo uzi por la ZIP- dosiero kreos; tiam la funkcio kreos la dosieron, marŝi la folder
dosierujo, kaj aldoni ĉiun de la subdosierujojn kaj dosieroj al la ZIP-dosiero. Skribi TODO
komentoj por tiuj paŝoj en la fontkodon por memorigi vin al fari ilin poste ❹.
La unua parto, enoficigante la ZIP-dosiero, uzas la bazo nomo de la absoluta vojo de
folder
. Se la dosierujo esti asist estas C: \ bongusta, la ZIP dosiero nomo estu delicious_N.zip, kie N = 1 estas la unua fojo vi kuras la programon, N = 2 estas la dua fojo, kaj tiel plu.
Vi povas determini kio N devus esti de kontrolanta ĉu delicious_1.zip jam ekzistas, tiam kontrolanta ĉu delicious_2.zip jam ekzistas, kaj tiel plu. Uzu variablo nomata
number
por N ❷ kaj observu pliigante ŝin ene la buklo kiu nomas os.path.exists()
por kontroli ĉu la dosiero ekzistas ❸. La unua inexistente dosiernomo trovita kaŭzos la ciklo por break
, ĉar ĝi trovis la dosiernomo de la nova zip. Paŝo 2: Krei la Nova ZIP- Dosiero
Sekva ni kreos la ZIP-dosiero. Fari vian programon aspektas kiel la sekvaj:
#! python3 # BackupToZip.py - Kopioj tuta dosierujo kaj ĝia enhavo en # ZIP dosiero kies dosiernomo pliigoj. - Snip - dum Vera: zipFilename = os.path.basename (dosierujo) + '_' + str (nombro) + '.zip' se ne os.path.exists (zipFilename): paŭzo nombro = nombro + 1 # Krei la ZIP-dosiero. print ( 'Kreado% s ...'% (zipFilename)) ❶ backupZip = zipfile.ZipFile (zipFilename, 'w') # TODO: Iradu la tuta dosierujo arboj kaj kunpremi la dosierojn en ĉiu dosierujo. print ( 'Farita.') backupToZip ( 'C: \\ bongustega')
Nun ke la nova ZIP- dosiero nomo estas stokita en la
zipFilename
variablo, vi povas voki zipfile.ZipFile()
por fakte krei la ZIP-dosiero ❶. Nepre pasi 'w'
kiel la dua argumento por ke la ZIP dosiero estas malfermita en registran modo. Paŝo 3: Walk the Gvidlibro Arbo kaj Aldoni al la ZIP Dosiero
Nun vi devas uzi la
os.walk()
funkcio por fari la laboron de printi ĉiujn dosieron en la dosierujo kaj lia subdosierujojn. Fari vian programon aspektas kiel la sekvaj: #! python3 # BackupToZip.py - Kopioj tuta dosierujo kaj ĝia enhavo en # ZIP dosiero kies dosiernomo pliigoj. - Snip - # Ĉirkaŭpaŝas la tuta dosierujo arboj kaj kunpremi la dosierojn en ĉiu dosierujo. ❶ por foldername, subdosierujojn, dosiernomoj en os.walk (dosierujo): print ( 'Aldonante dosierojn en% s ...'% (foldername)) # Aldonu la nuna leterujo al la ZIP-dosiero. ❷ backupZip.write (foldername) # Aldoni ĉiujn dosierojn en tiu dosierujo al la ZIP-dosiero. ❸ por dosiernomo en dosiernomoj: newBase = os.path.basename (dosierujo) + '_' se filename.startswith (newBase) kaj filename.endswith ( '. zip') daŭrigi # ne rezerva la rezerva Poŝtkodo dosierojn backupZip.write (os.path.join (foldername, dosiernomo)) backupZip.close () print ( 'Farita.') backupToZip ( 'C: \\ bongustega')
Vi povas uzi
os.walk()
en for
buklo ❶, kaj sur ĉiu ripeto revenos la ripeto aktuala dosierujo nomon,
la subleterujoj en tiu dosierujo kaj la dosiernomojn en tiu dosierujo.
En la
for
ciklo, la dosierujo estas aldonita al la ZIP-dosiero ❷.La nestitaj for
buklo povas iri tra ĉiu dosiernomo en la filenames
listo ❸. Ĉiu de ĉi tiuj aldonas al la ZIP-dosiero, krom la antaŭe faritaj rezerva Zips.
Kiam vi kuros ĉi programo, ĝi produktos eligo ke aspektos ion kiel jene:
Kreado delicious_1.zip ... Aldonante dosierojn en C: \ bongusta ... Aldonante dosierojn en C: \ bongustega \ katoj ... Aldonante dosierojn en C: \ bongustega \ waffles ... Aldonante dosierojn en C: \ bongustega \ juglando ... Aldonante dosierojn en C: \ bongustega \ juglando \ waffles ... Farita.
Duafoje vin ruli ĝin, ĝi metos tutan dosierojn en C: \ bongustega en ZIP-dosiero nomita delicious_2.zip , kaj tiel plu.
Ideoj por Similaj Programoj
Vi povas piediri dosieruja arbo kaj aldoni dosierojn al kunpremita Poŝtkodo arkivojn en pluraj aliaj programoj. Ekzemple, vi povas skribi programojn kiuj faras la sekvajn:
- Marŝi dosieruja arbo kaj arkivo nur dosierojn kun iuj etendoj, kiel .txt aŭ .py , kaj nenio alia
- Marŝi dosieruja arbo kaj arkivo ĉiun dosieron krom la .txt kaj .py tiuj
- Trovi la dosierujon en dosierujo arbo kiu havas la plej grandan nombron de dosieroj aŭ la dosierujo kiu uzas la plej diskospaco
resumo
Eĉ se vi estas sperta komputiluzanto, vi probable manipuli dosierojn permane kun la muso kaj klavaro. Moderna dosiero esploristoj faciligi labori kun kelkaj dosieroj. Sed foje vi devas plenumi taskon kiu portus horojn uzante via komputilo dosiero esploristo.
La
os
kaj shutil
moduloj proponas funkciojn por kopiado, movado, renomante, kaj viŝante dosierojn. Kiam viŝante dosieroj, vi eble volas uzi la send2trash
modulon por transigi dosierojn recicla bin aŭ rubo prefere ol konstante forigi ilin. Kaj
kiam skribi programojn kiuj manipuli dosierojn, ĝi estas bona ideo
komenti la kodo kiu faras la fakta kopio / movado / renomi / forviŝi kaj
aldoni print()
alvoko anstataŭ tiel vi povas kuri la programon kaj kontroli ĝuste kion ĝi faros.
Ofte
vi bezonos plenumi tiujn operaciojn ne nur sur dosieroj en unu
dosierujo sed ankaŭ pri ĉiu leterujo en tiu leterujo, ĉiu leterujo en
tiuj dosierujoj, kaj tiel plu. La
os.walk()
funkcio
manipulas tiun piedvojaĝon trans la dosierujoj por vi tiel ke vi povas
koncentri sur kio via programo bezonas fari kun la dosierojn en ili.
La
zipfile
modulo donas manieron de kunpremante kaj ĉerpi dosierojn .zip arkivoj tra Python. Kombinita kun la dosiero-uzado funkciojn de os
kaj shutil
, zipfile
faciligas paki supren plurajn dosierojn el ie sur via malfacila stirado. Tiuj .zip dosieroj estas multe pli facile alŝuti al retejoj aŭ sendu kiel retpoŝto kunaj ol multaj apartaj dosieroj.
Antaŭa ĉapitrojn provizis fontkodon por vi kopii. Sed kiam vi skribas viajn proprajn programojn, ili probable ne eliru perfekte la unuan fojon. La
sekva ĉapitro temigas iuj Python moduloj kiuj helpos vin analizi kaj
elpurigi viaj programoj por ke vi povas rapide akiri ilin laboranta
ĝuste.
praktiko Demandoj
Q:
|
1. Kio estas la diferenco inter
shutil.copy() kaj shutil.copytree() ? |
Q:
|
2. Kio funkcio estas uzata por renomi dosierojn?
|
Q:
|
3. Kio estas la diferenco inter la delete funkcioj en
send2trash kaj shutil moduloj? |
Q:
|
4.
ZipFile objektoj havas close() metodo samkiel File objektoj ' close() metodon. Kio ZipFile maniero estas ekvivalento al File objektoj ' open() metodon? |
praktiko Projektoj
Por praktiko, skribi programojn por fari la sekvajn taskojn.
selectivo Kopiu
Skribi programon kiu iras tra dosierujo arbo kaj serĉoj por dosieroj kun certa dosiersufikso (kiel .pdf aŭ Jpg ). Kopii tiujn dosierojn de ajna loko ili estas en nova dosierujo.
Viŝante unneeded dosieroj
Ĝi
estas malofta por kelkaj unneeded sed humongous dosierojn aŭ
dosierujojn preni supren la plejparto de la spaco en via malmola disko. Se
vi provas liberigi ĉambron en via komputilo, vi ricevos la plej pafbruo
por via dolaro viŝante la plej amasa de la nedeziratajn dosierojn. Sed unue vi devas trovi ilin.
Skribi
programon kiu iras tra dosierujo arbo kaj serĉoj por escepte grandaj
dosieroj aŭ dosierujoj-diru, kiuj havas dosieron grandeco de pli ol
100MB. (Memoru, por akiri dosiero grandeco, vi povas uzi
os.path.getsize()
de la os
modulo.) Print tiujn dosierojn kun ilia absoluta pado al la ekrano.Plenigante en la breĉoj
Skribi programon kiu trovas ĉiujn dosierojn kun donita prefikso, kiel spam001.txt , spam002.txt , kaj tiel plu, en sola dosierujo kaj lokalizas ajna breĉoj en la numerado (kiel se estas spam001.txt kaj spam003. txt sed neniu spam002.txt ). Havi la programon renomi ĉiuj postaj dosierojn fermi tiun interspacon.
Kiel aldonis defio, skribu alian programon kiu povas enmeti breĉoj en
numeritajn dosierojn tiel ke nova dosiero povas esti adiciita.
Nenhum comentário:
Postar um comentário