পাইথনে ডিরেক্টরি-গাছের তালিকা


উত্তর:


615

ডিরেক্টরি ট্রিতে প্রতিটি ফাইল এবং ডিরেক্টরিকে অতিক্রম করার এই উপায়:

import os

for dirname, dirnames, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in dirnames:
        print(os.path.join(dirname, subdirname))

    # print path to all filenames.
    for filename in filenames:
        print(os.path.join(dirname, filename))

    # Advanced usage:
    # editing the 'dirnames' list will stop os.walk() from recursing into there.
    if '.git' in dirnames:
        # don't go into any .git directories.
        dirnames.remove('.git')

19
এবং যদি আপনি পাইথন শেল থেকে এই কোডটি (যেমনটি) চালনা করেন তবে মনে রাখবেন যে Ctrl + C শেল থেকে আউটপুট থামিয়ে দেবে। ;)
গ্যারি

41
এটি পুনরাবৃত্তভাবে ফাইল এবং ডিরেক্টরি তালিকাভুক্ত করবে
আরডিএস

এমনকি ডায়ারনেম তালিকাটি কিছু পাথের পুনরাবৃত্তি থেকে রোধ করতে আপনি এটি সম্পাদনা করতে পারেন।
বাগগাফ

8
@ ক্লিটমেন্ট "যখন টাউনডাউনটি সত্য হয়, কলার ডায়ারনেম তালিকাটি স্থান পরিবর্তন করতে পারে (সম্ভবত ডেল বা স্লাইস অ্যাসাইনমেন্ট ব্যবহার করে) এবং হাঁটা () কেবলমাত্র সাব-ডিরেক্টরিতে পুনরাবৃত্তি করবে যার নামগুলি ডায়ারনেমে থাকবে; এটি ছাঁটাই করতে ব্যবহার করা যেতে পারে অনুসন্ধান করুন, পরিদর্শন করার একটি নির্দিষ্ট ক্রম চাপিয়ে দিন, এমনকি কলটি ডিরেক্টরিগুলি পুনরায় চলার আগে () পুনরায় চালু করার আগে যে ডিরেক্টরিগুলি কলার তৈরি করে বা নাম পরিবর্তন করেছেন সে সম্পর্কে ওয়াক () কে অবহিত করতে হবে। " docs.python.org/2/library/os.html#os.walk
বাগগাফ

কিছু ডিরেক্টরি উপেক্ষা করার সহজ উপায় হ'ল প্রথম স্থানে তাদের ডায়ারনেমগুলিতে যুক্ত না করাfor subdirname in dirnames: if subdirname != '.git'
স্মি

537

তুমি ব্যবহার করতে পার

os.listdir(path)

রেফারেন্স এবং আরও ওএস ফাংশনগুলির জন্য এখানে দেখুন:


1
তবে মূল প্রশ্নটি কেবল অস্পষ্ট যে তারা পুনরাবৃত্ত সমাধান সমাধান করতে চায় কিনা তা জানার পক্ষে যথেষ্ট অস্পষ্ট। "ডিরেক্টরিতে সমস্ত ফাইল" পুনরাবৃত্ত হিসাবে ব্যাখ্যা করা যেতে পারে।
টমি

3
@ টমি, একটি "ডিরেক্টরি" একটি স্পষ্টভাবে সংজ্ঞায়িত ডেটা কাঠামো এবং এটি "ls -R" এর পরিবর্তে "ls" বোঝায়। এছাড়াও, প্রায় সব ইউনিক্স সরঞ্জাম ডিফল্টরূপে পুনরাবৃত্তির সাথে কাজ করে না। আমি জানি না যে প্রশ্নকর্তাটির অর্থ কী ছিল তবে তিনি কী লিখেছিলেন তা পরিষ্কার ছিল।
টর্স্টেন ব্রোঞ্জার

এর পরিবর্তে পাইথন 3 ডক্সটি আপনাকে ব্যবহার করতে বলছে os.scandir, যেহেতু অনেক ক্ষেত্রে এটি আপনাকে একটি বিনামূল্যে স্পিডআপ দেয় (আইপিসি এবং আইও উভয় ধীরে ধীরে) দেয় এমন সিস্টেম কল প্রতিরোধ করতে দেয়।
জ্যাপি কের্ক

