Vraag Hoe maak ik een lijst van alle bestanden van een map?


Hoe kan ik alle bestanden van een map in Python opsommen en ze toevoegen aan een list?


2812
2017-07-08 19:31


oorsprong


antwoorden:


os.listdir() krijgt u alles wat in een directory staat - bestanden en mappen.

Als je wil net bestanden, kunt u dit filteren met behulp van os.path:

from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

of je zou kunnen gebruiken os.walk() die twee lijsten oplevert voor elke map die het bezoekt - opsplitsen in bestanden en mappen voor jou. Als u alleen de bovenste map wilt, kunt u de eerste keer dat deze wordt weergegeven, gewoon doorbreken

from os import walk

f = []
for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

En als laatste, zoals in dit voorbeeld wordt getoond, kunt u een lijst aan een andere toevoegen die u kunt gebruiken .extend() of

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

Persoonlijk heb ik liever .extend()


2813
2017-07-08 21:01



Ik gebruik liever de glob module, aangezien het patroonafstemming en uitbreiding.

import glob
print(glob.glob("/home/adam/*.txt"))

Het zal een lijst met de opgevraagde bestanden retourneren:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]

1138
2017-07-09 18:13



import os
os.listdir("somedirectory")

zal een lijst van alle bestanden en mappen terugsturen in "een of andere directory".


518
2017-07-08 19:35



Download een lijst met bestanden met Python 2 en 3


Ik heb hier ook een korte video gemaakt:  Python: hoe een lijst met bestanden in een map te krijgen


os.listdir ()

of ..... heet om alle bestanden (en mappen) in de huidige map (Python 3) te krijgen

De eenvoudigste manier om het bestand in de huidige map in Python 3 te hebben, is dit. Het is heel eenvoudig; gebruik de os module en de functie listdir () en u zult het bestand in die map hebben (en eventuele mappen die in de map staan, maar u zult het bestand niet in de submap hebben, daarvoor kunt u lopen gebruiken - ik zal erover praten later).

>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Gebruik van glob

Ik vond het eenvoudiger om een ​​bestand van hetzelfde type of met iets gemeenschappelijk te selecteren. Bekijk het volgende voorbeeld:

import glob

txtfiles = []
for file in glob.glob("*.txt"):
    txtfiles.append(file)

Gebruik van lijstbegrip

import glob

mylist = [f for f in glob.glob("*.txt")]

De volledige padnaam ophalen met os.path.abspath

Zoals je hebt gemerkt, heb je niet het volledige pad van het bestand in de bovenstaande code. Als u het absolute pad moet hebben, kunt u een andere functie van de gebruiken os.path module genoemd _getfullpathname, het bestand neerzetten waar je vandaan komt os.listdir() als een argument. Er zijn andere manieren om het volledige pad te hebben, zoals we later zullen controleren (ik heb vervangen, zoals voorgesteld door mexmex, _getfullpathname met abspath).

