Mai mult
Găsi toate fișierele într-un director cu extensia .txt în Python
Cum pot găsi toate fișierele într-un director având extensia .txt
în python?
1043
26
Puteți utiliza
glob
:sau pur și simplu
os.listdir
:sau, dacă doriți pentru a traversa director, utilizați
os.de mers pe jos
:Folosi glob.
Ceva de genul asta ar trebui să facă treaba
Ceva de genul acesta va funcționa:
Îmi place os.de mers pe jos():
Sau cu generatoare:
Puteți folosi pur și simplu
pathlib
sglob
1:sau într-o buclă:
Dacă vrei recursive pot folosi.glob('*/.txt)`
1
pathlib
module a fost inclus în biblioteca standard python 3.4. Dar puteți instala spate-porturile modulului chiar mai vechi Python versiuni (de exemplu, folosindconda
saupip
):pathlib
șipathlib2
.Aici's mai multe versiuni ale aceleiași care produc rezultate ușor diferite:
glob.iglob()
glob.glob1()
fnmatch.filtru()
path.py este o altă alternativă: https://github.com/jaraco/path.py
Python are toate instrumentele pentru a face acest lucru:
Python v3.5+
Metodă rapidă folosind sistemul de operare.scandir într-o funcție recursivă. Caută toate fișierele cu o anumită extensie în foldere și sub-foldere.
Update Aprilie 2019
Dacă sunteți în căutarea peste directoarele care conțin 10.000 fișiere, adăugarea la o listă devine ineficient. 'Randament' rezultatele este o soluție mai bună. Am inclus, de asemenea, o funcție pentru a converti de ieșire la o Panda Dataframe.
``python import os import re import panda ca pd import numpy ca np
def findFilesInFolderYield(cale, extensie, containsTxt='', subfoldere = True, excludeText = ''): """ funcție Recursivă pentru a găsi toate fișierele de un tip de extensie într-un dosar (și, opțional, în toate subfolderele prea)
calea: directorul de Bază pentru a găsi fișiere extensie: extensia de Fișier pentru a găsi. de exemplu, 'txt'. Expresie regulată. Sau 'e\d' pentru a se potrivi ls1, ls2, ls3, etc containsTxt: Lista de Siruri de caractere, doar găsește dosarul, dacă acesta conține acest text. Ignore daca '' (sau gol) subfoldere: Bool. Dacă este Adevărat, găsi fișiere într tuturor subfolderelor de sub calea. Dacă este False, doar caută fișiere în folderul specificat excludeText: șir de Text. Ignore daca ''. Va exclude în cazul șir de text este în cale. """ dacă tipul(containsTxt) == str: # dacă un șir de caractere și nu într-o listă containsTxt = [containsTxt]
myregexobj = re.compila('.' + extensia + '$') # Face-vă că extensia fișierului este de la sfârșitul și este precedat de un .
încercați: # Prinzând-o OSError sau FileNotFoundError: permisiunile de Fișiere problema cred pentru intrarea în sistemul de operare.scandir(calea): dacă intrarea.is_file() și myregexobj.de căutare(de intrare.calea): #
bools = [Valabil pentru txt în containsTxt dacă txt la intrare.calea și (excludeText == '' sau excludeText nu la intrare.calea)]
dacă len(cărți)== len(containsTxt): randament de intrare.stat().st_size, de intrare.stat().st_atime_ns, de intrare.stat().st_mtime_ns, de intrare.stat().st_ctime_ns, de intrare.calea
elif intrare.is_dir() și subfoldere: # dacă un director, apoi repetați procesul ca o funcție imbricate randament de findFilesInFolderYield(de intrare.calea, extensie, containsTxt, subfoldere) cu excepția OSError ca ose: de imprimare('nu Pot accesa ' + calea +'. Probabil o eroare de permisiuni ', ose) cu excepția FileNotFoundError ca fnf: print(cale +' nu a fost găsit ', fnf)
def findFilesInFolderYieldandGetDf(cale, extensie, containsTxt, subfoldere = True, excludeText = ''): """ Convertește revenit date de findFilesInFolderYield și creează și Panda Dataframe. Funcție recursivă pentru a găsi toate fișierele de un tip de extensie într-un dosar (și, opțional, în toate subfolderele prea)
calea: directorul de Bază pentru a găsi fișiere extensie: extensia de Fișier pentru a găsi. de exemplu, 'txt'. Expresie regulată. Sau 'e\d' pentru a se potrivi ls1, ls2, ls3, etc containsTxt: Lista de Siruri de caractere, doar găsește dosarul, dacă acesta conține acest text. Ignore daca '' (sau gol) subfoldere: Bool. Dacă este Adevărat, găsi fișiere într tuturor subfolderelor de sub calea. Dacă este False, doar caută fișiere în folderul specificat excludeText: șir de Text. Ignore daca ''. Va exclude în cazul șir de text este în cale. """
fileSizes, accessTimes, modificationTimes, creationTimes , căi = zip(*findFilesInFolderYield(cale, extensie, containsTxt, subfoldere)) df = pd.DataFrame({ 'FLS_File_Size':fileSizes, 'FLS_File_Access_Date':accessTimes, 'FLS_File_Modification_Date':np.array(modificationTimes).astype('timedelta64[ns]'), 'FLS_File_Creation_Date':creationTimes, 'FLS_File_PathName':căi, })
df['FLS_File_Modification_Date'] = pd.to_datetime(df['FLS_File_Modification_Date'],infer_datetime_format=True) df['FLS_File_Creation_Date'] = pd.to_datetime(df['FLS_File_Creation_Date'],infer_datetime_format=True) df['FLS_File_Access_Date'] = pd.to_datetime(df['FLS_File_Access_Date'],infer_datetime_format=True)
reveni df
ext = 'txt' # expresie regulată containsTxt=[] calea = 'C:\myFolder' df = findFilesInFolderYieldandGetDf(cale, ext, containsTxt, subfoldere = True) ``
Pentru a obține toate '.txt' nume de fișiere în interiorul 'dataPath' dosar ca o listă într-un mod Pythonic
Am facut un test (Python 3.6.4, W7x64) pentru a vedea ce soluție este mai rapidă pentru un singur dosar, nu subdirectoare, pentru a obține o listă completă căi de fișier pentru fișierele cu o anumită extensie.
Pe scurt, pentru această sarcină
os.listdir()
este cel mai rapid și este de 1,7 x la fel de rapid ca cel mai bun următor:os.de mers pe jos()
(cu o pauza!), 2.7 x la fel de repede capathlib
, 3.2 x mai rapid decâtos.scandir()
și 3.3 x mai rapid decâtglob
. Vă rugăm să păstrați în minte, că aceste rezultate se va schimba atunci când aveți nevoie recursiv rezultate. Daca dai copy/paste o metodă mai jos, vă rugăm să adăugați o .mai mici (de) altfel .EXT nu s-ar fi găsit atunci când căutați pentru .ext.Rezultate:
Încercați acest acest lucru va găsi toate fișierele recursiv:
Utilizarea fnmatch: https://docs.python.org/2/library/fnmatch.html
Acest cod face viața mai simplă.
Pentru a obține o serie de ".txt" nume de fișiere dintr-un folder numit "de date" în același director de obicei folosesc această simplă linie de cod:
Îți sugerez să utilizați fnmatch și partea superioară a metodei. În acest fel puteți găsi oricare dintre următoarele:
.
Soluție funcțională cu sub-directoare: