gestione - python leggere contenuto directory




Trova tutti i file in una directory con estensione.txt in Python (20)

Come posso trovare tutti i file in una directory con estensione .txt in python?


Python v3.5 +

Metodo veloce che utilizza os.scandir in una funzione ricorsiva. Cerca tutti i file con un'estensione specificata nella cartella e nelle sottocartelle.

import os

def findFilesInFolder(path, pathList, extension, subFolders = True):
    """  Recursive function to find all files of an extension type in a folder (and optionally in all subfolders too)

    path:        Base directory to find files
    pathList:    A list that stores all paths
    extension:   File extension to find
    subFolders:  Bool.  If True, find files in all subfolders under path. If False, only searches files in the specified folder
    """

    try:   # Trapping a OSError:  File permissions problem I believe
        for entry in os.scandir(path):
            if entry.is_file() and entry.path.endswith(extension):
                pathList.append(entry.path)
            elif entry.is_dir() and subFolders:   # if its a directory, then repeat process as a nested function
                pathList = findFilesInFolder(entry.path, pathList, extension, subFolders)
    except OSError:
        print('Cannot access ' + path +'. Probably a permissions error')

    return pathList

dir_name = r'J:\myDirectory'
extension = ".txt"

pathList = []
pathList = findFilesInFolder(dir_name, pathList, extension, True)

Ecco altre versioni della stessa che producono risultati leggermente diversi:

glob.iglob()

import glob
for f in glob.iglob("/mydir/*/*.txt"): # generator, search immediate subdirectories 
    print f

glob.glob1 ()

print glob.glob1("/mydir", "*.tx?")  # literal_directory, basename_pattern

fnmatch.filter()

import fnmatch, os
print fnmatch.filter(os.listdir("/mydir"), "*.tx?") # include dot-files

Ho fatto un test (Python 3.6.4, W7x64) per vedere quale soluzione è la più veloce per una cartella, nessuna sottodirectory, per ottenere un elenco di percorsi di file completi per i file con un'estensione specifica.

Per farla breve, per questa operazione os.listdir() è la più veloce ed è 1,7 volte più veloce della successiva: os.walk() (con un'interruzione!), 2,7 volte più veloce di pathlib , pathlib più veloce di os.scandir() e 3.3x più veloce di glob .
Tieni presente che tali risultati cambieranno quando avrai bisogno di risultati ricorsivi. Se copia / incolla un metodo qui sotto, per favore aggiungi un .lower () altrimenti. EXT non verrebbe trovato durante la ricerca di .ext.

import os
import pathlib
import timeit
import glob

def a():
    path = pathlib.Path().cwd()
    list_sqlite_files = [str(f) for f in path.glob("*.sqlite")]

def b(): 
    path = os.getcwd()
    list_sqlite_files = [f.path for f in os.scandir(path) if os.path.splitext(f)[1] == ".sqlite"]

def c():
    path = os.getcwd()
    list_sqlite_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith(".sqlite")]

def d():
    path = os.getcwd()
    os.chdir(path)
    list_sqlite_files = [os.path.join(path, f) for f in glob.glob("*.sqlite")]

def e():
    path = os.getcwd()
    list_sqlite_files = [os.path.join(path, f) for f in glob.glob1(str(path), "*.sqlite")]

def f():
    path = os.getcwd()
    list_sqlite_files = []
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(".sqlite"):
                list_sqlite_files.append( os.path.join(root, file) )
        break



print(timeit.timeit(a, number=1000))
print(timeit.timeit(b, number=1000))
print(timeit.timeit(c, number=1000))
print(timeit.timeit(d, number=1000))
print(timeit.timeit(e, number=1000))
print(timeit.timeit(f, number=1000))

risultati:

# Python 3.6.4
0.431
0.515
0.161
0.548
0.537
0.274

Mi piace os.walk() :

import os, os.path

for root, dirs, files in os.walk(dir):
    for f in files:
        fullpath = os.path.join(root, f)
        if os.path.splitext(fullpath)[1] == '.txt':
            print fullpath

O con i generatori:

import os, os.path

fileiter = (os.path.join(root, f)
    for root, _, files in os.walk(dir)
    for f in files)
txtfileiter = (f for f in fileiter if os.path.splitext(f)[1] == '.txt')
for txt in txtfileiter:
    print txt

Nel caso in cui la cartella contenga molti file o la memoria sia un vincolo, prendi in considerazione l'utilizzo di generatori:

def yield_files_with_extensions(folder_path, file_extension):
   for _, _, files in os.walk(folder_path):
       for file in files:
           if file.endswith(file_extension):
               yield file

Opzione A: Iterate

for f in yield_files_with_extensions('.', '.txt'): 
    print(f)

Opzione B: ricevi tutto

files = [f for f in yield_files_with_extensions('.', '.txt')]

Per ottenere tutti i nomi di file '.txt' all'interno della cartella 'dataPath' come elenco in modo Python

