আমি কিভাবে কোনও ডিরেক্টরিতে সমস্ত ফাইল তালিকাবদ্ধ করব?


3473

পাইথনের ডিরেক্টরিগুলির সমস্ত ফাইল কীভাবে তালিকাভুক্ত করব এবং এগুলিতে একটি যুক্ত করতে পারি list?


27
rd

উত্তর:


4206

os.listdir()- আপনি সবকিছু একটি ডিরেক্টরির মধ্যে যে পাবেন ফাইল এবং ডিরেক্টরি

আপনি যদি কেবল ফাইলগুলি চান তবে আপনি এটি ব্যবহার করে এটি ফিল্টার করতে পারেন os.path:

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

অথবা আপনি ব্যবহার করতে পারেন os.walk()যা এটি প্রতিটি ডিরেক্টরি দেখার জন্য দুটি তালিকা অর্জন করবে - আপনার জন্য ফাইল এবং ডায়ারে বিভক্ত । আপনি যদি শীর্ষস্থানীয় ডিরেক্টরিটি চান তবে আপনি এটির প্রথমবারের জন্য কেবল ব্রেক করতে পারেন

from os import walk

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

87
কিছুটা সহজ: (_, _, filenames) = walk(mypath).next() (যদি আপনি বিশ্বাস করেন যে
হাঁটাচরনের

9
পুরো পাথগুলি সংরক্ষণ করার জন্য সামান্য পরিবর্তন: ওস.ওয়ালক (মাইপাথ) এ (dirpath, dirnames, ফাইলের নাম): চেকসাম_ফিলস.ইজেনড (os.path.join (dirpath, ফাইলের নাম) ফাইল-নামগুলিতে ফাইল নাম) বিরতি
ওকিগান

150
f.extend(filenames)আসলে সমতুল্য নয় f = f + filenames। জায়গায় স্থান extendপরিবর্তন করবে f, যেখানে যুক্ত করা একটি নতুন মেমরি অবস্থানে একটি নতুন তালিকা তৈরি করে। এর অর্থ extendসাধারণত তুলনায় আরও কার্যকর +, তবে একাধিক বস্তু তালিকায় রেফারেন্স রাখলে এটি কখনও কখনও বিভ্রান্তির কারণ হতে পারে। শেষ অবধি, এটি লক্ষ করার মতো যে এটির f += filenamesসমতুল্য f.extend(filenames), নয় f = f + filenames
বেঞ্জামিন হজসন

30
@ মিস্টারবি, আপনার সমাধানটি সবচেয়ে ভাল, মাত্র একটি ছোট উন্নতি:_, _, filenames = next(walk(mypath), (None, None, []))
বিগুসাচ

35
অজগর 3.x ব্যবহারে(_, _, filenames) = next(os.walk(mypath))
ET-CS

1676

আমি globমডিউলটি ব্যবহার করতে পছন্দ করি কারণ এটি প্যাটার্ন মেলা এবং সম্প্রসারণ করে।

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

এটি কোয়েড করা ফাইলগুলির সাথে একটি তালিকা ফিরিয়ে দেবে:

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

17
এটি তালিকাভুক্ত + fnmatch docs.python.org/library/fnmatch.html#fnmatch.fnmatch
স্টেফানো

31
পরিষ্কার করার জন্য, এটি "পুরো পথ" ফেরায় না ; এটি কেবল গ্লোবটির প্রসারণ ফিরিয়ে দেয়, তা যাই হোক না কেন। উদাহরণস্বরূপ, প্রদত্ত /home/user/foo/bar/hello.txt, তারপর, ডিরেক্টরিতে চলমান থাকলে foo, glob("bar/*.txt")ফেরত আসবে bar/hello.txt। এমন কিছু ঘটনা রয়েছে যখন আপনি বাস্তবে সম্পূর্ণ (অর্থাত্ পরম) পথ চান; এই ক্ষেত্রেগুলির জন্য, stackoverflow.com
মাইকেল


6
এই প্রশ্নের উত্তর দেয় না। glob.glob("*")হবে।
জিন-ফ্রান্সোইস ফ্যাব্রে

সুন্দর !!!! সুতরাং .... x=glob.glob("../train/*.png")যতক্ষণ আমি ফোল্ডারের নাম জানি ততক্ষণ আমার পথের একটি অ্যারে দেবে। খুবই ভাল!
জেনিফার ক্রসবি

855

পাইথন 2 এবং 3 দিয়ে ফাইলগুলির একটি তালিকা পান


os.listdir()

বর্তমান ডিরেক্টরিতে (পাইথন 3) সমস্ত ফাইল (এবং ডিরেক্টরিগুলি) কীভাবে পাবেন

পাইথন 3- তে কেবল বর্তমান ডিরেক্টরিতে ফাইল os এবং listdir()ফাংশনটি পুনরুদ্ধার করার সহজ পদ্ধতিগুলি অনুসরণ করা হচ্ছে, পরবর্তী অনুসন্ধানে ডিরেক্টরিতে ফোল্ডারগুলি কীভাবে ফিরিয়ে আনতে হবে তা প্রদর্শিত হবে, তবে আপনার কাছে সাব-ডিরেক্টরিতে ফাইল থাকবে না, তার জন্য আপনার হাঁটা ব্যবহার করতে পারেন - পরে আলোচনা করা হয়েছে)।

 import os
 arr = os.listdir()
 print(arr)

 >>> ['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

glob

একই ধরণের ফাইল বা সাধারণ কোনও কিছু ফাইল নির্বাচন করতে আমি গ্লোবকে আরও সহজ পেয়েছি। নিম্নলিখিত উদাহরণটি দেখুন:

import glob

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

glob তালিকা বোঝার সাথে

import glob

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

glob একটি ফাংশন সহ

ফাংশনটি আর্গুমেন্টে প্রদত্ত এক্সটেনশনের (.txt, .docx ecc।) একটি তালিকা প্রদান করে

import glob

def filebrowser(ext=""):
    "Returns files with an extension"
    return [f for f in glob.glob(f"*{ext}")]

x = filebrowser(".txt")
print(x)

>>> ['example.txt', 'fb.txt', 'intro.txt', 'help.txt']

glob পূর্ববর্তী কোড প্রসারিত

ফাংশনটি এখন আপনার যুক্তি হিসাবে পাস করা স্ট্রিংয়ের সাথে মেলে এমন একটি ফাইলের তালিকা দেয়

import glob

def filesearch(word=""):
    """Returns a list with all files with the word/extension in it"""
    file = []
    for f in glob.glob("*"):
        if word[0] == ".":
            if f.endswith(word):
                file.append(f)
                return file
        elif word in f:
            file.append(f)
            return file
    return file

lookfor = "example", ".py"
for w in lookfor:
    print(f"{w:10} found => {filesearch(w)}")

আউটপুট

example    found => []
.py        found => ['search.py']

এর সাথে পুরো পথের নাম পাওয়া os.path.abspath

যেমন আপনি লক্ষ্য করেছেন, উপরের কোডটিতে আপনার কাছে ফাইলের পুরো পথ নেই। আপনার যদি নিখুঁত পাথের প্রয়োজন হয় তবে আপনি os.pathমডিউলটির অন্য একটি ফাংশন ব্যবহার করতে পারেন _getfullpathname, যে ফাইলটি আপনি os.listdir()আর্গুমেন্ট হিসাবে পেয়েছেন তা রেখে । পুরো পথটি পাওয়ার অন্যান্য উপায় রয়েছে, যেহেতু আমরা পরে যাচাই করব (আমি প্রতিস্থাপন করেছি, ম্যাক্সেমেক্সের পরামর্শ অনুসারে, _getfullpathname এর সাথে abspath)।

 import os
 files_path = [os.path.abspath(x) for x in os.listdir()]
 print(files_path)

 >>> ['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

সহ সমস্ত উপ-ডিরেক্টরিতে এক ধরণের ফাইলের পুরো পাথের নাম পান walk

অনেক ডিরেক্টরিতে স্টাফ পেতে এটি আমার খুব দরকারী বলে মনে হয়েছে এবং এটি এমন একটি ফাইল খুঁজে পেতে সহায়তা করেছিল যা সম্পর্কে নামটি মনে নেই:

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 file.endswith(".docx"):
            print(os.path.join(r, file))

os.listdir(): বর্তমান ডিরেক্টরিতে ফাইল পান (পাইথন 2)

পাইথন 2-এ, আপনি যদি বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলির তালিকা চান তবে আপনাকে আর্গুমেন্টটি 'হিসাবে দিতে হবে।' অথবা os.listcwd () os.listdir পদ্ধতিতে।

 import os
 arr = os.listdir('.')
 print(arr)

 >>> ['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

ডিরেক্টরি ট্রি আপ যেতে

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

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

ফাইলগুলি পান: os.listdir()একটি নির্দিষ্ট ডিরেক্টরিতে (পাইথন 2 এবং 3)

 import os
 arr = os.listdir('F:\\python')
 print(arr)

 >>> ['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

এর সাথে একটি নির্দিষ্ট সাব-ডাইরেক্টরির ফাইলগুলি পান os.listdir()

import os

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

os.walk('.') - বর্তমান ডিরেক্টরি

 import os
 arr = next(os.walk('.'))[2]
 print(arr)

 >>> ['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

next(os.walk('.')) এবং 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)

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

next(os.walk('F:\\') - পুরো পথটি পান - তালিকাটি উপলব্ধি করুন

 [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 - পুরো পথ পান - সাব ডায়ারগুলিতে সমস্ত ফাইল **

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

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

os.listdir() - কেবলমাত্র টেক্সট ফাইল পান

 arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
 print(arr_txt)

 >>> ['work.txt', '3ebooks.txt']

globফাইলগুলির সম্পূর্ণ পথ পেতে ব্যবহার করা

আমার যদি ফাইলগুলির পরম পথের প্রয়োজন হয়:

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

os.path.isfileতালিকার ডিরেক্টরিগুলি এড়ানোর জন্য ব্যবহার করা হচ্ছে

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

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

pathlibপাইথন ৩.৪ ব্যবহার করে

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

সহ list comprehension:

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

বিকল্পভাবে, pathlib.Path()পরিবর্তে ব্যবহার করুনpathlib.Path(".")

প্যাথলিব.পথ () এর গ্লোব পদ্ধতি ব্যবহার করুন

import pathlib

py = pathlib.Path().glob("*.py")
for file in py:
    print(file)

>>> stack_overflow_list.py
>>> stack_overflow_list_tkinter.py

সমস্ত ও শুধুমাত্র ওএসওয়াক ফাইলগুলি পান

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)
print(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']

কেবলমাত্র পরবর্তী ফাইলগুলি পান এবং একটি ডিরেক্টরিতে যান

 import os
 x = next(os.walk('F://python'))[2]
 print(x)

 >>> ['calculator.bat','calculator.py']

কেবলমাত্র পরবর্তীগুলির সাথে ডিরেক্টরি পান এবং একটি ডিরেক্টরিতে যান

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

 >>> ['python3','others']

এর সাথে সমস্ত সাবডিরের নাম পান walk

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() পাইথন থেকে 3.5 এবং আরও বড়

import os
x = [f.name for f in os.scandir() if f.is_file()]
print(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

উদাহরণ:

যাত্রা। 1: সাব-ডিরেক্টরিতে কয়টি ফাইল রয়েছে?

এই উদাহরণে, আমরা সমস্ত ডিরেক্টরি এবং এর উপ-ডিরেক্টরিতে অন্তর্ভুক্ত থাকা ফাইলগুলির সংখ্যা অনুসন্ধান করি।

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

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

Ex.2: ডিরেক্টরি থেকে অন্য ফাইলগুলিতে কীভাবে অনুলিপি করবেন?

আপনার কম্পিউটারে অর্ডার করার জন্য একটি স্ক্রিপ্ট একটি প্রকারের সমস্ত ফাইল (ডিফল্ট: pptx) সন্ধান করে এবং সেগুলি একটি নতুন ফোল্ডারে অনুলিপি করে।

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('-' * 30)
        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')


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

যাত্রা। 3: কীভাবে একটি টেক্সট ফাইলে সমস্ত ফাইল পাবেন

আপনি যদি সমস্ত ফাইলের নাম সহ একটি টেক্সট ফাইল তৈরি করতে চান:

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

উদাহরণ: হার্ড ড্রাইভের সমস্ত ফাইল সহ টেক্সট

"""
We are going to save a txt file with all the files in your directory.
We will use the function walk()
"""

import os

# see all the methods of os
# print(*dir(os), sep=", ")
listafile = []
percorso = []
with open("lista_file.txt", "w", encoding='utf-8') as testo:
    for root, dirs, files in os.walk("D:\\"):
        for file in files:
            listafile.append(file)
            percorso.append(root + "\\" + file)
            testo.write(file + "\n")
listafile.sort()
print("N. of files", len(listafile))
with open("lista_file_ordinata.txt", "w", encoding="utf-8") as testo_ordinato:
    for file in listafile:
        testo_ordinato.write(file + "\n")

with open("percorso.txt", "w", encoding="utf-8") as file_percorso:
    for file in percorso:
        file_percorso.write(file + "\n")

os.system("lista_file.txt")
os.system("lista_file_ordinata.txt")
os.system("percorso.txt")

এক টেক্সট ফাইলে সি: of এর সমস্ত ফাইল

এটি পূর্ববর্তী কোডের একটি সংক্ষিপ্ত সংস্করণ। আপনার অন্য অবস্থান থেকে শুরু করার প্রয়োজন হলে ফাইলগুলি সন্ধান করতে যেখানে ফোল্ডারটি পরিবর্তন করুন। এই কোডটি আমার কম্পিউটারে টেক্সট ফাইলে একটি 50 এমবি জেনারেট করে কিছু কম তবে 500.000 সম্পূর্ণ পথ সহ ফাইলগুলির সাথে লাইন।

import os

with open("file.txt", "w", encoding="utf-8") as filewrite:
    for r, d, f in os.walk("C:\\"):
        for file in f:
            filewrite.write(f"{r + file}\n")

কোনও প্রকারের ফোল্ডারে সমস্ত পাথ সহ একটি ফাইল কীভাবে লিখবেন

এই ফাংশনটির সাহায্যে আপনি একটি টেক্সট ফাইল তৈরি করতে পারেন যার মধ্যে এমন ধরণের ফাইলের নাম থাকবে যা আপনি প্রকারের সমস্ত ফাইলের পুরো পথ সহ সন্ধান করবেন (প্রাক্তন pngfile.txt)। এটি কখনও কখনও দরকারী হতে পারে, আমি মনে করি।

import os

def searchfiles(extension='.ttf', folder='H:\\'):
    "Create a txt file with all the file of a type"
    with open(extension[1:] + "file.txt", "w", encoding="utf-8") as filewrite:
        for r, d, f in os.walk(folder):
            for file in f:
                if file.endswith(extension):
                    filewrite.write(f"{r + file}\n")

# looking for png file (fonts) in the hard disk H:\
searchfiles('.png', 'H:\\')

>>> H:\4bs_18\Dolphins5.png
>>> H:\4bs_18\Dolphins6.png
>>> H:\4bs_18\Dolphins7.png
>>> H:\5_18\marketing html\assets\imageslogo2.png
>>> H:\7z001.png
>>> H:\7z002.png

(নতুন) সমস্ত ফাইল সন্ধান করুন এবং টিনকটার জিইউআই দিয়ে এগুলি খুলুন

আমি এই 2019 সালে একটি ডায়ারে সমস্ত ফাইল সন্ধান করতে এবং তালিকার ফাইলটির নামে ডাবল ক্লিক করে এগুলি খুলতে সক্ষম করতে একটি সামান্য অ্যাপ্লিকেশন যুক্ত করতে চেয়েছিলাম। এখানে চিত্র বর্ণনা লিখুন

import tkinter as tk
import os

def searchfiles(extension='.txt', folder='H:\\'):
    "insert all files in the listbox"
    for r, d, f in os.walk(folder):
        for file in f:
            if file.endswith(extension):
                lb.insert(0, r + "\\" + file)

def open_file():
    os.startfile(lb.get(lb.curselection()[0]))

root = tk.Tk()
root.geometry("400x400")
bt = tk.Button(root, text="Search", command=lambda:searchfiles('.png', 'H:\\'))
bt.pack()
lb = tk.Listbox(root)
lb.pack(fill="both", expand=1)
lb.bind("<Double-Button>", lambda x: open_file())
root.mainloop()

13
এটি এখানে জিজ্ঞাসা করা হয়নি এমন প্রশ্নের জবাব অনেকের মিশ্র-ম্যাস। এটি সতর্কতা বা প্রস্তাবিত পদ্ধতির কী তা ব্যাখ্যা করার উপযুক্ত হতে পারে। আমি কখনই কোনটি ব্যবহার করা সবচেয়ে উপযুক্ত তা না জানলে আমি একই জিনিসটি করার 20 টি উপায়ের বিপরীতে কোনও উপায় না জেনে আরও ভাল।
CS95

ঠিক আছে, এএসএপি আমি আমার উত্তরটি একবার দেখে নেব এবং এটি আরও পরিষ্কার করার এবং পদ্ধতিগুলির মধ্যে পার্থক্য সম্পর্কে আরও দরকারী তথ্য সহ চেষ্টা করার চেষ্টা করব
জিওভান্নি জি পিওয়াই

ফাইলনেমে কোনও স্ট্রিং রয়েছে কিনা তা পরীক্ষা করে আপনার ফাইলের বর্ধন নির্ধারণ করা উচিত নয়। এটি অনেক ঝামেলার কারণ হতে পারে। ফাইলের নামটি নির্দিষ্ট স্ট্রিংয়ের সাথে শেষ হয় কিনা তা আমি সর্বদা পরীক্ষা করার পরামর্শ দিই।
ni1ight

ঠিক আছে, @ n1light আমি কোডটি পরিবর্তন করেছি ...
জিওভান্নি জি পিওয়াই

810
import os
os.listdir("somedirectory")

"কিছু ডিরেক্টরি" ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরিগুলির তালিকা ফিরিয়ে দেবে।


11
এই আয় ফাইল আপেক্ষিক পাথ, পূর্ণ পাথ দিয়ে তুলনায় দ্বারা ফিরেglob.glob
xji

22
@ জিক্সিয়াং: os.listdir()সর্বদা নিখুঁত ফাইলের নামগুলি দেয় (আপেক্ষিক পাথ নয়)। কি glob.glob()ফেরত দেয় তা ইনপুট প্যাটার্নের পথ বিন্যাস দ্বারা চালিত হয়।
mklement0

os.listdir () -> এটি সর্বদা প্রদত্ত অবস্থানের ভিতরে দির এবং ফাইলের তালিকা করে। কেবলমাত্র ফাইল নয় ডিরেক্টরিকে তালিকাভুক্ত করার কোনও উপায় আছে?
রনিএ

160

কেবলমাত্র ফাইলগুলির তালিকা পাওয়ার জন্য একটি লাইন সমাধান (কোনও উপ-ডিরেক্টরি নেই):

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

বা পরম পথের নাম:

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

7
আপনি যদি ইতিমধ্যে থাকেন তবে কেবলমাত্র একটি ওয়ানলাইনার import osglob()আমার চেয়ে কম সংক্ষিপ্ত বলে মনে হচ্ছে ।
আর্টঅফ ওয়ারফেয়ার

4
গ্লোব সমস্যা হ'ল 'কিছু.সামিলিং' নামে একটি ফোল্ডার গ্লোব দ্বারা ফিরে আসবে ('/ হোম / অ্যাডাম /*.*')
রেমি

6
ওএস এক্স-তে, একটি বান্ডিল নামে পরিচিত। এটি একটি ডিরেক্টরি যা সাধারণত একটি ফাইল হিসাবে বিবেচিত হওয়া উচিত (.tter এর মতো)। আপনি কি তাদের ফাইল বা ডিরেক্টরি হিসাবে বিবেচনা করতে চান? ব্যবহার করে glob()এটি একটি ফাইল হিসাবে বিবেচিত হবে। আপনার পদ্ধতি এটি একটি ডিরেক্টরি হিসাবে বিবেচনা করবে।
আর্টঅফ ওয়ারফেয়ার

132

একটি ডিরেক্টরি এবং এর সমস্ত সাব-ডিরেক্টরি থেকে পুরো ফাইল পাথ প্রাপ্ত

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

  • উপরের ফাংশনে আমি যে পথটি দিয়েছি সেটিতে 3 টি ফাইল রয়েছে - সেগুলির মধ্যে দুটি মূল ডিরেক্টরিতে এবং অন্যটিতে একটি "সাবউোল্ডার" called আপনি এখন এই জাতীয় জিনিসগুলি করতে পারেন:
  • print full_file_paths যা তালিকাটি মুদ্রণ করবে:

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

যদি আপনি চান, আপনি বিষয়বস্তুগুলি খুলতে এবং পড়তে বা নীচের কোডের মতো ".ড্যাট" এক্সটেনশানযুক্ত ফাইলগুলিতে ফোকাস করতে পারেন:

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

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


এটি এক এবং একমাত্র উত্তর।
এয়ারলাইনার

78

সংস্করণ 3.4 যেহেতু এর জন্য বিল্টিন পুনরাবৃত্তি রয়েছে যা এর চেয়ে অনেক বেশি দক্ষ os.listdir():

pathlib: সংস্করণে নতুন 3.4।

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

পিইপি 428 অনুসারে , pathlibলাইব্রেরির লক্ষ্য হ'ল ফাইল সিস্টেমের পাথগুলি পরিচালনা করার জন্য ক্লাসগুলির একটি সাধারণ শ্রেণিবিন্যাস সরবরাহ করা এবং সাধারণ ক্রিয়াকলাপ ব্যবহারকারীরা তাদের উপর যা করেন।

os.scandir(): 3.5 সংস্করণে নতুন।

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

নোট করুন যে সংস্করণ 3.5 এর পরিবর্তে os.walk()ব্যবহার os.scandir()করে os.listdir()এবং পিইপি 471 অনুসারে এর গতি 2-20 গুণ বেড়েছে ।

আমি নীচে শ্যাডোর্যাঙ্গারের মন্তব্য পড়ারও পরামর্শ দিই।


1
ধন্যবাদ! আমি মনে করি এটি সরাসরি সমাধান না এ list। যদি পছন্দ হয় তবে p.nameপ্রথম pবিকল্পটির পরিবর্তে ব্যবহার করতে পার ।
jeromej

1
স্বাগত! আমি pathlib.Path()উদাহরণগুলি উত্সাহিত করতে পছন্দ করব কারণ তাদের অনেকগুলি দরকারী পদ্ধতি রয়েছে যা আমি বর্জ্য নষ্ট করতে চাই না। আপনি str(p)তাদের কাছে পথের নামের জন্য কল করতে পারেন ।
সিজিবার্থ এডাম

6
নোট: os.scandirসমাধান অধিক কার্যকরী হতে যাচ্ছে os.listdirএকটি সঙ্গে os.path.is_fileএমনকি যদি আপনি একটি, চেক বা মত listকারণ, (তাই তুমি অলস পুনরাবৃত্তির থেকে উপকৃত করবেন না) os.scandirব্যবহারসমূহ ওএস প্রদান API গুলি আপনাকে দিতে is_fileবিনামূল্যে জন্য তথ্য যেমন iterates , এর ডিস্কে কোন প্রতি-ফাইল রাউন্ড ট্রিপ statসব তাদের (উইন্ডোজ উপর, DirEntryগুলি আপনি সম্পূর্ণ পেতে statবিনামূল্যে জন্য তথ্য, * কিসসু সিস্টেমে এটি প্রয়োজন statতথ্য পরলোক জন্য is_file, is_dirইত্যাদি, কিন্তু DirEntryপ্রথম ক্যাশে statসুবিধার জন্য)।
শ্যাডোর্যাঞ্জার

1
আপনি entry.nameকেবল ফাইলের নাম entry.pathপেতে বা এটির পুরো পথ পেতে ব্যবহার করতে পারেন । সমস্ত জায়গায় আর os.path.join () নেই।
ব্যবহারকারী 136036

56

প্রাথমিক নোট

  • যদিও প্রশ্ন পাঠ্যে ফাইল এবং ডিরেক্টরি পদগুলির মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে , কেউ কেউ যুক্তি দিতে পারে যে ডিরেক্টরিগুলি আসলে বিশেষ ফাইল
  • বিবৃতি: " ডিরেক্টরিতে সমস্ত ফাইল " দুটি উপায়ে ব্যাখ্যা করা যায়:
    1. সমস্ত প্রত্যক্ষ (বা স্তর 1) কেবল বংশধর
    2. পুরো ডিরেক্টরি গাছের সমস্ত বংশধর (উপ-ডিরেক্টরিতে অন্তর্ভুক্ত)
  • যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল, আমি কল্পনা করেছিলাম পাইথন 2 , এলটিএস সংস্করণ ছিল, তবে কোড নমুনাগুলি পাইথন 3 ( .5 ) দ্বারা চালিত হবে (আমি এগুলিকে পাইথন 2 হিসাবে যথাসম্ভব আনুগত্যযুক্ত রাখব ; এছাড়াও, যে কোনও কোডের অন্তর্ভুক্ত) পাইথন আমি পোস্ট করতে যাচ্ছি, v3.5.4 থেকে - অন্যথায় নির্দিষ্ট না করা পর্যন্ত)। প্রশ্নটির অন্য কীওয়ার্ডের সাথে এর পরিণতি রয়েছে: " এগুলিকে একটি তালিকায় যুক্ত করুন ":

    • পাইথন পূর্বের ২.২ সংস্করণগুলিতে সিকোয়েন্সগুলি (পুনরাবৃত্ত) বেশিরভাগ তালিকার দ্বারা উপস্থাপিত হয়েছিল (টিপলস, সেট, ...)
    • ইন পাইথন 2.2 , ধারণা জেনারেটর ( [Python.Wiki]: জেনারেটর ) - সৌজন্যে [পাইথন 3]: ফলন বিবৃতি ) - চালু করা হয়। সময় কেটে যাওয়ার সাথে সাথে জেনারেটরের অংশগুলি ফাংশনগুলির জন্য উপস্থিত হতে শুরু করে যা তালিকাতে ফিরে আসে / কাজ করে
    • ইন পাইথন 3 জেনারেটর ডিফল্ট আচরণ
    • নিশ্চিত নয় যে তালিকাটি ফেরত দেওয়া এখনও বাধ্যতামূলক (বা একটি জেনারেটরও এটি করবে) তবে তালিকাটি নির্মাণকারীকে একটি জেনারেটর দেওয়ার পরে এটি একটি তালিকা তৈরি করবে (এবং এটি গ্রাসও করবে)। নীচের উদাহরণে [পাইথন 3] এর পার্থক্যের চিত্রিত হয়েছে : মানচিত্র ( ফাংশন, পুনরাবৃত্ত, ... )
    >>> import sys
    >>> sys.version
    '2.7.10 (default, Mar  8 2016, 15:02:46) [MSC v.1600 64 bit (AMD64)]'
    >>> m = map(lambda x: x, [1, 2, 3])  # Just a dummy lambda function
    >>> m, type(m)
    ([1, 2, 3], <type 'list'>)
    >>> len(m)
    3


    >>> import sys
    >>> sys.version
    '3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)]'
    >>> m = map(lambda x: x, [1, 2, 3])
    >>> m, type(m)
    (<map object at 0x000001B4257342B0>, <class 'map'>)
    >>> len(m)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: object of type 'map' has no len()
    >>> lm0 = list(m)  # Build a list from the generator
    >>> lm0, type(lm0)
    ([1, 2, 3], <class 'list'>)
    >>>
    >>> lm1 = list(m)  # Build a list from the same generator
    >>> lm1, type(lm1)  # Empty list now - generator already consumed
    ([], <class 'list'>)
  • উদাহরণ একটি ডিরেক্টরি নামক ভিত্তি করে করা হবে root_dir নিম্নলিখিত গঠন (এই উদাহরণে জন্য উইন , কিন্তু আমি একই গাছ ব্যবহার করছি Lnx পাশাপাশি):

    E:\Work\Dev\StackOverflow\q003207219>tree /f "root_dir"
    Folder PATH listing for volume Work
    Volume serial number is 00000029 3655:6FED
    E:\WORK\DEV\STACKOVERFLOW\Q003207219\ROOT_DIR
    ¦   file0
    ¦   file1
    ¦
    +---dir0
    ¦   +---dir00
    ¦   ¦   ¦   file000
    ¦   ¦   ¦
    ¦   ¦   +---dir000
    ¦   ¦           file0000
    ¦   ¦
    ¦   +---dir01
    ¦   ¦       file010
    ¦   ¦       file011
    ¦   ¦
    ¦   +---dir02
    ¦       +---dir020
    ¦           +---dir0200
    +---dir1
    ¦       file10
    ¦       file11
    ¦       file12
    ¦
    +---dir2
    ¦   ¦   file20
    ¦   ¦
    ¦   +---dir20
    ¦           file200
    ¦
    +---dir3


সলিউশন

প্রোগ্রাম্যাটিক পদ্ধতি:

  1. [পাইথন 3]: ওএস। তালিকাভুক্ত ( পথ = '।' )

    ডিরেক্টরি অনুসারে ডিরেক্টরিতে প্রবেশের নাম সম্বলিত একটি তালিকা ফেরত দিন। তালিকাটি নির্বিচারে ক্রমে থাকে এবং এতে বিশেষ এন্ট্রি '.'এবং '..'...


    >>> import os
    >>> root_dir = "root_dir"  # Path relative to current dir (os.getcwd())
    >>>
    >>> os.listdir(root_dir)  # List all the items in root_dir
    ['dir0', 'dir1', 'dir2', 'dir3', 'file0', 'file1']
    >>>
    >>> [item for item in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, item))]  # Filter items and only keep files (strip out directories)
    ['file0', 'file1']

    আরও বিস্তারিত উদাহরণ ( কোড_os_listdir.py ):

    import os
    from pprint import pformat
    
    
    def _get_dir_content(path, include_folders, recursive):
        entries = os.listdir(path)
        for entry in entries:
            entry_with_path = os.path.join(path, entry)
            if os.path.isdir(entry_with_path):
                if include_folders:
                    yield entry_with_path
                if recursive:
                    for sub_entry in _get_dir_content(entry_with_path, include_folders, recursive):
                        yield sub_entry
            else:
                yield entry_with_path
    
    
    def get_dir_content(path, include_folders=True, recursive=True, prepend_folder_name=True):
        path_len = len(path) + len(os.path.sep)
        for item in _get_dir_content(path, include_folders, recursive):
            yield item if prepend_folder_name else item[path_len:]
    
    
    def _get_dir_content_old(path, include_folders, recursive):
        entries = os.listdir(path)
        ret = list()
        for entry in entries:
            entry_with_path = os.path.join(path, entry)
            if os.path.isdir(entry_with_path):
                if include_folders:
                    ret.append(entry_with_path)
                if recursive:
                    ret.extend(_get_dir_content_old(entry_with_path, include_folders, recursive))
            else:
                ret.append(entry_with_path)
        return ret
    
    
    def get_dir_content_old(path, include_folders=True, recursive=True, prepend_folder_name=True):
        path_len = len(path) + len(os.path.sep)
        return [item if prepend_folder_name else item[path_len:] for item in _get_dir_content_old(path, include_folders, recursive)]
    
    
    def main():
        root_dir = "root_dir"
        ret0 = get_dir_content(root_dir, include_folders=True, recursive=True, prepend_folder_name=True)
        lret0 = list(ret0)
        print(ret0, len(lret0), pformat(lret0))
        ret1 = get_dir_content_old(root_dir, include_folders=False, recursive=True, prepend_folder_name=False)
        print(len(ret1), pformat(ret1))
    
    
    if __name__ == "__main__":
        main()

    দ্রষ্টব্য :

    • দুটি বাস্তবায়ন রয়েছে:
      • এমন একটি যা জেনারেটর ব্যবহার করে (অবশ্যই এখানে এটি অকেজো বলে মনে হচ্ছে, যেহেতু আমি অবিলম্বে ফলাফলকে একটি তালিকায় রূপান্তর করি)
      • ক্লাসিক এক (ফাংশন নামগুলি শেষ হয়ে যাবে )
    • পুনরাবৃত্তি ব্যবহৃত হয় (উপ-ডিরেক্টরিতে যেতে)
    • প্রতিটি বাস্তবায়নের জন্য দুটি ফাংশন রয়েছে:
      • একটি যা আন্ডারস্কোর ( _ ) দিয়ে শুরু হয় : "ব্যক্তিগত" (সরাসরি বলা উচিত নয়) - যা সমস্ত কাজ করে
      • সর্বজনীন এক (আগেরটির চেয়ে বেশি মোড়ক): এটি কেবল ফিরে আসা এন্ট্রি থেকে প্রাথমিক পথ (যদি প্রয়োজন হয়) বন্ধ করে দেয়। এটি একটি কুরুচিপূর্ণ বাস্তবায়ন, তবে আমি একমাত্র ধারণা যে আমি এই সময়ে আসতে পারে
    • পারফরম্যান্সের ক্ষেত্রে, জেনারেটরগুলি সাধারণত কিছুটা দ্রুত হয় (উভয়ই সৃষ্টি এবং পুনরাবৃত্তির বার বিবেচনা করে ) তবে আমি তাদের পুনরাবৃত্ত ফাংশনে পরীক্ষা করিনি, এবং অভ্যন্তরীণ জেনারেটরগুলির মাধ্যমে আমি ফাংশনের অভ্যন্তরে পুনরাবৃত্তি করছি - জানি না কী পারফরম্যান্স বন্ধুত্বপূর্ণ যে
    • বিভিন্ন ফলাফল পেতে যুক্তি দিয়ে খেলুন


    আউটপুট :

    (py35x64_test) E:\Work\Dev\StackOverflow\q003207219>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" "code_os_listdir.py"
    <generator object get_dir_content at 0x000001BDDBB3DF10> 22 ['root_dir\\dir0',
     'root_dir\\dir0\\dir00',
     'root_dir\\dir0\\dir00\\dir000',
     'root_dir\\dir0\\dir00\\dir000\\file0000',
     'root_dir\\dir0\\dir00\\file000',
     'root_dir\\dir0\\dir01',
     'root_dir\\dir0\\dir01\\file010',
     'root_dir\\dir0\\dir01\\file011',
     'root_dir\\dir0\\dir02',
     'root_dir\\dir0\\dir02\\dir020',
     'root_dir\\dir0\\dir02\\dir020\\dir0200',
     'root_dir\\dir1',
     'root_dir\\dir1\\file10',
     'root_dir\\dir1\\file11',
     'root_dir\\dir1\\file12',
     'root_dir\\dir2',
     'root_dir\\dir2\\dir20',
     'root_dir\\dir2\\dir20\\file200',
     'root_dir\\dir2\\file20',
     'root_dir\\dir3',
     'root_dir\\file0',
     'root_dir\\file1']
    11 ['dir0\\dir00\\dir000\\file0000',
     'dir0\\dir00\\file000',
     'dir0\\dir01\\file010',
     'dir0\\dir01\\file011',
     'dir1\\file10',
     'dir1\\file11',
     'dir1\\file12',
     'dir2\\dir20\\file200',
     'dir2\\file20',
     'file0',
     'file1']


  1. [পাইথন 3]: ওএস। স্ক্যান্ডির ( পথ = '।' ) ( পাইথন ৩.৫ +, ব্যাকপোর্ট: [পিপিআইআই]: স্ক্যান্ডির )

    পথ দ্বারা প্রদত্ত ডিরেক্টরিতে ডিরেক্টরিতে প্রবেশের সাথে সম্পর্কিত os.DirEntry অবজেক্টগুলির একটি পুনরাবৃত্তি ফেরান । এন্ট্রি নির্বিচারে অনুক্রমে পাওয়া হয়, এবং বিশেষ এন্ট্রি এবং অন্তর্ভুক্ত হয় না।'.''..'

    ব্যবহার scandir () এর পরিবর্তে listdir () উল্লেখযোগ্যভাবে, কোড যে ফাইল টাইপ বা ফাইল অ্যাট্রিবিউট তথ্যের প্রয়োজন কর্মক্ষমতা বৃদ্ধি করতে পারেন কারণ os.DirEntry বস্তু এই তথ্য প্রকাশ হলে ডিরেক্টরির স্ক্যান যদি অপারেটিং সিস্টেম এটি প্রদান করে। সকল os.DirEntry পদ্ধতি একটি সিস্টেম কল, কিন্তু সঞ্চালন করা সম্ভব is_dir () এবং is_file () সাধারণত সিম্বলিক লিঙ্কের জন্য একটি সিস্টেম কল প্রয়োজন; os.DirEntry.stat () সর্বদা ইউনিক্সে একটি সিস্টেম কল প্রয়োজন তবে উইন্ডোজে প্রতীকী লিঙ্কগুলির জন্য কেবল একটির প্রয়োজন।


    >>> import os
    >>> root_dir = os.path.join(".", "root_dir")  # Explicitly prepending current directory
    >>> root_dir
    '.\\root_dir'
    >>>
    >>> scandir_iterator = os.scandir(root_dir)
    >>> scandir_iterator
    <nt.ScandirIterator object at 0x00000268CF4BC140>
    >>> [item.path for item in scandir_iterator]
    ['.\\root_dir\\dir0', '.\\root_dir\\dir1', '.\\root_dir\\dir2', '.\\root_dir\\dir3', '.\\root_dir\\file0', '.\\root_dir\\file1']
    >>>
    >>> [item.path for item in scandir_iterator]  # Will yield an empty list as it was consumed by previous iteration (automatically performed by the list comprehension)
    []
    >>>
    >>> scandir_iterator = os.scandir(root_dir)  # Reinitialize the generator
    >>> for item in scandir_iterator :
    ...     if os.path.isfile(item.path):
    ...             print(item.name)
    ...
    file0
    file1

    দ্রষ্টব্য :

    • এটি অনুরূপ os.listdir
    • তবে এটি আরও নমনীয় (এবং আরও কার্যকারিতা সরবরাহ করে), আরও পাইথন আইসি (এবং কিছু ক্ষেত্রে দ্রুত)


  1. [পাইথন 3]: ওএস। হাঁটুন ( শীর্ষ, টপডাউন = সত্য, অনারার = কিছুই নেই, ফলোলিংক = মিথ্যা )

    উপরের দিক থেকে নীচে বা নীচে উপরে গাছটি হাঁটার মাধ্যমে ডিরেক্টরি ট্রিতে ফাইলের নাম তৈরি করুন। গাছ ডিরেক্টরিতে মূলী প্রতিটি ডিরেক্টরির জন্য শীর্ষ (তত্সহ শীর্ষ নিজেই), এটি একটি 3-tuple উৎপাদ ( dirpath, dirnames, filenames)।


    >>> import os
    >>> root_dir = os.path.join(os.getcwd(), "root_dir")  # Specify the full path
    >>> root_dir
    'E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir'
    >>>
    >>> walk_generator = os.walk(root_dir)
    >>> root_dir_entry = next(walk_generator)  # First entry corresponds to the root dir (passed as an argument)
    >>> root_dir_entry
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir', ['dir0', 'dir1', 'dir2', 'dir3'], ['file0', 'file1'])
    >>>
    >>> root_dir_entry[1] + root_dir_entry[2]  # Display dirs and files (direct descendants) in a single list
    ['dir0', 'dir1', 'dir2', 'dir3', 'file0', 'file1']
    >>>
    >>> [os.path.join(root_dir_entry[0], item) for item in root_dir_entry[1] + root_dir_entry[2]]  # Display all the entries in the previous list by their full path
    ['E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0', 'E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir1', 'E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir2', 'E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir3', 'E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\file0', 'E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\file1']
    >>>
    >>> for entry in walk_generator:  # Display the rest of the elements (corresponding to every subdir)
    ...     print(entry)
    ...
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0', ['dir00', 'dir01', 'dir02'], [])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0\\dir00', ['dir000'], ['file000'])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0\\dir00\\dir000', [], ['file0000'])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0\\dir01', [], ['file010', 'file011'])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0\\dir02', ['dir020'], [])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0\\dir02\\dir020', ['dir0200'], [])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir0\\dir02\\dir020\\dir0200', [], [])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir1', [], ['file10', 'file11', 'file12'])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir2', ['dir20'], ['file20'])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir2\\dir20', [], ['file200'])
    ('E:\\Work\\Dev\\StackOverflow\\q003207219\\root_dir\\dir3', [], [])

    দ্রষ্টব্য :

    • দৃশ্যের অধীনে, এটি os.scandir( os.listdirপুরানো সংস্করণে) ব্যবহার করে
    • এটি সাবফোল্ডারগুলিতে পুনরাবৃত্তি করে ভারী উত্তোলন করে


  1. [পাইথন 3]: গ্লোব। উল্লিখিত glob ( পথনাম, *, রিকার্সিভ = মিথ্যা ) ( [পাইথন 3]। উল্লিখিত glob iglob ( পথনাম, *, রিকার্সিভ = মিথ্যা ) )

    পথের নামের সাথে মেলে এমন সম্ভাব্য-খালি তালিকাটি ফেরান , যা অবশ্যই একটি পাথের বিশদ যুক্ত স্ট্রিং। পথের নামটি পরম (যেমন /usr/src/Python-1.5/Makefile) বা আপেক্ষিক (মতো ../../Tools/*/*.gif) হতে পারে এবং এতে শেল-স্টাইলের ওয়াইল্ডকার্ড থাকতে পারে। ভাঙ্গা symlinks ফলাফল (শেল হিসাবে) অন্তর্ভুক্ত করা হয়।
    ...
    সংস্করণ 3.5 তে পরিবর্তিত হয়েছে : " **" ব্যবহার করে পুনরাবৃত্ত গ্লোবগুলির জন্য সমর্থন ।


    >>> import glob, os
    >>> wildcard_pattern = "*"
    >>> root_dir = os.path.join("root_dir", wildcard_pattern)  # Match every file/dir name
    >>> root_dir
    'root_dir\\*'
    >>>
    >>> glob_list = glob.glob(root_dir)
    >>> glob_list
    ['root_dir\\dir0', 'root_dir\\dir1', 'root_dir\\dir2', 'root_dir\\dir3', 'root_dir\\file0', 'root_dir\\file1']
    >>>
    >>> [item.replace("root_dir" + os.path.sep, "") for item in glob_list]  # Strip the dir name and the path separator from begining
    ['dir0', 'dir1', 'dir2', 'dir3', 'file0', 'file1']
    >>>
    >>> for entry in glob.iglob(root_dir + "*", recursive=True):
    ...     print(entry)
    ...
    root_dir\
    root_dir\dir0
    root_dir\dir0\dir00
    root_dir\dir0\dir00\dir000
    root_dir\dir0\dir00\dir000\file0000
    root_dir\dir0\dir00\file000
    root_dir\dir0\dir01
    root_dir\dir0\dir01\file010
    root_dir\dir0\dir01\file011
    root_dir\dir0\dir02
    root_dir\dir0\dir02\dir020
    root_dir\dir0\dir02\dir020\dir0200
    root_dir\dir1
    root_dir\dir1\file10
    root_dir\dir1\file11
    root_dir\dir1\file12
    root_dir\dir2
    root_dir\dir2\dir20
    root_dir\dir2\dir20\file200
    root_dir\dir2\file20
    root_dir\dir3
    root_dir\file0
    root_dir\file1

    দ্রষ্টব্য :

    • ব্যবহারসমূহ os.listdir
    • বড় গাছগুলির জন্য (বিশেষত যদি পুনরাবৃত্তি চালু থাকে), ইগলব পছন্দ করা হয়
    • নামের ভিত্তিতে উন্নত ফিল্টারিংয়ের অনুমতি দেয় (ওয়াইল্ডকার্ডের কারণে)


  1. [পাইথন 3]: ক্লাসের পথচালক। পাথ ( * পাথসেসমেন্টস ) ( পাইথন ৩.৪ + +, ব্যাকপোর্ট: [পাইপিআই]: প্যাথলিব ২ )

    >>> import pathlib
    >>> root_dir = "root_dir"
    >>> root_dir_instance = pathlib.Path(root_dir)
    >>> root_dir_instance
    WindowsPath('root_dir')
    >>> root_dir_instance.name
    'root_dir'
    >>> root_dir_instance.is_dir()
    True
    >>>
    >>> [item.name for item in root_dir_instance.glob("*")]  # Wildcard searching for all direct descendants
    ['dir0', 'dir1', 'dir2', 'dir3', 'file0', 'file1']
    >>>
    >>> [os.path.join(item.parent.name, item.name) for item in root_dir_instance.glob("*") if not item.is_dir()]  # Display paths (including parent) for files only
    ['root_dir\\file0', 'root_dir\\file1']

    দ্রষ্টব্য :

    • এটি আমাদের লক্ষ্য অর্জনের একটি উপায়
    • এটি পথ পরিচালনা করার ওওপি স্টাইল
    • কার্যকারিতা প্রচুর প্রস্তাব


  1. [পাইথন 2]: dircache.listdir (পথ) ( পাইথন 2 শুধুমাত্র)


    def listdir(path):
        """List directory contents, using cache."""
        try:
            cached_mtime, list = cache[path]
            del cache[path]
        except KeyError:
            cached_mtime, list = -1, []
        mtime = os.stat(path).st_mtime
        if mtime != cached_mtime:
            list = os.listdir(path)
            list.sort()
        cache[path] = mtime, list
        return list


  1. [man7]: OPENDIR (3) / [man7]: readdir (3) / [man7]: CLOSEDIR (3) মাধ্যমে [পাইথন 3]: ctypes - পাইথন জন্য একটি বিদেশী ফাংশন গ্রন্থাগার ( POSIX নির্দিষ্ট)

    সিটিপস পাইথনের বিদেশী ফাংশন লাইব্রেরি। এটি সি সামঞ্জস্যপূর্ণ ডেটা প্রকার সরবরাহ করে এবং ডিএলএল বা ভাগ করা লাইব্রেরিতে কলিং ফাংশনগুলিকে মঞ্জুরি দেয়। খাঁটি পাইথনে এই লাইব্রেরিগুলি মোড়ানোর জন্য এটি ব্যবহার করা যেতে পারে।

    কোড_ctypes.py :

    #!/usr/bin/env python3
    
    import sys
    from ctypes import Structure, \
        c_ulonglong, c_longlong, c_ushort, c_ubyte, c_char, c_int, \
        CDLL, POINTER, \
        create_string_buffer, get_errno, set_errno, cast
    
    
    DT_DIR = 4
    DT_REG = 8
    
    char256 = c_char * 256
    
    
    class LinuxDirent64(Structure):
        _fields_ = [
            ("d_ino", c_ulonglong),
            ("d_off", c_longlong),
            ("d_reclen", c_ushort),
            ("d_type", c_ubyte),
            ("d_name", char256),
        ]
    
    LinuxDirent64Ptr = POINTER(LinuxDirent64)
    
    libc_dll = this_process = CDLL(None, use_errno=True)
    # ALWAYS set argtypes and restype for functions, otherwise it's UB!!!
    opendir = libc_dll.opendir
    readdir = libc_dll.readdir
    closedir = libc_dll.closedir
    
    
    def get_dir_content(path):
        ret = [path, list(), list()]
        dir_stream = opendir(create_string_buffer(path.encode()))
        if (dir_stream == 0):
            print("opendir returned NULL (errno: {:d})".format(get_errno()))
            return ret
        set_errno(0)
        dirent_addr = readdir(dir_stream)
        while dirent_addr:
            dirent_ptr = cast(dirent_addr, LinuxDirent64Ptr)
            dirent = dirent_ptr.contents
            name = dirent.d_name.decode()
            if dirent.d_type & DT_DIR:
                if name not in (".", ".."):
                    ret[1].append(name)
            elif dirent.d_type & DT_REG:
                ret[2].append(name)
            dirent_addr = readdir(dir_stream)
        if get_errno():
            print("readdir returned NULL (errno: {:d})".format(get_errno()))
        closedir(dir_stream)
        return ret
    
    
    def main():
        print("{:s} on {:s}\n".format(sys.version, sys.platform))
        root_dir = "root_dir"
        entries = get_dir_content(root_dir)
        print(entries)
    
    
    if __name__ == "__main__":
        main()

    দ্রষ্টব্য :

    • এটা তোলে থেকে তিনটি ফাংশন লোড libc (বর্তমান প্রক্রিয়ায় লোড) এবং তাদের আহ্বান (আরো বিস্তারিত জানার জন্য পরীক্ষা [তাই]: কীভাবে আমি চেক কিনা একটি ফাইল ব্যতিক্রম ছাড়া বিদ্যমান (@ CristiFati এর উত্তর) - আইটেম থেকে গত নোট # 4। )। এটি এই পদ্ধতিরটিকে পাইথন / সি প্রান্তের খুব কাছাকাছি রাখবে
    • LinuxDirent64 হয় ctypes প্রতিনিধিত্ব struct হয় dirent64 থেকে [man7]: dirent.h (0P) (তাই হয় DT_ আমার মেশিন থেকে ধ্রুবক): Ubtu 16 x64 ( 4.10.0-40-জেনেরিক এবং libc6-দেব: AMD64 )। অন্যান্য স্বাদ / সংস্করণগুলিতে স্ট্রাক্ট সংজ্ঞাটি পৃথক হতে পারে এবং যদি তাই হয় তবে সিটিপস এলিফটি আপডেট করা উচিত, অন্যথায় এটি অপরিবর্তিত আচরণ উপার্জন করবে
    • এটি os.walkএর বিন্যাসে ডেটা ফেরত দেয় । আমি এটিকে পুনরাবৃত্ত করার জন্য বিরক্ত করিনি, তবে বিদ্যমান কোড থেকে শুরু করে, এটি মোটামুটি তুচ্ছ কাজ হবে
    • উইনের উপরও সবকিছু করণীয় , তথ্য (গ্রন্থাগার, ফাংশন, স্ট্রাক্টস, ধ্রুবক, ...) পার্থক্য করে


    আউটপুট :

    [cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q003207219]> ./code_ctypes.py
    3.5.2 (default, Nov 12 2018, 13:43:14)
    [GCC 5.4.0 20160609] on linux
    
    ['root_dir', ['dir2', 'dir1', 'dir3', 'dir0'], ['file1', 'file0']]


  1. [অ্যাক্টিভ স্টেট। ডকস]: win32file.FindFilesW ( উইন নির্দিষ্ট)

    উইন্ডোজ ইউনিকোড এপিআই ব্যবহার করে মেলানো ফাইলের নামের একটি তালিকা উদ্ধার করে। API FindFirstFileW / FindNextFileW / নিকট ফাংশন সন্ধানের একটি ইন্টারফেস।


    >>> import os, win32file, win32con
    >>> root_dir = "root_dir"
    >>> wildcard = "*"
    >>> root_dir_wildcard = os.path.join(root_dir, wildcard)
    >>> entry_list = win32file.FindFilesW(root_dir_wildcard)
    >>> len(entry_list)  # Don't display the whole content as it's too long
    8
    >>> [entry[-2] for entry in entry_list]  # Only display the entry names
    ['.', '..', 'dir0', 'dir1', 'dir2', 'dir3', 'file0', 'file1']
    >>>
    >>> [entry[-2] for entry in entry_list if entry[0] & win32con.FILE_ATTRIBUTE_DIRECTORY and entry[-2] not in (".", "..")]  # Filter entries and only display dir names (except self and parent)
    ['dir0', 'dir1', 'dir2', 'dir3']
    >>>
    >>> [os.path.join(root_dir, entry[-2]) for entry in entry_list if entry[0] & (win32con.FILE_ATTRIBUTE_NORMAL | win32con.FILE_ATTRIBUTE_ARCHIVE)]  # Only display file "full" names
    ['root_dir\\file0', 'root_dir\\file1']

    দ্রষ্টব্য :


  1. কিছু (অন্যান্য) তৃতীয় পক্ষের প্যাকেজ ইনস্টল করুন যা কৌশলটি করে
    • সম্ভবত, উপরের একটি (বা আরও বেশি) এর উপর নির্ভর করবে (সম্ভবত সামান্য কাস্টমাইজেশন সহ)


দ্রষ্টব্য :

  • কোডটি বহনযোগ্য হতে বোঝাচ্ছে (নির্দিষ্ট জায়গাকে লক্ষ্য করে এমন স্থানগুলি বাদ দিয়ে - যা চিহ্নিত রয়েছে) বা ক্রস:

    • প্ল্যাটফর্ম ( নিক্স , উইন ,)
    • পাইথন সংস্করণ (2, 3,)
  • উপরের রূপগুলি জুড়ে একাধিক পাথ শৈলী (পরমাত্মীয়, আত্মীয়) ব্যবহৃত হয়েছিল, ব্যবহৃত "সরঞ্জাম" এই দিকটিতে নমনীয় তা এই সত্যটি চিত্রিত করার জন্য

  • os.listdirএবং os.scandirব্যবহার opendir / দ্বারা readdir / closedir ( [MS.Docs]: FindFirstFileW ফাংশন / [MS.Docs]: FindNextFileW ফাংশন / [MS.Docs]: FindClose ফাংশন ) (মাধ্যমে [GitHub]: পাইথন / cpython - (মাস্টার) cpython / মডিউল / পিক্সেমমডিউল.সি )

  • win32file.FindFilesWসেগুলি ( উইন সুনির্দিষ্ট) ফাংশনগুলিও ব্যবহার করে ( [গিটহাবের মাধ্যমে ]: মোহামন্ড / পাইউইন 32 - (মাস্টার) পাইউইন 32 / উইন 32 / এসসিআর / উইন 32file.i )

  • _get_dir_content (পয়েন্ট # 1 থেকে ) এর মধ্যে যে কোনও একটি ব্যবহার করে প্রয়োগ করা যেতে পারে ( কারওর জন্য আরও বেশি কাজের প্রয়োজন হবে এবং কিছুটা কম)

    • কিছু উন্নত ফিল্টারিং (ঠিক ফাইলের পরিবর্তে বনাম Dir) সম্পন্ন করা যেতে পারে: যেমন include_folders যুক্তি প্রতিস্থাপিত হতে পারে অন্য এক দ্বারা (যেমন filter_func ) যা একটি ফাংশন যে একটি আর্গুমেন্ট হিসাবে একটি পাথ লাগে হবে: filter_func=lambda x: True(এই আউট স্ট্রিপ নেই যেকোনো কিছু) এবং _get_dir_ কনটেন্টের অভ্যন্তরের মতো কিছু: if not filter_func(entry_with_path): continue(যদি ফাংশনটি একটি প্রবেশের ক্ষেত্রে ব্যর্থ হয় তবে এটি এড়ানো হবে), তবে কোডটি যত জটিল হবে তত বেশি সময় লাগবে
  • নোটা বেন! যেহেতু পুনরাবৃত্তি ব্যবহৃত হয়, তাই আমি অবশ্যই উল্লেখ করতে পারি যে আমি আমার ল্যাপটপে কিছু পরীক্ষা করেছি ( উইন 10 x64 ), এই সমস্যার সাথে পুরোপুরি সম্পর্কিত নয়, এবং যখন পুনরাবৃত্তি স্তরটি কোথাও (990 .. 1000) পরিসরের মানগুলিতে পৌঁছেছিল ( পুনরাবৃত্তি - 1000 (ডিফল্ট)), আমি স্ট্যাক ওভারফ্লো পেয়েছি :)। ডিরেক্টরি গাছ যদি সেই সীমা অতিক্রম করে (আমি কোনও এফএস বিশেষজ্ঞ নই , সুতরাং এটি সম্ভব কিনা তাও আমি জানি না), সমস্যা হতে পারে।
    আমার এও উল্লেখ করতে হবে যে আমি পুনরাবৃত্তিমূলকতা বাড়ানোর চেষ্টা করিনি কারণ এ অঞ্চলে আমার কোনও অভিজ্ঞতা নেই ( ওএস- তে স্ট্যাক বাড়ানোর আগে আমি কতটা বাড়িয়ে তুলতে পারি)স্তর), তবে তত্ত্বের ক্ষেত্রে সর্বদা ব্যর্থতার সম্ভাবনা থাকবে, যদি ডিয়ার গভীরতা সর্বাধিক সম্ভাব্য পুনরাবৃত্তি (সেই মেশিনে) এর চেয়ে বড় হয়

  • কোড নমুনা কেবল বিক্ষোভমূলক উদ্দেশ্যে। এর অর্থ হ'ল আমি ত্রুটি পরিচালনার বিষয়টি অ্যাকাউন্টে নিই না (আমি মনে করি না / চেষ্টা করেছি / বাদে / অন্যথায় / অবশেষে অবরুদ্ধ আছে), তাই কোডটি শক্ত নয় (কারণটি: এটি যতটা সম্ভব সহজ এবং সংক্ষিপ্ত রাখা) )। জন্য উৎপাদন , ত্রুটি পরিচালনা পাশাপাশি যুক্ত করা উচিত

অন্যান্য পদ্ধতি:

  1. পাইথনকে কেবল একটি মোড়ক হিসাবে ব্যবহার করুন

    • সবকিছু অন্য প্রযুক্তি ব্যবহার করে করা হয়
    • পাইথন থেকে সেই প্রযুক্তিটি চাওয়া হয়েছিল
    • আমি জানি যে সর্বাধিক বিখ্যাত গন্ধটি আমি সিস্টেম অ্যাডমিনিস্ট্রেটর পদ্ধতির কলকে বলে থাকি :

      • ব্যবহারের পাইথন (বা যে বিষয়টি জন্য কোনো প্রোগ্রামিং ভাষা) অর্ডার নির্বাহ করার জন্য শেল কমান্ড (এবং তাদের আউটপুট পার্স)
      • কেউ কেউ এটি একটি ঝরঝরে হ্যাক হিসাবে বিবেচনা করে
      • আমি আরো একটি খোঁড়া কার্যসংক্রান্ত (যেমন বিবেচনা gainarie ,) যেমন SE প্রতি কর্ম থেকে সঞ্চালিত হয় শেল ( cmd সাথে কিছু নেই এই ক্ষেত্রে), এবং এইভাবে পাইথন
      • ফিল্টারিং ( grep/ findstr) বা আউটপুট ফর্ম্যাটিং উভয় পক্ষেই করা যেতে পারে, তবে আমি এটিতে জোর দিচ্ছি না। এছাড়াও, আমি ইচ্ছাকৃত os.systemপরিবর্তে এর ব্যবহার subprocess.Popen
      (py35x64_test) E:\Work\Dev\StackOverflow\q003207219>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" -c "import os;os.system(\"dir /b root_dir\")"
      dir0
      dir1
      dir2
      dir3
      file0
      file1

    সাধারণভাবে এই পদ্ধতিকে এড়ানো উচিত, যেহেতু কিছু কমান্ড আউটপুট ফর্ম্যাট ওএস সংস্করণ / স্বাদগুলির মধ্যে কিছুটা পৃথক হয় , পার্সিং কোডটিও ঠিকঠাক করা উচিত; স্থানীয় মধ্যে পার্থক্য উল্লেখ না)।


48

একই নামের মডিউল থেকে আপনি ব্যবহার করার পরামর্শ দিয়ে আদমকের উত্তরটি সত্যিই পছন্দ করেছি glob()। এটি আপনাকে *এস এর সাথে প্যাটার্ন ম্যাচিং করতে দেয় ।

তবে অন্যান্য ব্যক্তিরা যেমন মন্তব্যগুলিতে উল্লেখ করেছেন, glob()তত্ক্ষণাতিক্য বিপর্যস্ত দিকনির্দেশের কারণে তারা আরও ছড়িয়ে পড়তে পারে। যে সাহায্য করার জন্য, আমি সুপারিশ আপনি ব্যবহার join()এবং expanduser()ইন ফাংশান উপস্থিত os.pathমডিউল, এবং সম্ভবত getcwd()ফাংশন osমডিউল, পাশাপাশি।

উদাহরণ হিসাবে:

from glob import glob

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

উপরেরটিটি ভয়ানক - পথটি হার্ডকোড করা হয়েছে এবং কেবলমাত্র ড্রাইভের নাম এবং \পথটিতে হার্ডকোড হওয়ার মধ্যে উইন্ডোজে কাজ করবে ।

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

উপরেরটি আরও ভাল কাজ করে তবে এটি ফোল্ডারের নামের উপর নির্ভর করে Usersযা প্রায়শই উইন্ডোজে পাওয়া যায় এবং অন্যান্য ওএসগুলিতে প্রায়শই পাওয়া যায় না। এটি একটি নির্দিষ্ট নাম, ব্যবহারকারীর উপর নির্ভর করে 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'))

এটি সমস্ত প্ল্যাটফর্ম জুড়ে পুরোপুরি কাজ করে।

প্ল্যাটফর্ম জুড়ে পুরোপুরি কাজ করে এবং কিছুটা আলাদা করে এমন আরও একটি দুর্দান্ত উদাহরণ:

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

আশা করি এই উদাহরণগুলি আপনাকে স্ট্যান্ডার্ড পাইথন গ্রন্থাগার মডিউলগুলিতে পাওয়া কয়েকটি ফাংশনের শক্তি দেখতে সহায়তা করবে।


4
অতিরিক্ত গ্লোব মজা: পাইথন 3.5 থেকে শুরু করা, **আপনি যতক্ষণ সেট করেন ততক্ষণ কাজ করে recursive = True। দস্তাবেজগুলি এখানে দেখুন: docs.python.org/3.5/library/glob.html#glob.glob
আর্টঅফ ওয়ারফেয়ার

35
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 

23

আপনি যদি পাইথনের প্রয়োগের সন্ধানের সন্ধান করেন তবে এটি একটি রেসিপি যা আমি প্রায়শই ব্যবহার করি:

from findtools.find_files import (find_files, Match)

# Recursively find all *.sh files in **/usr/bin**
sh_files_pattern = Match(filetype='f', name='*.sh')
found_files = find_files(path='/usr/bin', match=sh_files_pattern)

for found_file in found_files:
    print found_file

সুতরাং আমি এটি থেকে একটি পিপিআই প্যাকেজ তৈরি করেছি এবং একটি গিটহাবের সংগ্রহশালাও রয়েছে । আমি আশা করি যে কেউ এই কোডটির জন্য এটি সম্ভাব্যরূপে দরকারী বলে মনে করছেন।


14

বৃহত্তর ফলাফলের জন্য, আপনি জেনারেটরের সাথে মডিউলটির listdir()পদ্ধতিও ব্যবহার করতে পারেন os(একটি জেনারেটর একটি শক্তিশালী পুনরুক্তিকারী যা তার অবস্থা রাখে, মনে আছে?)। নিম্নলিখিত কোডটি উভয় সংস্করণে সূক্ষ্মভাবে কাজ করে: পাইথন 2 এবং পাইথন 3।

এখানে একটি কোড:

import os

def files(path):  
    for file in os.listdir(path):
        if os.path.isfile(os.path.join(path, file)):
            yield file

for file in files("."):  
    print (file)

listdir()পদ্ধতি দেওয়া ডিরেক্টরির জন্য এন্ট্রি তালিকা ফেরৎ। প্রদত্ত এন্ট্রি কোনও ফাইল হলে পদ্ধতিটি os.path.isfile()ফিরে আসে True। এবং yieldঅপারেটর ফানক ছেড়ে দেয় তবে তার বর্তমান অবস্থা বজায় রাখে এবং এটি কেবল ফাইল হিসাবে সনাক্ত হওয়া প্রবেশের নামটি ফিরিয়ে দেয়। উপরের সমস্তটি আমাদের জেনারেটরের ফাংশনটি লুপ করতে দেয়।


11

পরম ফাইলপথগুলির একটি তালিকা ফিরিয়ে দেওয়া, উপ-ডিরেক্টরিতে পুনরাবৃত্তি করে না

L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))]

2
দ্রষ্টব্য: এর os.path.abspath(f)জন্য কিছুটা সস্তা বিকল্প হবে os.path.join(os.getcwd(),f)
শ্যাডোএ্যাঞ্জার

আপনি আরও বেশি দক্ষ হয়ে উঠতে পারেন যদি আপনি শুরু করেন cwd = os.path.abspath('.'), তবে এর cwdপরিবর্তে '.'এবং os.getcwd()পুরো জায়গায় ব্যবহার করা হবে যাতে অতিরিক্ত অপ্রয়োজনীয় সিস্টেম কলগুলি এড়ানো যায়।
মার্টিজন পিটারস

10
import os
import os.path


def get_files(target_dir):
    item_list = os.listdir(target_dir)

    file_list = list()
    for item in item_list:
        item_dir = os.path.join(target_dir,item)
        if os.path.isdir(item_dir):
            file_list += get_files(item_dir)
        else:
            file_list.append(item_dir)
    return file_list

এখানে আমি পুনরাবৃত্তাকার কাঠামো ব্যবহার করি।


এটি কেবল এক লাইনেই অর্জন করা যায় pathlib:filter(Path.is_file, Path().rglob('*'))
জর্জি

9

একজন জ্ঞানী শিক্ষক আমাকে একবার বলেছিলেন:

যখন কিছু করার জন্য কয়েকটি প্রতিষ্ঠিত পদ্ধতি রয়েছে, সেগুলির কোনওটিই সব ক্ষেত্রে ভাল হয় না।

আমি এইভাবে সমস্যার সাবসেটের জন্য একটি সমাধান যুক্ত করব : প্রায়শই আমরা কেবল যাচাই করতে চাই যে কোনও ফাইল সাব-ডিরেক্টরিতে না গিয়ে কোনও প্রারম্ভিক স্ট্রিং এবং শেষ স্ট্রিংয়ের সাথে মেলে কিনা। আমরা এভাবে একটি ফাংশন চাই যা ফাইলনামগুলির একটি তালিকা ফিরিয়ে দেয়, যেমন:

filenames = dir_filter('foo/baz', radical='radical', extension='.txt')

আপনি যদি প্রথমে দুটি ফাংশন ঘোষণা করতে আগ্রহী হন তবে এটি করা যেতে পারে:

def file_filter(filename, radical='', extension=''):
    "Check if a filename matches a radical and extension"
    if not filename:
        return False
    filename = filename.strip()
    return(filename.startswith(radical) and filename.endswith(extension))

def dir_filter(dirname='', radical='', extension=''):
    "Filter filenames in directory according to radical and extension"
    if not dirname:
        dirname = '.'
    return [filename for filename in os.listdir(dirname)
                if file_filter(filename, radical, extension)]

এই সমাধানটি নিয়মিত প্রকাশের সাহায্যে সহজেই করা যেতে পারে (এবং আপনি patternযদি নিজের প্যাটার্নগুলি সর্বদা ফাইলের শুরু বা শেষের সাথে আঁকতে না চান তবে আপনি একটি যুক্তি যুক্ত করতে চাইতে পারেন )।


6

জেনারেটর ব্যবহার করে

import os
def get_files(search_path):
     for (dirpath, _, filenames) in os.walk(search_path):
         for filename in filenames:
             yield os.path.join(dirpath, filename)
list_files = get_files('.')
for filename in list_files:
    print(filename)

4

পাইথন ৩.৪++ এর জন্য আর একটি খুব পঠনযোগ্য রূপটি প্যাথলিব ব্যবহার করছে athপথ.glob:

from pathlib import Path
folder = '/foo'
[f for f in Path(folder).glob('*') if f.is_file()]

আরও সুনির্দিষ্ট করা সহজ, উদাহরণস্বরূপ কেবল পাইথন উত্স ফাইলগুলি সন্ধান করুন যা প্রতীকী লিঙ্ক নয়, সমস্ত উপ-ডিরেক্টরিতেও:

[f for f in Path(folder).glob('**/*.py') if not f.is_symlink()]

3

এটির জন্য আমার সাধারণ উদ্দেশ্যে কাজটি এখানে। এটি ফাইলের পরিবর্তে ফাইলের পাথের একটি তালিকা ফেরত দেয় যেহেতু আমি আরও দরকারী বলে খুঁজে পেয়েছি। এটিতে কয়েকটি alচ্ছিক যুক্তি রয়েছে যা এটি বহুমুখী করে তোলে। উদাহরণস্বরূপ, আমি প্রায়শই এটির মতো pattern='*.txt'বা যুক্তি সহ এটি ব্যবহার করি subfolders=True

import os
import fnmatch

def list_paths(folder='.', pattern='*', case_sensitive=False, subfolders=False):
    """Return a list of the file paths matching the pattern in the specified 
    folder, optionally including files inside subfolders.
    """
    match = fnmatch.fnmatchcase if case_sensitive else fnmatch.fnmatch
    walked = os.walk(folder) if subfolders else [next(os.walk(folder))]
    return [os.path.join(root, f)
            for root, dirnames, filenames in walked
            for f in filenames if match(f, pattern)]

2

আমি একটি নমুনা ওয়ান লাইনার সরবরাহ করব যেখানে ইনপুট হিসাবে সোসারসেপথ এবং ফাইল টাইপ সরবরাহ করা যেতে পারে। কোডটি সিএসভি এক্সটেনশান সহ ফাইলের নামের একটি তালিকা দেয়। ব্যবহার সব ফাইল ফেরত দেওয়ার প্রয়োজনে। এটি পুনরাবৃত্তভাবে সাব-ডিরেক্টরিকে স্ক্যান করবে।

[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]

ফাইল এক্সটেনশানগুলি এবং উত্সের পথটি প্রয়োজনীয় হিসাবে সংশোধন করুন।


1
আপনি যদি ব্যবহার করতে চলেছেন globতবে কেবল ব্যবহার করুন glob('**/*.csv', recursive=True)os.walk()পুনরাবৃত্তি করার জন্য এটি একত্রিত করার দরকার নেই ( recursiveএবং **পাইথন 3.5 এর পরে সমর্থিত)।
মার্টিজন পিটারস

2

পাইথন 2 এর জন্য: পিপ ইনস্টল করুন rglob

import rglob
file_list=rglob.rglob("/home/base/dir/", "*")
print file_list

2

ডারচেচে "সংস্করণ ২.6 থেকে অবহেলিত: পাইথন 3.0.০ এ ডারচেচ মডিউল সরানো হয়েছে।"

import dircache
list = dircache.listdir(pathname)
i = 0
check = len(list[0])
temp = []
count = len(list)
while count != 0:
  if len(list[i]) != check:
     temp.append(list[i-1])
     check = len(list[i])
  else:
    i = i + 1
    count = count - 1

print temp

17
ডিমচাচ "সংস্করণ ২.6 থেকে অবহেলিত: পাইথন 3.0.০ এ ডারচেচে মডিউল সরানো হয়েছে।"
ড্যানিয়েল রেইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.