5
ডিরেক্টরিতে ডিরেক্টরিতে আপনাকে কেবল ফাইলের নাম দেয়, পুরো পথ পাবার জন্য কি কোনও পদ্ধতি উপলব্ধ রয়েছে?
গ্রেপারর

1
@greperror আপনি পুরো পাথ পাওয়ার জন্য os.path.abspath ব্যবহার করতে পারেন । এছাড়াও, প্রদত্ত পাথটি একটি ফাইল কিনা তা পরীক্ষা করতে, os.path.isfile বা ব্যবহার করুন os.path.isdir
আলেকসানদার

110

এখানে আমি প্রায়শই ব্যবহার করি এমন একটি সহায়ক ফাংশন:

import os

def listdir_fullpath(d):
    return [os.path.join(d, f) for f in os.listdir(d)]

3
একটি জেনারেটর আরও ভাল হবে।
রবার্ট সিমার

1
@ রবার্টসিমার যা ব্যবহারের উপর নির্ভর করে। অনেক ক্ষেত্রেই একটি তালিকা আরও ভাল হবে তবে আমার ধারণা জেনারেটর আরও বহুমুখী যেহেতু এটি কোনও তালিকায় রূপান্তরিত হতে পারে। এটি নির্ভর করে যে আপনি সন্ধান করছেন, বহুমুখিতা বা কিছুটা আরও বেশি স্ট্রিমালাইড।
জেমস মিচগ

3
দশ বছর কেটে গেছে, তবে আমি মনে করি আমি এটি এটি করেছিলাম কারণ os.listdir () একটি তালিকা ফিরে আসে এবং আমি এটি অনুকরণ করছিলাম।
গিল্টে

82
import os

for filename in os.listdir("C:\\temp"):
    print  filename

16
r'C:\temp'পরিষ্কার এবং "C:\\temp"রাস্ট্রস্টিংগুলিতে পছন্দসই ব্যাকস্ল্যাশগুলি ছাড়ার চেয়ে বেশি ভাল।
smci

13

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

import glob
glob.glob('./[0-9].*')

এমন কিছু ফেরত দেবে:

['./1.gif', './2.txt']

ডকুমেন্টেশন এখানে দেখুন


10

এটা চেষ্টা কর:

import os
for top, dirs, files in os.walk('./'):
    for nm in files:       
        print os.path.join(top, nm)

এক লাইন ইন: [শীর্ষ + os.sep + + ফাইল উপরে, dirs, os.walk ফাইল ( './') চ জন্য চ]
জে পিটারসন

9

কোনও পাথ নির্দিষ্ট না করেই বর্তমান ওয়ার্কিং ডিরেক্টরিতে ফাইলগুলির জন্য

পাইথন ২.7:

import os
os.listdir(os.getcwd())

পাইথন 3.x:

import os
os.listdir()

অজগর 3.x মন্তব্য করার জন্য স্ট্যাম ক্যালিকে ধন্যবাদ


5
os.listdir()ডিফল্ট হিসাবে বর্তমান ডিরেক্টরিতে উপাদান তালিকা! সুতরাং কোনও দরকার নেই os.getcwd():)
স্ট্যাম কলি

আমি এই কিভাবে করব? আমি যখন কোনও যুক্তি ছাড়াই >>> os.listdir () ব্যবহার করি তখন টাইপ এরির: লিস্টডির () দেওয়া ঠিক 1 টি যুক্তি (0 দেওয়া)
ডেভ ইঞ্জিনিয়ার

2
আমি ধরে নিচ্ছি আপনি ২.7 চালাচ্ছেন। এটি 3.x
স্ট্যাম কলি


3

আমার প্রয়োজন সমস্ত অপশন সহ আমি একটি দীর্ঘ সংস্করণ লিখেছিলাম: http://sam.nipl.net/code/python/find.py

আমার ধারণা এটি এখানেও খাপ খায়:

#!/usr/bin/env python

import os
import sys

def ls(dir, hidden=False, relative=True):
    nodes = []
    for nm in os.listdir(dir):
        if not hidden and nm.startswith('.'):
            continue
        if not relative:
            nm = os.path.join(dir, nm)
        nodes.append(nm)
    nodes.sort()
    return nodes

