Pytanie Jak wyświetlić wszystkie pliki katalogu?


Jak mogę wyświetlić wszystkie pliki katalogu w Pythonie i dodać je do pliku list?


2825
2017-07-08 19:31


pochodzenie


Związany z Jak uzyskać listę podkatalogów - rds
os.listdir(path) zwraca listę ciągów nazw plików i podkatalogów z podanej ścieżki lub aktualną, jeśli pominięto. (Umieszczanie tego tutaj dla osób z Google, ponieważ obecnie najlepsza odpowiedź nie odpowiada na pytanie.) - Apollys
Tylko wszystkie pliki? Czy chcesz wyświetlić listę podkatalogów? - Aleksandar Jovanovic
To działa ładnie (najlepsza odpowiedź poniżej): from os import listdir  from os.path import isfile, join  files = [f for f in listdir(mypath) if isfile(join(mypath, f))] Uwaga: musisz przypisać ciąg do ścieżki katalogu, w którym przechowywane są pliki (np. mypath = "users/name/desktop/"). - Arshin
Czy masz na myśli pliki jako: Zwykłe pliki, które nie są podkatalogami lub linkami, ani wszystkie pliki, w tym podkatalogi i linki? - Mulliganaceous


Odpowiedzi:


os.listdir() dostaniesz wszystko, co znajduje się w katalogu - pliki i katalogi.

Jeśli chcesz właśnie pliki, możesz je odfiltrować za pomocą os.path:

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

lub możesz użyć os.walk() co przyniesie dwie listy dla każdego katalogu, który odwiedza - dzieląc na pliki i katalogi dla ciebie. Jeśli potrzebujesz tylko głównego katalogu, możesz go po prostu zerwać po raz pierwszy

from os import walk

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

I na koniec, jak pokazuje ten przykład, dodając jedną listę do drugiej, możesz użyć .extend() lub

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

Osobiście wolę .extend()


2829
2017-07-08 21:01



Wygląda na to, że z jakiegoś powodu nie działa w systemie Windows z nazwami plików unicode. - cdiggins
Trochę prostsze: (_, _, filenames) = walk(mypath).next()  (jeśli masz pewność, że spacer zwróci co najmniej jedną wartość, którą powinien.) - misterbee
Drobna modyfikacja do przechowywania pełnych ścieżek: dla (dirpath, dirnames, nazwy plików) w os.walk (mypath): checksum_files.extend (os.path.join (dirpath, filename) dla nazwy pliku w nazwach plików) break - okigan
f.extend(filenames) w rzeczywistości nie jest odpowiednikiem f = f + filenames. extend zmodyfikuje f w miejscu, podczas gdy dodawanie tworzy nową listę w nowej lokalizacji pamięci. To znaczy extend jest na ogół bardziej wydajny niż +, ale czasami może prowadzić do nieporozumień, jeśli wiele obiektów zawiera odniesienia do listy. Wreszcie, warto to zauważyć f += filenames jest równa f.extend(filenames), nie  f = f + filenames. - Benjamin Hodgson♦
@misterbee, twoje rozwiązanie jest najlepsze, tylko jedno małe ulepszenie: _, _, filenames = next(walk(mypath), (None, None, [])) - bgusach


Wolę używać glob moduł, ponieważ dopasowuje wzór i rozszerza.

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

Zwróci listę z pytanymi plikami:

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

1143
2017-07-09 18:13



to jest skrót do listdir + fnmatch docs.python.org/library/fnmatch.html#fnmatch.fnmatch - Stefano
Dla mnie nie przyczynia się to do niespójności, którą ją karmię. Prawidłowe ukośniki na wejściu skutkują poprawnymi ukośnikami na wyjściu. - Antony Hatchkins
Myślę, że to powinna być akceptowana odpowiedź, ponieważ jest to najprostsza implementacja. - isosceleswheel
Pamiętaj, że to zwraca pełną ścieżkę. - xji
wyjaśnić, to robi nie zwróć "pełną ścieżkę"; po prostu zwraca ekspansję globu, czymkolwiek on jest. Np. Podany /home/user/foo/bar/hello.txt, a następnie, jeśli działa w katalogu foo, glob("bar/*.txt") wróci bar/hello.txt. Zdarzają się przypadki, kiedy faktycznie chcesz pełnej (tj. Bezwzględnej) ścieżki; w tych przypadkach patrz stackoverflow.com/questions/51520/... - michael


