file-io öffnen - Suchen Sie alle Dateien in einem Verzeichnis mit der Erweiterung.txt in Python




zeile anzahl (25)

Wie finde ich alle Dateien in einem Verzeichnis mit der Erweiterung .txt in Python?


Answers

Sie können glob :

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

oder einfach os.listdir :

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

oder wenn Sie ein Verzeichnis os.walk möchten, verwenden Sie 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))

Ich mag 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

Oder mit Generatoren:

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

Um ein Array von ".txt" -Dateinamen aus einem Ordner namens "data" im selben Verzeichnis zu erhalten, verwende ich normalerweise diese einfache Codezeile:

import os
fileNames = [fileName for fileName in os.listdir("data") if fileName.endswith(".txt")]

Funktionslösung mit Unterverzeichnissen:

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"))))

import os
import sys 

if len(sys.argv)==2:
    print('no params')
    sys.exit(1)

dir = sys.argv[1]
mask= sys.argv[2]

files = os.listdir(dir); 

res = filter(lambda x: x.endswith(mask), files); 

print res

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

Für mich. Es ist klassisch.


Python hat alle Werkzeuge, um dies zu tun:

import os

the_dir = 'the_dir_that_want_to_search_in'
all_txt_files = filter(lambda x: x.endswith('.txt'), os.listdir(the_dir))


Ich habe einen Test (Python 3.6.4, W7x64) durchgeführt, um zu sehen, welche Lösung die schnellste für einen Ordner ist, keine Unterverzeichnisse, um eine Liste vollständiger Dateipfade für Dateien mit einer bestimmten Erweiterung zu erhalten.

Um es kurz zu machen, für diese Aufgabe ist os.listdir() die schnellste und 1.7x so schnell wie die nächstbeste: os.walk() (mit einer Pause!), 2.7x so schnell wie pathlib , 3.2x schneller als os.scandir() und 3.3x schneller als glob .
Bitte beachten Sie, dass sich diese Ergebnisse ändern, wenn Sie rekursive Ergebnisse benötigen. Wenn Sie eine der folgenden Methoden kopieren oder einfügen, fügen Sie bitte eine .lower () hinzu, sonst wird .EXT nicht gefunden, wenn nach .ext gesucht wird.

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))

Ergebnisse:

# Python 3.6.4
0.431
0.515
0.161
0.548
0.537
0.274

Hier ist einer mit extend()

types = ('*.jpg', '*.png')
images_list = []
for files in types:
    images_list.extend(glob.glob(os.path.join(path, files)))

Hier sind weitere Versionen derselben, die leicht unterschiedliche Ergebnisse liefern:

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

path.py ist eine weitere Alternative: 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

Sie können diesen Code ausprobieren

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')]

import os

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

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

Python v3.5 +

Schnelle Methode, die os.scandir in einer rekursiven Funktion verwendet. Sucht nach allen Dateien mit einer angegebenen Erweiterung in Ordner und Unterordnern.

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)

Versuchen Sie dies, das wird alle Ihre Datei in Ordner oder Ordner finden

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)

So etwas wird funktionieren:

>>> 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']

Eine Kopie-Pastable-Lösung ähnlich der von 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

Viele Benutzer haben mit os.walk Antworten geantwortet, die alle Dateien, aber auch alle Verzeichnisse und Unterverzeichnisse und deren Dateien enthalten.

import os


def files_in_dir(path, extension=''):
    """
       Generator: yields all of the files in <path> ending with
       <extension>

       \param   path       Absolute or relative path to inspect,
       \param   extension  [optional] Only yield files matching this,

       \yield              [filenames]
    """


    for _, dirs, files in os.walk(path):
        dirs[:] = []  # do not recurse directories.
        yield from [f for f in files if f.endswith(extension)]

# Example: print all the .py files in './python'
for filename in files_in_dir('./python', '*.py'):
    print("-", filename)

Oder für eine einmalige, wo Sie keinen Generator brauchen:

path, ext = "./python", ext = ".py"
for _, _, dirfiles in os.walk(path):
    matches = (f for f in dirfiles if f.endswith(ext))
    break

for filename in matches:
    print("-", filename)

Wenn Sie Übereinstimmungen für etwas anderes verwenden möchten, möchten Sie vielleicht eher eine Liste als einen Generatorausdruck erstellen:

    matches = [f for f in dirfiles if f.endswith(ext)]

import os
[x for x in os.listdir() if x.endswith(".txt")]

Wie viele Dateien in Dir und Subdirs?

Wenn Sie wissen möchten, wie viele Dateien in einem Verzeichnis und Unterverzeichnissen vorhanden sind:

In diesem Beispiel suchen wir nach der Anzahl der Dateien, die in dem gesamten Verzeichnis und seinen Unterverzeichnissen enthalten sind.

import os    

def count(dir, counter=0):
    "returns number of files in dir and subdirs"
    for pack in os.walk(dir):
        for f in pack[2]:
            counter += 1
    return dir + " : " + str(counter) + "files"


print(count("F:\\python"))

Ausgabe

'F: \ python': 12057 Dateien '


Sie können einfach pathlib s glob 1 verwenden :

import pathlib

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

oder in einer Schleife:

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

Wenn Sie es rekursiv wollen, können Sie .glob('**/*.txt)

1 Das pathlib Modul wurde in Python 3.4 in die Standardbibliothek aufgenommen. Aber Sie können Back-Ports dieses Moduls auch auf älteren Python-Versionen (dh mit conda oder pip ) pathlib : pathlib und pathlib2 .


Verwenden Sie glob .

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

import glob
import os

path=os.getcwd()

extensions=('*.py','*.cpp')

for i in extensions:
  for files in glob.glob(i):
     print files

Sie können diesen Code ausprobieren:

import glob
import os

os.chdir("D:\...\DirName")
filename_arr={}
i=0
for files in glob.glob("*.txt"):
    filename_arr[i] = files
    i= i+1

for key,value in filename_arr.items():
    print key , value

Es kann oft sehr praktisch sein, namedtuple zu verwenden. Zum Beispiel haben Sie ein Wörterbuch mit 'name' als Schlüssel und 'score' als Werte, und Sie möchten nach 'score' sortieren:

import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John':5, 'Alex':10, 'Richard': 7}

Sortierung mit der niedrigsten Punktzahl zuerst:

worst = sorted(Player(v,k) for (k,v) in d.items())

Zuerst mit der höchsten Punktzahl sortieren:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

Jetzt können Sie den Namen und die Punktzahl abrufen, sagen wir, der zweitbeste Spieler (Index = 1) ist sehr pythonisch wie folgt:

player = best[1]
player.name
    'Richard'
player.score
    7




python file-io