zeile - python datei öffnen mit pfad




Suchen Sie alle Dateien in einem Verzeichnis mit der Erweiterung.txt in Python (20)

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)

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


Dieser Code macht mein Leben einfacher.

import os
fnames = ([file for root, dirs, files in os.walk(dir)
    for file in files
    if file.endswith('.txt') #or file.endswith('.png') or file.endswith('.pdf')
    ])
for fname in fnames: print(fname)

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

Hier ist einer mit extend()

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

Ich empfehle Ihnen, https://docs.python.org/2/library/fnmatch.html und die obere Methode zu verwenden. Auf diese Weise können Sie Folgendes finden:

  1. Name. txt ;
  2. Name. TXT ;
  3. Name. Txt

.

import fnmatch
import os

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

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

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

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

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

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 .


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

Um alle '.txt' Dateinamen innerhalb des 'dataPath'-Ordners als eine Liste in einer pythonischen Weise zu erhalten

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

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)

Verwenden Sie glob .

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


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

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

import glob
import os

path=os.getcwd()

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

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

import os

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

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

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 '





file-io