def find(root, files=True, dirs=False, hidden=False, relative=True, topdown=True):
    root = os.path.join(root, '')  # add slash if not there
    for parent, ldirs, lfiles in os.walk(root, topdown=topdown):
        if relative:
            parent = parent[len(root):]
        if dirs and parent:
            yield os.path.join(parent, '')
        if not hidden:
            lfiles   = [nm for nm in lfiles if not nm.startswith('.')]
            ldirs[:] = [nm for nm in ldirs  if not nm.startswith('.')]  # in place
        if files:
            lfiles.sort()
            for nm in lfiles:
                nm = os.path.join(parent, nm)
                yield nm

def test(root):
    print "* directory listing, with hidden files:"
    print ls(root, hidden=True)
    print
    print "* recursive listing, with dirs, but no hidden files:"
    for f in find(root, dirs=True):
        print f
    print

if __name__ == "__main__":
    test(*sys.argv[1:])

3

এখানে আরও একটি বিকল্প রয়েছে।

os.scandir(path='.')

এটি পথ দ্বারা প্রদত্ত ডিরেক্টরিতে প্রবেশদ্বার (ফাইলের বৈশিষ্ট্য সম্পর্কিত তথ্য সহ) সাথে সম্পর্কিত os.DirEntry অবজেক্টগুলির একটি পুনরাবৃত্তি প্রদান করে।

উদাহরণ:

with os.scandir(path) as it:
    for entry in it:
        if not entry.name.startswith('.'):
            print(entry.name)

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

পাইথন ডক্স


3

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

দির বিষয়বস্তু তালিকাবদ্ধ করতে, একটি পাথ অবজেক্ট তৈরি করুন এবং পুনরুক্তিকারীকে ধরুন:

In [16]: Path('/etc').iterdir()
Out[16]: <generator object Path.iterdir at 0x110853fc0>

আমরা যদি কেবল নামের নামের একটি তালিকা চাই:

