Zoek alle bestanden in een map met extensie. TXT in Python

Hoe kan ik alle bestanden vinden in een map met de extensie .txtin Python?


Antwoord 1, Autoriteit 100%

U kunt glob:

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

of gewoon os.listdir:

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

of als u directory wilt traven, gebruikt u 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))

Antwoord 2, Autoriteit 11%

Gebruik glob .

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

Antwoord 3, Autoriteit 7%

Zoiets mogen het werk doen

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

Antwoord 4, Autoriteit 5%

Zoiets zal werken:

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

Antwoord 5, autoriteit 3%

U kunt eenvoudig pathlibs glob1:

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

of in een lus:

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

Als je het recursief wilt, kun je .glob('**/*.txt)

gebruiken


1De module pathlibwas opgenomen in de standaardbibliotheek in python 3.4. Maar je kunt back-ports van die module zelfs op oudere Python-versies installeren (dwz met behulp van condaof pip): pathliben pathlib2.


Antwoord 6, autoriteit 2%

import os
path = 'mypath/path' 
files = os.listdir(path)
files_txt = [i for i in files if i.endswith('.txt')]

Antwoord 7

Ik hou van os.walk():

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

Of met generatoren:

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

Antwoord 8

Hier zijn meer versies van hetzelfde die iets andere resultaten opleveren:

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

Antwoord 9

Python v3.5+

Snelle methode met os.scandir in een recursieve functie. Zoekt naar alle bestanden met een opgegeven extensie in map en submappen. Het is snel, zelfs voor het vinden van 10.000 bestanden.

Ik heb ook een functie toegevoegd om de uitvoer naar een Pandas-dataframe te converteren.

import os
import re
import pandas as pd
import numpy as np
def findFilesInFolderYield(path,  extension, containsTxt='', subFolders = True, excludeText = ''):
    """  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
    extension:          File extension to find.  e.g. 'txt'.  Regular expression. Or  'ls\d' to match ls1, ls2, ls3 etc
    containsTxt:        List of Strings, only finds file if it contains this text.  Ignore if '' (or blank)
    subFolders:         Bool.  If True, find files in all subfolders under path. If False, only searches files in the specified folder
    excludeText:        Text string.  Ignore if ''. Will exclude if text string is in path.
    """
    if type(containsTxt) == str: # if a string and not in a list
        containsTxt = [containsTxt]
    myregexobj = re.compile('\.' + extension + '$')    # Makes sure the file extension is at the end and is preceded by a .
    try:   # Trapping a OSError or FileNotFoundError:  File permissions problem I believe
        for entry in os.scandir(path):
            if entry.is_file() and myregexobj.search(entry.path): # 
                bools = [True for txt in containsTxt if txt in entry.path and (excludeText == '' or excludeText not in entry.path)]
                if len(bools)== len(containsTxt):
                    yield entry.stat().st_size, entry.stat().st_atime_ns, entry.stat().st_mtime_ns, entry.stat().st_ctime_ns, entry.path
            elif entry.is_dir() and subFolders:   # if its a directory, then repeat process as a nested function
                yield from findFilesInFolderYield(entry.path,  extension, containsTxt, subFolders)
    except OSError as ose:
        print('Cannot access ' + path +'. Probably a permissions error ', ose)
    except FileNotFoundError as fnf:
        print(path +' not found ', fnf)
def findFilesInFolderYieldandGetDf(path,  extension, containsTxt, subFolders = True, excludeText = ''):
    """  Converts returned data from findFilesInFolderYield and creates and Pandas Dataframe.
    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
    extension:          File extension to find.  e.g. 'txt'.  Regular expression. Or  'ls\d' to match ls1, ls2, ls3 etc
    containsTxt:        List of Strings, only finds file if it contains this text.  Ignore if '' (or blank)
    subFolders:         Bool.  If True, find files in all subfolders under path. If False, only searches files in the specified folder
    excludeText:        Text string.  Ignore if ''. Will exclude if text string is in path.
    """
    fileSizes, accessTimes, modificationTimes, creationTimes , paths  = zip(*findFilesInFolderYield(path,  extension, containsTxt, subFolders))
    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':paths,
                  })
    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)
    return df
