Soru Bir dizinin tüm dosyalarını nasıl listeleyebilirim?


Python'daki bir dizinin tüm dosyalarını nasıl listeleyebilirim? list?


2825
2017-07-08 19:31


Menşei


İle ilgili Alt dizinlerin listesi nasıl alınır? - rds
os.listdir(path) Belirtilen yoldan dosya adlarının ve alt dizinlerin bir dizisini döndürür veya atlanırsa geçerli olanı döndürür. (Bunu Google’dan insanlar için görmek, şu anki en iyi cevap soruyu yanıtlamıyor.) - Apollys
Tüm dosyalar sadece mi? Alt dizinleri listelemek ister misiniz? - Aleksandar Jovanovic
Bu güzel çalışır (aşağıda en iyi cevap): from os import listdir  from os.path import isfile, join  files = [f for f in listdir(mypath) if isfile(join(mypath, f))] Not: dosyaların saklandığı dizin yoluna bir dize atamanız gerekir (örn .: mypath = "users/name/desktop/"). - Arshin
Dosyaları şu şekilde mi kastediyorsunuz: Alt dizinler veya bağlantılar olmayan alt dosyalar veya alt dizinler ve bağlantılar dahil tüm dosyalar? - Mulliganaceous


Cevaplar:


os.listdir() bir dizinde olan her şeyi size alır - dosyalar ve dizinler.

Eğer istersen sadece dosyaları kullanarak bunu filtreleyebilirsiniz os.path:

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

ya da kullanabilirsiniz os.walk() Ziyaret ettiği her bir dizin için iki liste oluşturacaktır - sizin için dosyalara ve direklere bölünür. Sadece en üstteki dizini istiyorsan, ilk vereceği zaman kırılabilirsin.

from os import walk

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

Son olarak, bu örnekte gösterildiği gibi, kullanabileceğiniz bir listeye bir liste ekleyerek .extend() veya

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

Şahsen tercih ederim .extend()


2829
2017-07-08 21:01



Windows üzerinde herhangi bir nedenle unicode dosya isimleriyle çalışmıyor gibi görünüyor. - cdiggins
Biraz daha basit: (_, _, filenames) = walk(mypath).next()  (eğer yürüyüşün en az bir değer döndüreceğinden eminseniz, hangisi gerekir.) - misterbee
Tam yollar saklamak için hafif bir değişiklik: os.walk (mypath) için (dirpath, dirnames, dosya isimleri): checksum_files.extend (dosya adında dosya adı için os.path.join (dirpath, dosya adı)) - okigan
f.extend(filenames) aslında eşdeğer değildir f = f + filenames. extend değişiklik yapacak f yerinde, eklerken yeni bir bellek konumunda yeni bir liste oluşturur. Bunun anlamı extend genellikle daha verimli +Ancak, birden fazla nesne listeye referanslar tutuyorsa bazen karışıklığa yol açabilir. Son olarak, buna değer f += filenames eşdeğerdir f.extend(filenames), değil  f = f + filenames. - Benjamin Hodgson♦
@misterbee, çözümün en iyisi, sadece küçük bir gelişme: _, _, filenames = next(walk(mypath), (None, None, [])) - bgusach


Kullanmayı tercih ederim glob modül eşleştirme ve genişletme gibi.

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

Sorgulanan dosyalarla birlikte bir liste döndürür:

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

1143
2017-07-09 18:13



bu listedir + fnmatch için bir kısayol docs.python.org/library/fnmatch.html#fnmatch.fnmatch - Stefano
Benim için onu beslediğim tutarsızlığı ekleyemez. Girişdeki doğru eğiklikler, çıktıda doğru eğik çizgi ile sonuçlanır. - Antony Hatchkins
Bunun en basit uygulama olduğu için kabul edilen cevap olması gerektiğini düşünüyorum. - isosceleswheel
Bunun tam yolu döndürdüğünü unutmayın. - xji
açıklığa kavuşturmak, bu yapar değil "tam yol" döndürün; Her ne olursa olsun, globun genişlemesini basitçe döndürür. E. /home/user/foo/bar/hello.txtsonra dizinde çalışıyorsa foo, glob("bar/*.txt") dönecek bar/hello.txt. Gerçekte yaptığınız durumlar tam (yani, mutlak) yolu ister; bu durumlar için bkz. stackoverflow.com/questions/51520/... - michael


import os
os.listdir("somedirectory")

"dosya yolu" içindeki tüm dosya ve dizinlerin bir listesini döndürür.


520
2017-07-08 19:35



Bu, döndürülen tam yolla karşılaştırıldığında dosyaların göreli yolunu döndürür glob.glob - xji
@JIXiang: os.listdir() her zaman döner sadece dosya isimleri (göreli yollar değil). Ne glob.glob() döndürme, giriş deseninin yol biçimiyle yönlendirilir. - mklement0
os.listdir () -> Her zaman verilen konum içindeki dir ve dosyayı listeler. Sadece dizin dosyalarının listelenmesinin bir yolu var mı? - RishuA