In [17]: [x.name for x in Path('/etc').iterdir()]
Out[17]:
['emond.d',
 'ntp-restrict.conf',
 'periodic',

আপনি যদি কেবল ডায়ার চান:

In [18]: [x.name for x in Path('/etc').iterdir() if x.is_dir()]
Out[18]:
['emond.d',
 'periodic',
 'mach_init.d',

আপনি যদি সেই গাছের সমস্ত কনফিড ফাইলের নাম চান:

In [20]: [x.name for x in Path('/etc').glob('**/*.conf')]
Out[20]:
['ntp-restrict.conf',
 'dnsextd.conf',
 'syslog.conf',

আপনি যদি গাছটিতে কনফ ফাইলের একটি তালিকা চান> = 1K:

In [23]: [x.name for x in Path('/etc').glob('**/*.conf') if x.stat().st_size > 1024]
Out[23]:
['dnsextd.conf',
 'pf.conf',
 'autofs.conf',

আপেক্ষিক পাথগুলি সমাধান করা সহজ হয়ে যায়:

In [32]: Path('../Operational Metrics.md').resolve()
Out[32]: PosixPath('/Users/starver/code/xxxx/Operational Metrics.md')

কোনও পাথ দিয়ে চলাচল করা বেশ পরিষ্কার (যদিও অপ্রত্যাশিত):

In [10]: p = Path('.')

In [11]: core = p / 'web' / 'core'

In [13]: [x for x in core.iterdir() if x.is_file()]
Out[13]:
[PosixPath('web/core/metrics.py'),
 PosixPath('web/core/services.py'),
 PosixPath('web/core/querysets.py'),

1

কেবল পুনরাবৃত্তভাবে ফাইল তালিকাভুক্ত করার জন্য একটি দুর্দান্ত একটি লাইনার। আমি এটি আমার সেটআপ.পি প্যাকেজ_ডাটা নির্দেশিকায় ব্যবহার করেছি:

import os

[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]

আমি জানি এটি প্রশ্নের উত্তর নয়, তবে কাজে আসতে পারে


1

পাইথন 2 এর জন্য

#!/bin/python2

import os

def scan_dir(path):
    print map(os.path.abspath, os.listdir(pwd))

পাইথন 3 এর জন্য

ফিল্টার এবং মানচিত্রের জন্য আপনার এগুলি তালিকা সহ মোড়ানো দরকার ()

#!/bin/python3

import os

def scan_dir(path):
    print(list(map(os.path.abspath, os.listdir(pwd))))

এখনই সুপারিশটি হ'ল আপনি নিজের মানচিত্রের ব্যবহার প্রতিস্থাপন করুন এবং জেনারেটর এক্সপ্রেশন বা তালিকা বোঝার সাথে ফিল্টার করুন:

#!/bin/python

import os

def scan_dir(path):
    print([os.path.abspath(f) for f in os.listdir(path)])

1

এখানে এক লাইনের পাইথোনিক সংস্করণ রয়েছে:

import os
dir = 'given_directory_name'
filenames = [os.path.join(os.path.dirname(os.path.abspath(__file__)),dir,i) for i in os.listdir(dir)]

এই কোডটি প্রদত্ত ডিরেক্টরি নামে সমস্ত ফাইল এবং ডিরেক্টরিগুলির সম্পূর্ণ পথের তালিকা করে।


ধন্যবাদ সালেহ, তবে আপনার কোডটি পুরোপুরি কাজ করে নি, এবং এর দ্বারা কাজ করা একটি নিম্নরূপে সংশোধিত হয়েছে: 'দির =' প্রদত্ত_ডাইরেক্টরি_নাম 'ফাইলের নামগুলি = [os.path.abspath (os.path.join (dir, i)) আমার জন্য os.listdir (dir)] '
হাসানএসএইচ__3571619

1

আমি জানি এটি একটি পুরানো প্রশ্ন। আপনি যদি কোনও লিঙ্ক্স মেশিনে থাকেন তবে এটি আমি পরিষ্কারভাবে পেরিয়ে এসেছি।

import subprocess
print(subprocess.check_output(["ls", "/"]).decode("utf8"))

0
#import modules
import os

_CURRENT_DIR = '.'


def rec_tree_traverse(curr_dir, indent):
    "recurcive function to traverse the directory"
    #print "[traverse_tree]"

    try :
        dfList = [os.path.join(curr_dir, f_or_d) for f_or_d in os.listdir(curr_dir)]
    except:
        print "wrong path name/directory name"
        return

    for file_or_dir in dfList:

        if os.path.isdir(file_or_dir):
            #print "dir  : ",
            print indent, file_or_dir,"\\"
            rec_tree_traverse(file_or_dir, indent*2)

        if os.path.isfile(file_or_dir):
            #print "file : ",
            print indent, file_or_dir

    #end if for loop
#end of traverse_tree()

def main():

    base_dir = _CURRENT_DIR

    rec_tree_traverse(base_dir," ")

    raw_input("enter any key to exit....")
#end of main()


if __name__ == '__main__':
    main()

5
এই প্রশ্নের ইতিমধ্যে একটি পুরোপুরি ভাল উত্তর আছে, আবার উত্তর দেওয়ার দরকার নেই
মাইক পেনিংটন

0

এফওয়াইআই এক্সটেনশনের ফিল্টার যুক্ত করুন বা এক্স ফাইল ফাইল আমদানি করুন

path = '.'
for dirname, dirnames, filenames in os.walk(path):
    # print path to all filenames with extension py.
    for filename in filenames:
        fname_path = os.path.join(dirname, filename)
        fext = os.path.splitext(fname_path)[1]
        if fext == '.py':
            print fname_path
        else:
            continue

0

যদি টের পাওয়া যায় তবে আমি এটিকে ফেলে দেব wild ওয়াইল্ডকার্ড অনুসন্ধান করার সহজ এবং নোংরা উপায়।

import re
import os

[a for a in os.listdir(".") if re.search("^.*\.py$",a)]

0

নীচে কোড ডিরেক্টরিতে এবং dir মধ্যে ফাইল তালিকাভুক্ত করবে

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)

0

আমার সাথে যেটি কাজ করেছে সে হ'ল উপরের উত্তর উত্তর থেকে পরিবর্তিত সংস্করণ।

কোডটি নিম্নরূপ:

"dir = 'প্রদত্ত_ডাইরেক্টরি_নাম' ফাইলের নাম = = [os.path.abspath (os.path.join (dir, i)) আমি i. osdistir (dir)] এর জন্য"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.