Belirli bir dizindeki dosyalar üzerinde nasıl yineleme yapabilirim?


555

.asmBelirli bir dizin içindeki tüm dosyaları yinelemek ve üzerlerinde bazı eylemler yapmak gerekiyor.

Bu nasıl verimli bir şekilde yapılabilir?

Yanıtlar:


807

Orijinal cevap:

import os

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue

Yukarıdaki yanıtın Python 3.6 sürümü, os- olarak stradlandırılan bir değişkende nesne yoluna sahip olduğunuzu varsayarsak directory_in_str:

import os

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
         continue
     else:
         continue

Veya özyineli olarak pathlib:

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)

1
Bu sadece bir dizinin hemen altındaki dizinleri veya dosyaları listeliyor gibi görünüyor. Aşağıdaki pedromateo'nun cevabı yinelemeli bir liste yapıyor gibi görünüyor.
Jay Sheth

8
Python 3.6 dizininde bayt cinsinden olması beklenir ve listdir, bayt veri türünde de bir dosya adı listesi verir, böylece bitleri doğrudan üzerinde çalıştıramazsınız. Bu kod bloğu şu şekilde değiştirilmelidirdirectory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue
Kim Stacks

13
print(os.path.join(directory, filename))print(os.path.join(directory_in_str, filename))3.6 python çalışmak için değiştirilmesi gerekiyor
Hugo Koopmans

54
Bunu 2017'de veya ötesinde görüyorsanız, os.scandir (dir_str) artık kullanılabilir ve daha temiz. Fsencode'a gerek yok. for entry in os.scandir(path): print(entry.path)
keçi

2
Tercih if filename.endswith((".asm", ".py")):etmekif filename.endswith(".asm") or filename.endswith(".py"):
Maroloccio

152

Bu, sadece dizinin hemen alt öğelerini değil, tüm alt dosyaları tekrarlayacaktır:

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)

3
Os.walk işlevi için bir başvuru şu konumda bulunur: docs.python.org/2/library/os.path.html#os.path.walk
ScottMcC

136

Glob modülünü kullanmayı deneyebilirsiniz :

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

Python 3.5'ten bu yana alt dizinleri de arayabilirsiniz:

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

Dokümanlardan:

Glob modülü, sonuçlar rasgele sırayla döndürülmesine rağmen, Unix kabuğu tarafından kullanılan kurallara göre belirtilen bir kalıpla eşleşen tüm yol adlarını bulur. Yaklaşık işareti genişletmesi yapılmaz, ancak [] ile ifade edilen *,? Ve karakter aralıkları doğru şekilde eşleştirilir.


19

Python 3.5'ten beri , os.scandir ( ) ile işler çok daha kolay

with os.scandir(path) as it:
    for entry in it:
        if entry.name.endswith(".asm") and entry.is_file():
            print(entry.name, entry.path)

List.Del () yerine scandir () kullanılması, dosya türü veya dosya özniteliği bilgileri de gerektiren kodun performansını önemli ölçüde artırabilir, çünkü işletim sistemi bir dizini tararken os.DirEntry nesneleri bu bilgileri sağlar. Tüm os.DirEntry yöntemleri bir sistem çağrısı gerçekleştirebilir, ancak is_dir () ve is_file () genellikle sembolik bağlantılar için yalnızca bir sistem çağrısı gerektirir; os.DirEntry.stat () her zaman Unix üzerinde sistem çağrısı gerektirir, ancak Windows'taki sembolik bağlantılar için yalnızca bir çağrı gerektirir.


entrya, posix.DirEntry gibi kullanışlı yöntemler bir grup ile türü entry.is_dir(), is_file(),is_symlink()
crypdick

17

Python 3.4 ve üzeri standart kütüphanede pathlib sunar . Şunları yapabilirsiniz:

from pathlib import Path

asm_pths = [pth for pth in Path.cwd().iterdir()
            if pth.suffix == '.asm']

Veya liste kavrayışlarından hoşlanmıyorsanız:

asm_paths = []
for pth in Path.cwd().iterdir():
    if pth.suffix == '.asm':
        asm_pths.append(pth)

Path nesneler kolayca dizgilere dönüştürülebilir.


9

İşte Python dosyaları üzerinden yineleme:

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

BU TEKNİKLERİMİZDEN HİÇBİR SANTRASYON SİPARİŞİ GARANTİSİ

Evet, süper tahmin edilemez. Dosya adlarının sıralandığına dikkat edin, bu da dosyaların sırası önemliyse, video kareleri veya zamana bağlı veri toplama için önemlidir. Dosya adlarınıza dizinler eklediğinizden emin olun!


Her zaman sıralanmadı ... im1, im10, im11 ..., im2 ... Aksi takdirde faydalı yaklaşım. from pkg_resources import parse_versionve filenames.sort(key=parse_version)başardı.
Hastur

5

Glob'u dizine ve listeye başvurmak için kullanabilirsiniz :

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

Dizideki tüm dizinlerin listesini almak için os kullanabilirsiniz :

os.listdir(directory)

4

Bu uygulama ile henüz çok mutlu değilim DirectoryIndex._make(next(os.walk(input_path))), sadece bir dosya listesi istediğiniz yolu geçebileceği şekilde yapan özel bir oluşturucuya sahip olmak istedim . Düzenlemeler hoş geldiniz!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)

2

Kütüphanede scandiryerleşik olan direktifin kullanılmasını gerçekten seviyorum os. İşte çalışan bir örnek:

import os

i = 0
with os.scandir('/usr/local/bin') as root_dir:
    for path in root_dir:
        if path.is_file():
            i += 1
            print(f"Full path is: {path} and just the name is: {path.name}")
print(f"{i} files scanned successfully.")

yinelenen cevap
crypdick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.