Python 2 ve 3 ile dosyaların bir listesini alın


Burada kısa bir video da yaptım:  Python: bir dizinde dosya listesi nasıl alınır


os.listdir ()

veya ..... geçerli dizindeki tüm dosyaları (ve dizinleri) almak için sıcak (Python 3)

Dosyayı Python 3'teki geçerli dizinde bulundurmanın en basit yolu budur. Bu gerçekten basit; kullan os modül ve listdir () işlevi ve bu dizinde (ve dizinde yer alan klasörleri içeren dosyaya sahip olursunuz, ancak dosyayı kullanabilmeniz için alt dizinde bulunmazsınız) - bunun hakkında konuşacağım sonra).

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

Glob kullanma

Aynı türden dosya seçmek veya genel olarak ortak bir şey bulmak daha kolaydı. Aşağıdaki örneğe bakın:

import glob

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

Liste anlama kullanma

import glob

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

Os.path.abspath ile tam yol adını alma

Fark ettiğiniz gibi, yukarıdaki kodda dosyanın tam yoluna sahip değilsiniz. Mutlak yola sahip olmanız gerekiyorsa, başka bir işlev kullanabilirsiniz. os.path modül denir _getfullpathname, aldığınız dosyayı koymak os.listdir() bir argüman olarak. Daha sonra kontrol edeceğimiz gibi tam yola sahip olmanın başka yolları da vardır (mexmex tarafından önerildiği gibi, _getfullpathname ile değiştirdim) abspath).

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

Yürüme ile tüm alt dizinlere bir dosya türünün tam yol adını alın

Bunu birçok dizinde bulmam için çok yararlı buluyorum ve adı hatırlamadığım bir dosya bulmama yardımcı oldu:

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 (): dosyaları geçerli dizinde al (Python 2)

Python 2'de, geçerli dizindeki dosyaların listesini istiyorsanız, argümanı '.' Olarak vermelisiniz. veya os.listdir yöntemindeki os.getcwd ().

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

Dizin ağacında yukarı çıkmak için

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

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

Dosyaları al: os.listdir () belirli bir dizinde (Python 2 ve 3)

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

Os.listdir () ile belirli bir alt dizinin dosyalarını alın

import os

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

os.walk ('.') - geçerli dizin

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

glob modülü - tüm dosyalar

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

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

sonraki (os.walk ('.')) ve os.path.join ('dir', 'dosya')

>>> 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: \') - yolun tamamını al - liste anlama

>>> [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 - tam yol al - alt dizinlerdeki tüm dosyalar

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 () - sadece txt dosyalarını al

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

glob - sadece txt dosyalarını al

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

Dosyaların tam yolunu bulmak için glob kullanma

Dosyaların mutlak yoluna ihtiyacım varsa:

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

Diğer glob kullanımı

Dizindeki tüm dosyaları istiyorsam:

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

Listede dizinleri önlemek için os.path.isfile öğesini kullanma

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'in kullanılması (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

Liste anlama kullanmak istiyorsanız

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

Os.walk ile tüm dosyaları alın

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

Sadece bir sonraki dosyaları al ve bir dizinde yürü

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

Sıradaki dizinleri alın ve bir dizinde yürüyün

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

Tüm alt isimleri yürüyüşle alın

>>> 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 () Python 3.5 üzerinde

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

Ör. 1: Alt dizinlerde kaç dosya var?

Bu örnekte, tüm dizinde ve alt dizinlerinde bulunan dosya sayısını ararız.

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'

Örn: Tüm dosyalar bir dizinden diğerine nasıl kopyalanır?

Bilgisayarınızda herhangi bir türdeki dosyaları (varsayılan: pptx) bulmak ve bunları yeni bir klasöre kopyalamak için bir komut dosyası.

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

Ör. 3: Txt dosyasındaki tüm dosyaları nasıl alırsınız

Tüm dosya adlarına sahip bir txt dosyası oluşturmak istiyorsanız:

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



Liste argümanına yol argümanını eklemelisiniz. - Alejandro Sazo
Cevabı daha kullanışlı hale getirdiğinden, kod için bazı bağlam / açıklamalar eklemesi kesinlikle teşvik edilir. - EJoshuaS
Katılıyorum, ama ben de bir şey fark etmedim, python2 python3 isteğe bağlı iken argüman gerektirir, Eğer her iki python sürümü için cevabı geliştirirseniz harika olurdu :) - Alejandro Sazo
Tamam, Python 2'ye girdim ve farklılıkları buldum ve yazıyı düzenledim. - Giovanni Gianni
Yapacak bir sebep yok [f for f in os.listdir()]; os.listdir() zaten bir listBu yüzden sadece orijinali gereksiz yere kopyalama list atmadan önce. - ShadowRanger


Tek satırlık bir çözüm sadece dosya listesi (alt dizin yok):

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

veya mutlak yol adları:

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

144
2018-01-18 17:42



