मैं किसी निर्देशिका में फ़ाइलों पर कैसे पुनरावृति कर सकता हूं?


555

मुझे .asmदी गई निर्देशिका के अंदर सभी फ़ाइलों के माध्यम से पुनरावृति करने और उन पर कुछ क्रियाएं करने की आवश्यकता है।

यह एक कुशल तरीके से कैसे किया जा सकता है?

जवाबों:


807

मूल उत्तर:

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

उपरोक्त उत्तर के पायथन 3.6 संस्करण, का उपयोग करते हुए os- यह मानते हुए कि आपके पास strएक चर के रूप में निर्देशिका पथ है 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

या पुनरावर्ती, का उपयोग कर 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
यह सिर्फ निर्देशिका या फ़ाइलों को एक निर्देशिका के तहत तुरंत सूचीबद्ध करने के लिए लगता है। नीचे पेड्रोमेटो द्वारा उत्तर एक पुनरावर्ती लिस्टिंग करने के लिए लगता है।
जय शेठ

8
कृपया ध्यान दें कि पायथन में 3.6 डायरेक्टरी बाइट्स में होने की उम्मीद है और फिर लिस्टर्ड ब्यूटेन डेटा टाइप में भी फाइलनाम की एक सूची को थूक देगा ताकि आप सीधे उस पर एंडवाइट न चला सकें। इस कोड ब्लॉक को बदल दिया जाना चाहिए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
किम स्टैक

13
print(os.path.join(directory, filename))print(os.path.join(directory_in_str, filename))अजगर 3.6 में काम करने के लिए इसे बदलने की आवश्यकता है
ह्यूगो कोपामन्स

54
यदि आप इसे 2017 या उससे आगे देख रहे हैं, तो os.scandir (dir_str) अब उपलब्ध है और उपयोग करने के लिए बहुत क्लीनर है। Fsencode की कोई आवश्यकता नहीं है। for entry in os.scandir(path): print(entry.path)
बकरी

2
पसंद if filename.endswith((".asm", ".py")):करते हैंif filename.endswith(".asm") or filename.endswith(".py"):
Maroloccio

151

यह केवल सभी तात्कालिक संतानों पर निर्देशिका के तत्काल बच्चों को पुनरावृत्त करेगा:

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 फ़ंक्शन का एक संदर्भ निम्नलिखित में पाया जाता है: docs.python.org/2/library/os.path.html#os.path.walk
ScottMcC

136

आप ग्लोब मॉड्यूल का उपयोग करके देख सकते हैं :

import glob

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

और पायथन 3.5 के बाद से आप उपनिर्देशिकाएँ भी खोज सकते हैं:

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

डॉक्स से:

ग्लोब मॉड्यूल उन सभी मार्गों का पता लगाता है जो यूनिक्स शेल द्वारा उपयोग किए गए नियमों के अनुसार एक निर्दिष्ट पैटर्न से मेल खाते हैं, हालांकि परिणाम मध्यस्थ आदेश में वापस किए जाते हैं। कोई टिल्ड विस्तार नहीं किया जाता है, लेकिन *, और [] के साथ व्यक्त चरित्र रेंज का सही मिलान किया जाएगा।


19

पायथन 3.5 के बाद से, os.scandir ( ) के साथ चीजें बहुत आसान हैं

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

Listdir () के बजाय स्कैंडिर () का उपयोग करना कोड के प्रदर्शन को बढ़ा सकता है जिसमें फ़ाइल प्रकार या फ़ाइल विशेषता जानकारी की भी आवश्यकता होती है, क्योंकि os.DirEntry ऑब्जेक्ट इस जानकारी को उजागर करते हैं यदि ऑपरेटिंग सिस्टम किसी निर्देशिका को स्कैन करते समय प्रदान करता है। सभी os.DirEntry विधियाँ एक सिस्टम कॉल कर सकती हैं, लेकिन is_dir () और is_file () में आमतौर पर केवल प्रतीकात्मक लिंक के लिए सिस्टम कॉल की आवश्यकता होती है; os.DirEntry.stat () को हमेशा यूनिक्स पर एक सिस्टम कॉल की आवश्यकता होती है, लेकिन केवल विंडोज पर प्रतीकात्मक लिंक के लिए एक की आवश्यकता होती है।


entryएक है posix.DirEntry जैसे काम के तरीकों में से एक समूह के साथ प्रकार entry.is_dir(), is_file(),is_symlink()
crypdick

17

पायथन 3.4 और बाद में मानक पुस्तकालय में पाथलिब की पेशकश करता है। तुम यह कर सकते थे:

from pathlib import Path

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

या यदि आपको सूची की समझ नहीं है:

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

Path वस्तुओं को आसानी से तारों में परिवर्तित किया जा सकता है।


9

यहां बताया गया है कि मैं पायथन में फ़ाइलों के माध्यम से कैसे पुनरावृति करता हूं:

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

इस तकनीक का कोई भी उल्लंघन किसी भी आदेश का पालन नहीं करता है

यूप, सुपर अप्रत्याशित। ध्यान दें कि मैं फ़ाइल नाम को सॉर्ट करता हूं, जो महत्वपूर्ण है यदि फ़ाइलों का क्रम मायने रखता है, अर्थात वीडियो फ्रेम या समय पर निर्भर डेटा संग्रह के लिए। हालांकि अपने फ़ाइल नाम में सूचकांकों को रखना सुनिश्चित करें!


हमेशा सॉर्ट नहीं किया गया ... im1, im10, im11 ..., im2 ... अन्यथा उपयोगी दृष्टिकोण। from pkg_resources import parse_versionऔर filenames.sort(key=parse_version)यह किया।
Hastur

5

निर्देशिका और सूची को संदर्भित करने के लिए आप ग्लोब का उपयोग कर सकते हैं :

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)

सरणी में सभी निर्देशिका की सूची प्राप्त करने के लिए आप ओएस का उपयोग कर सकते हैं :

os.listdir(directory)

4

मैं इस कार्यान्वयन से अभी तक बहुत खुश नहीं हूँ, मैं चाहता था कि एक कस्टम कंस्ट्रक्टर हो जो ऐसा करता है DirectoryIndex._make(next(os.walk(input_path)))कि आप केवल उस पथ को पारित कर सकते हैं जिसके लिए आप फ़ाइल प्रविष्टि चाहते हैं। संपादन में आपका स्वागत है!

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

मुझे वास्तव में उस scandirनिर्देश का उपयोग करना पसंद है जो osपुस्तकालय में बनाया गया है । यहाँ एक काम कर उदाहरण है:

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

डुप्लिकेट उत्तर
क्रायडिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.