import os
os.listdir("somedirectory")

zwróci listę wszystkich plików i katalogów w "somedirectory".


520
2017-07-08 19:35



Zwraca to względną ścieżkę plików w porównaniu z pełną ścieżką zwróconą przez glob.glob - xji
@JIXiang: os.listdir() zawsze wraca zwykłe nazwy plików (nie ścieżki względne). Co glob.glob() zwraca się przez format ścieżki wzorca wejściowego. - mklement0
os.listdir () -> Zawsze wyświetla katalog i plik wewnątrz podanej lokalizacji. Czy istnieje sposób na wylistowanie tylko plików katalogu nie? - RishuA


Uzyskaj listę plików w Pythonie 2 i 3


Zrobiłem także krótki film tutaj:  Python: jak uzyskać listę plików w katalogu


os.listdir ()

lub ..... hot, aby uzyskać wszystkie pliki (i katalogi) w bieżącym katalogu (Python 3)

Najprostszym sposobem na uzyskanie pliku w bieżącym katalogu w Pythonie 3 jest to. To naprawdę proste; Użyj os moduł i funkcja listdir (), a będziesz miał plik w tym katalogu (i ewentualne foldery znajdujące się w katalogu, ale nie będziesz miał pliku w podkatalogu, do którego możesz użyć chodzić - porozmawiam o tym później).

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

Korzystanie z glob

Znalazłem glob łatwiejszy do wybrania pliku tego samego typu lub z czymś wspólnym. Spójrz na następujący przykład:

import glob

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

Używanie rozumienia list

import glob

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

Uzyskiwanie pełnej nazwy ścieżki za pomocą os.path.abspath

Jak zauważyłeś, nie masz pełnej ścieżki pliku w powyższym kodzie. Jeśli potrzebujesz bezwzględnej ścieżki, możesz użyć innej funkcji os.path moduł o nazwie _getfullpathname, umieszczając plik, z którego otrzymujesz os.listdir() jako argument. Istnieją inne sposoby na pełną ścieżkę, co sprawdzimy później (zastąpiłem, zgodnie z sugestią mexmex, _getfullpathname with abspath).

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

Uzyskaj pełną ścieżkę do typu pliku we wszystkich podkatalogach przy użyciu funkcji chodzenia

Uważam, że jest to bardzo przydatne do znajdowania rzeczy w wielu katalogach i pomogło mi znaleźć plik, o którym nie pamiętam nazwy:

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 (): pobiera pliki w bieżącym katalogu (Python 2)

W Pythonie 2, jeśli chcesz listę plików w bieżącym katalogu, musisz podać argument jako "." lub os.getcwd () w metodzie os.listdir.

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

Aby przejść do drzewa katalogów

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

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

Pobierz pliki: os.listdir () w określonym katalogu (Python 2 i 3)

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

Pobierz pliki określonego podkatalogu za pomocą os.listdir ()

import os

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

os.walk ('.') - aktualny katalog

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

moduł glob - wszystkie pliki

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

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

next (os.walk ('.')) i os.path.join ("dir", "plik")

>>> 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: \') - pobierz pełną ścieżkę - zrozumienie listy