Zaten varsa sadece bir liner import os. Daha az özlü görünüyor glob() bana göre. - ArtOfWarfare
glob ile ilgili problem, 'something.something' olarak adlandırılan bir klasörün glob tarafından iade edilmesidir ('/ home / adam /*.*') - Remi
OS X'de, paket adı verilen bir şey var. Genelde bir dosya (.tar) gibi ele alınması gereken bir dizin. Dosya veya dizin olarak kabul edilenleri ister misiniz? kullanma glob() bir dosya olarak ele alırdı. Sizin yönteminiz bir dizin olarak ele alacaktır. - ArtOfWarfare


Dizin ve Tüm Alt Dizinlerinden Tam Dosya Yollarını Alma

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

  • Yukarıdaki işlevde sağladığım yol, ikisi kök dizininde, diğeri "SUBFOLDER" adında bir alt klasörde olmak üzere 3 dosya içeriyordu. Şimdi şu gibi şeyler yapabilirsiniz:
  • print full_file_paths listeyi basacak:

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

İsterseniz, içeriği açabilir ve okuyabilir veya yalnızca aşağıdaki kodda bulunan ".dat" uzantılı dosyaları odaklayabilirsiniz:

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





3.4 sürümünden beri yineleyiciler bunun için çok daha verimli olan os.listdir():

pathlib: 3.4 sürümünde yeni.

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

Göre PEP 428, amacı pathlib Kütüphane, dosya sistemi yollarını ele alan basit bir sınıf hiyerarşisi ve kullanıcıların üzerinde yaptıkları ortak işlemler sağlamaktır.

os.scandir(): 3.5 sürümünde yeni.

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

Bunu not et os.walk() kullanımları os.scandir() yerine os.listdir() 3.5 sürümünden ve hızına göre 2-20 kat arttı PEP 471.

Ayrıca ShadowRanger'in yorumunu okumayı da tavsiye edeyim.


57
2018-06-18 20:58



Teşekkürler! Doğrudan geri dönmeyen tek çözüm olduğunu düşünüyorum. list. Kullanabilir p.name ilk yerine p Alternatif olarak tercih edilirse. - JeromeJ
Hoşgeldiniz! Üretmeyi tercih ederim pathlib.Path() Örnekler çok kullanışlı yöntemlere sahip olduklarından atık israf etmek istemem. Ayrıca arayabilirsiniz str(p) Yol adları için üzerlerine. - SzieberthAdam
Not: os.scandir Çözüm daha verimli olacak os.listdir bir ile os.path.is_file kontrol et veya benzerleri list (böylece tembel iterasyondan faydalanmıyorsunuz) os.scandir size verilen işletim sistemi API'lerini kullanır is_file itebildiği kadar ücretsiz bilgi, diske dosya başına gidiş-dönüş yok stat hepsini (Windows'ta, DirEntryseni tamamla stat İhtiyaç duyulan * NIX sistemlerinde ücretsiz bilgi stat ötesinde bilgi için is_file, is_dirvs. DirEntry ilk önbellek stat kolaylık için). - ShadowRanger
Bunu en yararlı çözüm olarak buldum ( pathlib). Belirli uzatma türlerini ve mutlak yolları kolayca alabilirim. Teşekkür ederim! - HEADLESS_0NE
Ayrıca kullanabilirsiniz entry.name sadece dosya adını almak için veya entry.path tam yolunu almak için. Artık her yerde os.path.join () yok. - user136036


Gerçekten beğendim Adamk'ın cevabı, kullandığınızı öneren glob()Aynı adın modülünden. Bu, desen eşlemesine sahip olmanıza olanak tanır *s.

Ama diğer insanlar yorumlarda belirttiği gibi, glob() tutarsız eğik yönlere göre yukarı atılabilir. Bunun için size yardımcı olmanızı öneririm join() ve expanduser() işlevler os.path modül ve belki de getcwd() işlevinde os modül de.

Örnek olarak:

from glob import glob

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

Yukarıdaki korkunç - yolun kodlanmış ve sadece sürücü adı ve arasında Windows üzerinde çalışacak \Yolun içine kodlanmış.

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

Yukarıda daha iyi çalışır, ancak klasör adına dayanır UsersGenellikle Windows’ta bulunur ve diğer işletim sistemlerinde sıkça bulunmaz. Aynı zamanda belirli bir ada sahip kullanıcıya dayanır, 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'))

Bu, tüm platformlarda mükemmel çalışır.

Platformlar arasında mükemmel bir şekilde çalışan ve biraz farklı olan bir başka harika örnek:

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

Umarım bu örnekler, standart Python kütüphane modüllerinde bulabileceğiniz birkaç fonksiyonun gücünü görmenize yardımcı olur.


45
2017-07-09 11:43



Ekstra glob eğlencesi: Python 3.5'ten başlayarak, ** ayarladığınız sürece çalışır recursive = True. Buradaki dokümanlara bakın: docs.python.org/3.5/library/glob.html#glob.glob - ArtOfWarfare