ext =   'txt'  # regular expression 
containsTxt=[]
path = 'C:\myFolder'
df = findFilesInFolderYieldandGetDf(path,  ext, containsTxt, subFolders = True)

Antwoord 10

path.py is een ander alternatief: 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

Antwoord 11

Probeer dit om al uw bestanden recursief te vinden:

import glob, os
os.chdir("H:\\wallpaper")# use whatever directory you want
#double\\ no single \
for file in glob.glob("**/*.txt", recursive = True):
    print(file)

Antwoord 12

Om alle ‘.txt’-bestandsnamen in de map ‘dataPath’ als een lijst op een Pythonische manier te krijgen:

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

Antwoord 13

Python heeft alle tools om dit te doen:

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

Antwoord 14

Ik heb een test gedaan (Python 3.6.4, W7x64) om te zien welke oplossing het snelst is voor één map, geen submappen, om een lijst met volledige bestandspaden te krijgen voor bestanden met een specifieke extensie.

Om het kort te houden, voor deze taak is os.listdir()de snelste en 1,7x zo snel als de volgende: os.walk()( met een pauze!), 2,7x zo snel als pathlib, 3,2x sneller dan os.scandir()en 3,3x sneller dan glob.
Houd er rekening mee dat deze resultaten zullen veranderen wanneer u recursieve resultaten nodig heeft. Als u één methode hieronder kopieert/plakt, voeg dan een .lower() toe, anders wordt .EXT niet gevonden bij het zoeken naar .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))

Resultaten:

# Python 3.6.4
0.431
0.515
0.161
0.548
0.537
0.274

Antwoord 15

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

Antwoord 16

Deze code maakt mijn leven eenvoudiger.

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)

Antwoord 17

Om een reeks “.txt”-bestandsnamen te krijgen uit een map met de naam “data” in dezelfde map, gebruik ik meestal deze eenvoudige regel code:

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

Antwoord 18

Gebruik fnmatch: https://docs.python.org/2/library/fnmatch .html

import fnmatch
import os
for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print file

Antwoord 19

Ik raad je aan om fnmatchen de bovenste methode te gebruiken. Op deze manier kunt u het volgende vinden:

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

.

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

Antwoord 20

Hier is er een met extend()

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

Antwoord 21

Een kopieer-pasbare oplossing vergelijkbaar met die van 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

Je kunt ook yieldgebruiken om een generator te maken en zo te voorkomen dat je de volledige lijst samenstelt:

def get_all_filepaths(root_path, ext):
    import os
    for root, dirs, files in os.walk(root_path):
        for filename in files:
            if filename.lower().endswith(ext):
                yield os.path.join(root, filename)

Antwoord 22

Functionele oplossing met submappen:

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

Antwoord 23

Als de map veel bestanden bevat of geheugen een beperking is, overweeg dan het gebruik van generatoren:

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

Optie A: herhalen

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

Optie B: alles ophalen

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

Antwoord 24

gebruik de Python OS-module om bestanden met een specifieke extensie te vinden.

het eenvoudige voorbeeld staat hier:

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

Antwoord 25

Veel gebruikers hebben geantwoord met os.walkantwoorden, die alle bestanden bevatten, maar ook alle mappen en submappen en hun bestanden.

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)

of voor een eenmalige waar u geen generator nodig hebt:

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)

Als u wedstrijden voor iets anders wilt gebruiken, wilt u het misschien een lijst maken in plaats van een expressie van de generator:

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

Antwoord 26

Een eenvoudige methode met behulp van forlus:

import os
dir = ["e","x","e"]
p = os.listdir('E:')  #path
for n in range(len(p)):
   name = p[n]
   myfile = [name[-3],name[-2],name[-1]]  #for .txt
   if myfile == dir :
      print(name)
   else:
      print("nops")

Hoewel dit algemener kan worden gemaakt.

Other episodes