>>> import os
>>> files_path = [os.path.abspath(x) for x in os.listdir()]
>>> files_path
['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

Haal de volledige padnaam van een bestandstype in alle submappen met lopen

Ik vind dit erg handig om dingen in veel mappen te vinden en het heeft me geholpen een bestand te vinden waarvan ik de naam niet heb onthouden:

import os

# Getting the current work directory (cwd)
thisdir = os.getcwd()

# r=root, d=directories, f = files
for r, d, f in os.walk(thisdir):
    for file in f:
        if ".docx" in file:
            print(os.path.join(r, file))

os.listdir (): haal bestanden op in de huidige map (Python 2)

In Python 2 moet je, als je de lijst met bestanden in de huidige map wilt, het argument geven als '.' of os.getcwd () in de methode os.listdir.

>>> import os
>>> arr = os.listdir('.')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Om omhoog te gaan in de mappenboom

>>> # Method 1
>>> x = os.listdir('..')

# Method 2
>>> x= os.listdir('/')

Download bestanden: os.listdir () in een bepaalde map (Python 2 en 3)

>>> import os
>>> arr = os.listdir('F:\\python')
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

Download bestanden van een bepaalde submap met os.listdir ()

import os

x = os.listdir("./content")

os.walk ('.') - huidige map

>>> import os
>>> arr = next(os.walk('.'))[2]
>>> arr
['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

glob module - alle bestanden

import glob
print(glob.glob("*"))

out:['content', 'start.py']

next (os.walk ('.')) en os.path.join ('dir', 'file')

>>> import os
>>> arr = []
>>> for d,r,f in next(os.walk("F:\_python)):
>>>     for file in f:
>>>         arr.append(os.path.join(r,file))
...
>>> for f in arr:
>>>     print(files)

>output

F:\\_python\\dict_class.py
F:\\_python\\programmi.txt

next (os.walk ('F: \') - krijg het volledige pad - begrijp de lijst

>>> [os.path.join(r,file) for r,d,f in next(os.walk("F:\\_python")) for file in f]
['F:\\_python\\dict_class.py', 'F:\\_python\\programmi.txt']

os.walk - krijg volledige pad - alle bestanden in sub mappen

x = [os.path.join(r,file) for r,d,f in os.walk("F:\\_python") for file in f]

>>>x
['F:\\_python\\dict.py', 'F:\\_python\\progr.txt', 'F:\\_python\\readl.py']

os.listdir () - ontvang alleen txt-bestanden

>>> arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
>>> print(arr_txt)
['work.txt', '3ebooks.txt']

glob - krijg alleen txt-bestanden

>>> import glob
>>> x = glob.glob("*.txt")
>>> x
['ale.txt', 'alunni2015.txt', 'assenze.text.txt', 'text2.txt', 'untitled.txt']

Glob gebruiken om het volledige pad van de bestanden te krijgen

Als ik het absolute pad van de bestanden nodig zou hebben:

>>> from path import path
>>> from glob import glob
>>> x = [path(f).abspath() for f in glob("F:\*.txt")]
>>> for f in x:
...  print(f)
...
F:\acquistionline.txt
F:\acquisti_2018.txt
F:\bootstrap_jquery_ecc.txt

Ander gebruik van glob

Als ik alle bestanden in de map wil:

>>> x = glob.glob("*")

Gebruik os.path.isfile om mappen in de lijst te vermijden

import os.path
listOfFiles = [f for f in os.listdir() if os.path.isfile(f)]
print(listOfFiles)

> output

['a simple game.py', 'data.txt', 'decorator.py']

Pathlib gebruiken van (Python 3.4)

import pathlib

>>> flist = []
>>> for p in pathlib.Path('.').iterdir():
...  if p.is_file():
...   print(p)
...   flist.append(p)
...
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speak_gui2.py
thumb.PNG

Als u lijstbegrip wilt gebruiken

>>> flist = [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Krijg alle en alleen bestanden met os.walk

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)

>>> y
['append_to_list.py', 'data.txt', 'data1.txt', 'data2.txt', 'data_180617', 'os_walk.py', 'READ2.py', 'read_data.py', 'somma_defaltdic.py', 'substitute_words.py', 'sum_data.py', 'data.txt', 'data1.txt', 'data_180617']

Krijg alleen bestanden met de volgende en loop in een map

>>> import os
>>> x = next(os.walk('F://python'))[2]
>>> x
['calculator.bat','calculator.py']

Krijg alleen mappen met de volgende en loop in een map

>>> import os
>>> next(os.walk('F://python'))[1] # for the current dir use ('.')
['python3','others']

Krijg alle subdir-namen met lopen

>>> for r,d,f in os.walk("F:\_python"):
...  for dirs in d:
...   print(dirs)
...
.vscode
pyexcel
pyschool.py
subtitles
_metaprogramming
.ipynb_checkpoints

os.scandir () vanaf Python 3.5 op

>>> import os
>>> x = [f.name for f in os.scandir() if f.is_file()]
>>> x
['calculator.bat','calculator.py']

# Another example with scandir (a little variation from docs.python.org)
# This one is more efficient than os.listdir.
# In this case, it shows the files only in the current directory
# where the script is executed.

>>> import os
>>> with os.scandir() as i:
...  for entry in i:
...   if entry.is_file():
...    print(entry.name)
...
ebookmaker.py
error.PNG
exemaker.bat
guiprova.mp3
setup.py
speakgui4.py
speak_gui2.py
speak_gui3.py
thumb.PNG
>>>

Ex. 1: Hoeveel bestanden zijn er in de submappen?

In dit voorbeeld zoeken we naar het aantal bestanden dat is opgenomen in de hele directory en de bijbehorende submappen.

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

> output

>'F:\\\python' : 12057 files'

Ex.2: Hoe kopieer ik alle bestanden van een map naar een andere?

Een script om op uw computer een bestelling te plaatsen en alle bestanden van een type te vinden (standaard: pptx) en deze in een nieuwe map te kopiëren.

import os
import shutil
from path import path

destination = "F:\\file_copied"
# os.makedirs(destination)

def copyfile(dir, filetype='pptx', counter=0):
    "Searches for pptx (or other - pptx is the default) files and copies them"
    for pack in os.walk(dir):
        for f in pack[2]:
            if f.endswith(filetype):
                fullpath = pack[0] + "\\" + f
                print(fullpath)
                shutil.copy(fullpath, destination)
                counter += 1
    if counter > 0:
        print("------------------------")
        print("\t==> Found in: `" + dir + "` : " + str(counter) + " files\n")

for dir in os.listdir():
    "searches for folders that starts with `_`"
    if dir[0] == '_':
        # copyfile(dir, filetype='pdf')
        copyfile(dir, filetype='txt')


> Output

_compiti18\Compito Contabilità 1\conti.txt
_compiti18\Compito Contabilità 1\modula4.txt
_compiti18\Compito Contabilità 1\moduloa4.txt
------------------------
==> Found in: `_compiti18` : 3 files

Ex. 3: Hoe alle bestanden in een txt-bestand te krijgen

Als u een txt-bestand met alle bestandsnamen wilt maken:

import os
mylist = ""
with open("filelist.txt", "w", encoding="utf-8") as file:
    for eachfile in os.listdir():
        mylist += eachfile + "\n"
    file.write(mylist)

327
2018-01-03 15:36



Een oplossing met één regel om te krijgen enige lijst met bestanden (geen submappen):

filenames = next(os.walk(path))[2]

of absolute padnamen:

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]

144
2018-01-18 17:42



Volledige bestandspaden verkrijgen vanuit een map en alle bijbehorende submappen

import os

def get_filepaths(directory):
    """
    This function will generate the file names in a directory 
    tree by walking the tree either top-down or bottom-up. For each 
    directory in the tree rooted at directory top (including top itself), 
    it yields a 3-tuple (dirpath, dirnames, filenames).
    """
    file_paths = []  # List which will store all of the full filepaths.

    # Walk the tree.
    for root, directories, files in os.walk(directory):
        for filename in files:
            # Join the two strings in order to form the full filepath.
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)  # Add it to the list.

    return file_paths  # Self-explanatory.

# Run the above function and store its results in a variable.   
full_file_paths = get_filepaths("/Users/johnny/Desktop/TEST")

  • Het pad dat ik in de bovenstaande functie heb opgegeven, bevat 3 bestanden, waarvan er twee in de hoofdmap staan ​​en een andere in een submap met de naam 'SUBMAP.' U kunt nu dingen doen als:
  • print full_file_paths die de lijst zal afdrukken:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

Als je wilt, kun je de inhoud openen en lezen, of je alleen richten op bestanden met de extensie ".dat" zoals in de onderstaande code:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat


110
2017-10-11 00:55



Sinds versie 3.4 zijn er ingebouwde iterators hiervoor zijn die veel efficiënter dan os.listdir():

pathlib: Nieuw in versie 3.4.

>>> import pathlib
>>> [p for p in pathlib.Path('.').iterdir() if p.is_file()]

Volgens PEP 428, het doel van de pathlib library is om een ​​eenvoudige hiërarchie van klassen te bieden voor het afhandelen van bestandssysteempaden en de algemene bewerkingen die gebruikers daarover doen.

os.scandir(): Nieuw in versie 3.5.

>>> import os
>>> [entry for entry in os.scandir('.') if entry.is_file()]

Let daar op os.walk() toepassingen os.scandir() in plaats van os.listdir() vanaf versie 3.5 en de snelheid is volgens 2-20 keer verhoogd met PEP 471.

Ik raad u ook aan onderstaande opmerking van ShadowRanger te lezen.


57
2018-06-18 20:58