>>> [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 - pobierz pełną ścieżkę - wszystkie pliki w podkatalogach

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 () - pobiera tylko pliki txt

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

glob - pobierz tylko pliki txt

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

Używanie globu do uzyskania pełnej ścieżki do plików

Jeśli potrzebuję bezwzględnej ścieżki plików:

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

Inne zastosowanie globu

Jeśli chcę wszystkie pliki w katalogu:

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

Użycie polecenia os.path.isfile w celu uniknięcia katalogów na liście

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

Używanie pathlib from (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

Jeśli chcesz korzystać ze sprawdzania list

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

Uzyskaj wszystkie i tylko pliki z 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']

Pobierz tylko pliki z następnym i przejdź do katalogu

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

Pobierz tylko katalogi i przejdź do katalogu

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

Pobierz wszystkie nazwy subdirów ze spacerem

>>> 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 () z Python 3.5 na

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

Dawny. 1: Ile plików znajduje się w podkatalogach?

W tym przykładzie szukamy liczby plików zawartych w całym katalogu i jego podkatalogach.

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'

Przykład 2: Jak skopiować wszystkie pliki z katalogu do innego?

Skrypt do uporządkowania w komputerze wszystkich plików typu (domyślnie: pptx) i skopiowania ich do nowego folderu.

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

Dawny. 3: Jak zdobyć wszystkie pliki w pliku txt

Jeśli chcesz utworzyć plik txt zawierający wszystkie nazwy plików:

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

333
2018-01-03 15:36



Powinieneś dołączyć argument ścieżki do listdir. - Alejandro Sazo
Zdecydowanie zachęca się do włączenia kontekstu / objaśnienia kodu, co sprawia, że ​​odpowiedź jest bardziej przydatna. - EJoshuaS
Zgadzam się, ale też czegoś nie zauważyłem, że python2 wymaga argumentu, podczas gdy python3 jest opcjonalny, jeśli poprawisz odpowiedź dla obu wersji Pythona byłoby wspaniale :) - Alejandro Sazo
Ok, poszedłem do Pythona 2 i znalazłem różnice, a ja zredagowałem post. - Giovanni Gianni
Nie ma powodu do robienia [f for f in os.listdir()]; os.listdir() już zwraca a list, więc po prostu niepotrzebnie kopiujemy oryginał list przed wyrzuceniem go. - ShadowRanger


Jedno-liniowe rozwiązanie do zdobycia tylko lista plików (bez podkatalogów):

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

lub bezwzględne nazwy ścieżek:

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

144
2018-01-18 17:42



Tylko jeden liniowiec, jeśli już import os. Wydaje się mniej zwięzły niż glob() Dla mnie. - ArtOfWarfare
problem z globem polega na tym, że folder zwany "something.something" zostanie zwrócony przez glob ('/ home / adam /*.*') - Remi
W systemie OS X jest coś, co nazywa się pakietem. Jest to katalog, który ogólnie powinien być traktowany jako plik (jak .tar). Czy chcesz, aby traktowano je jako plik lub katalog? Za pomocą glob() potraktuje to jako plik. Twoja metoda potraktuje to jako katalog. - ArtOfWarfare


Uzyskiwanie pełnych ścieżek plików z katalogu i wszystkich jego podkatalogów

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

  • Ścieżka podana w powyższej funkcji zawierała 3 pliki - dwa z nich w katalogu głównym, a drugi w podfolderze o nazwie "SUBFOLDER". Możesz teraz wykonywać następujące czynności:
  • print full_file_paths który wydrukuje listę:

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

Jeśli chcesz, możesz otworzyć i przeczytać zawartość lub skupić się tylko na plikach z rozszerzeniem ".dat", jak w poniższym kodzie:

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





Od wersji 3.4 są wbudowane iteratory do tego, które są o wiele bardziej wydajne niż os.listdir():

pathlib: Nowości w wersji 3.4.

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

Według PEP 428, celem pathlib Biblioteka ma zapewniać prostą hierarchię klas do obsługi ścieżek systemu plików i typowych operacji wykonywanych przez użytkowników.

os.scandir(): Nowość w wersji 3.5.

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

Zauważ, że os.walk() używa os.scandir() zamiast os.listdir() od wersji 3.5, a jego prędkość wzrosła o 2-20 razy zgodnie z PEP 471.

Pozwól mi również polecić przeczytanie komentarza ShadowRanger poniżej.


57
2018-06-18 20:58



Dzięki! Myślę, że to jedyne rozwiązanie, które nie zwraca bezpośrednio list. Można by użyć p.name zamiast pierwszego p alternatywnie, jeśli jest to preferowane. - JeromeJ
Witamy! Wolałbym generować pathlib.Path() instancje, ponieważ mają wiele użytecznych metod, których nie chciałbym marnować. Możesz również zadzwonić str(p) na nich dla nazw ścieżek. - SzieberthAdam
Zanotuj os.scandir rozwiązanie będzie bardziej wydajne niż os.listdir z os.path.is_file sprawdź lub coś w tym rodzaju, nawet jeśli potrzebujesz list (więc nie korzystasz z leniwej iteracji), ponieważ os.scandir używa interfejsów API dostarczonych przez system operacyjny, które udostępniają is_file informacje za darmo, jak iteruje, nie za obieg plików na dysk do dysku stat w ogóle (w systemie Windows, DirEntrys dokończę stat informacje za darmo, w systemach * NIX, których potrzebuje stat dla informacji poza is_file, is_diritp., ale DirEntry bufory na pierwszy stat dla wygody). - ShadowRanger
Stwierdziłem, że jest to najbardziej przydatne rozwiązanie (przy użyciu pathlib). Mogę łatwo uzyskać określone typy rozszerzeń i ścieżki bezwzględne. Dziękuję Ci! - HEADLESS_0NE
Możesz także użyć entry.name aby uzyskać tylko nazwę pliku, lub entry.path aby uzyskać pełną ścieżkę. Nigdy więcej os.path.join () w całym miejscu. - user136036


naprawdęlubiłem Odpowiedź Adamka, sugerując, że używasz glob(), z modułu o tej samej nazwie. Pozwala to na dopasowanie wzorców do *s.

Ale, jak inni wskazywali w komentarzach, glob() może potknąć się o niespójne kierunki ukośne. Aby pomóc w tym, sugeruję, aby użyć join() i expanduser() funkcje w os.path moduł, a może i getcwd() funkcja w os moduł, jak również.

Jako przykłady:

from glob import glob

# Return everything under C:\Users\admin that contains a folder called wlp.
glob('C:\Users\admin\*\wlp')

Powyższe jest straszne - ścieżka została zakodowana na stałe i będzie działać tylko w systemie Windows między nazwą dysku a \s na stałe wpisane na ścieżkę.

from glob    import glob
from os.path import join

# Return everything under Users, admin, that contains a folder called wlp.
glob(join('Users', 'admin', '*', 'wlp'))

Powyższe działa lepiej, ale opiera się na nazwie folderu Usersczęsto spotykane w systemie Windows i nie tak często spotykane w innych systemach operacyjnych. Opiera się również na użytkowniku o określonej nazwie, admin.

from glob    import glob
from os.path import expanduser, join

# Return everything under the user directory that contains a folder called wlp.
glob(join(expanduser('~'), '*', 'wlp'))

Działa to doskonale na wszystkich platformach.

Kolejny świetny przykład, który działa doskonale na różnych platformach i robi coś nieco innego:

from glob    import glob
from os      import getcwd
from os.path import join

# Return everything under the current directory that contains a folder called wlp.
glob(join(getcwd(), '*', 'wlp'))

Mamy nadzieję, że te przykłady pomogą Ci zobaczyć moc kilku funkcji, które możesz znaleźć w standardowych modułach biblioteki Python.


45
2017-07-09 11:43



Dodatkowa globalna zabawa: począwszy od Pythona 3.5, ** działa tak długo, jak ustawisz recursive = True. Zobacz dokumentację tutaj: docs.python.org/3.5/library/glob.html#glob.glob - ArtOfWarfare


def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 

33
2018-06-10 16:16



co powiesz na pep8? - Yauhen Yakimovich


Powinieneś użyć os moduł do wyświetlania zawartości katalogu.os.listdir(".") zwraca całą zawartość katalogu. Sprawdzamy wynik i dołączamy do listy.

import os

content_list = []

for content in os.listdir("."): # "." means current directory
    content_list.append(content)

print content_list

27
2018-03-23 10:09



content_list = os.listdir(".") działa również tak, jak zwraca listę. - ExceptionSlayer
Dotyczy to również katalogów, prawda? Nie tylko pliki? - Samuel Edwin Ward


import os
lst=os.listdir(path)

os.listdir zwraca listę zawierającą nazwy wpisów w katalogu podanych przez ścieżkę.


22
2017-07-07 10:12