from os import listdir
from os.path import isfile, join
path = "/dataPath/"
onlyTxtFiles = [f for f in listdir(path) if isfile(join(path, f)) and  f.endswith(".txt")]
print onlyTxtFiles

Prova questo questo troverà tutti i tuoi file all'interno di cartella o cartella

import glob, os
os.chdir("H:\\wallpaper")# use whatever you directory 

#double\\ no single \

for file in glob.glob("**/*.psd", recursive = True):#your format
    print(file)

Puoi provare questo codice

import glob
import os
filenames_without_extension = [os.path.basename(c).split('.')[0:1][0] for c in glob.glob('your/files/dir/*.txt')]
filenames_with_extension = [os.path.basename(c) for c in glob.glob('your/files/dir/*.txt')]

Puoi semplicemente usare pathlib s glob 1 :

import pathlib

list(pathlib.Path('your_directory').glob('*.txt'))

o in un ciclo:

for txt_file in pathlib.Path('your_directory').glob('*.txt'):
    # do something with "txt_file"

Se vuoi ricorsivi puoi usare .glob('**/*.txt)

1 Il modulo pathlib è stato incluso nella libreria standard in python 3.4. Ma è possibile installare back-ports di quel modulo anche su versioni precedenti di Python (cioè usando conda o pip ): pathlib e pathlib2 .


Puoi usare glob :

import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
    print(file)

o semplicemente os.listdir :

import os
for file in os.listdir("/mydir"):
    if file.endswith(".txt"):
        print(os.path.join("/mydir", file))

o se vuoi attraversare la directory, usa os.walk :

import os
for root, dirs, files in os.walk("/mydir"):
    for file in files:
        if file.endswith(".txt"):
             print(os.path.join(root, file))

Qualcosa del genere dovrebbe fare il lavoro

for root, dirs, files in os.walk(directory):
    for file in files:
        if file.endswith('.txt'):
            print file

Qualcosa del genere funzionerà:

>>> import os
>>> path = '/usr/share/cups/charmaps'
>>> text_files = [f for f in os.listdir(path) if f.endswith('.txt')]
>>> text_files
['euc-cn.txt', 'euc-jp.txt', 'euc-kr.txt', 'euc-tw.txt', ... 'windows-950.txt']

Soluzione funzionale con sottodirectory:

from fnmatch import filter
from functools import partial
from itertools import chain
from os import path, walk

print(*chain(*(map(partial(path.join, root), filter(filenames, "*.txt")) for root, _, filenames in walk("mydir"))))

Ti suggerisco di usare https://docs.python.org/2/library/fnmatch.html e il metodo superiore. In questo modo puoi trovare uno dei seguenti:

  1. Nome. txt ;
  2. Nome. TXT ;
  3. Nome. Testo

.

import fnmatch
import os

    for file in os.listdir("/Users/Johnny/Desktop/MyTXTfolder"):
        if fnmatch.fnmatch(file.upper(), '*.TXT'):
            print(file)

Una soluzione copia-passibile simile a quella di ghostdog:

def get_all_filepaths(root_path, ext):
    """
    Search all files which have a given extension within root_path.

    This ignores the case of the extension and searches subdirectories, too.

    Parameters
    ----------
    root_path : str
    ext : str

    Returns
    -------
    list of str

    Examples
    --------
    >>> get_all_filepaths('/run', '.lock')
    ['/run/unattended-upgrades.lock',
     '/run/mlocate.daily.lock',
     '/run/xtables.lock',
     '/run/mysqld/mysqld.sock.lock',
     '/run/postgresql/.s.PGSQL.5432.lock',
     '/run/network/.ifstate.lock',
     '/run/lock/asound.state.lock']
    """
    import os
    all_files = []
    for root, dirs, files in os.walk(root_path):
        for filename in files:
            if filename.lower().endswith(ext):
                all_files.append(os.path.join(root, filename))
    return all_files

Usa glob .

>>> import glob
>>> glob.glob('./*.txt')
['./outline.txt', './pip-log.txt', './test.txt', './testingvim.txt']

path.py è un'altra alternativa: https://github.com/jaraco/path.py

from path import path
p = path('/path/to/the/directory')
for f in p.files(pattern='*.txt'):
    print f

utilizzare il modulo OS Python per trovare file con estensione specifica.

il semplice esempio è qui:

import os

# This is the path where you want to search
path = r'd:'  

# this is extension you want to detect
extension = '.txt'   # this can be : .jpg  .png  .xls  .log .....

for root, dirs_list, files_list in os.walk(path):
    for file_name in files_list:
        if os.path.splitext(file_name)[-1] == extension:
            file_name_path = os.path.join(root, file_name)
            print file_name
            print file_name_path   # This is the full path of the filter file

import glob,os

data_dir = 'data_folder/'
file_dir_extension = os.path.join(data_dir, '*.txt')

for file_name in glob.glob(file_dir_extension):
    if file_name.endswith('.txt'):
        print file_name

Per me. È classico


import os

path = 'mypath/path' 
files = os.listdir(path)

files_txt = [i for i in files if i.endswith('.txt')]




file-io