পাইথনে পুনরাবৃত্তভাবে ট্রান্সভার্স ডিরেক্টরিগুলি os.walk () ব্যবহার করে


151

আমি মূল ডিরেক্টরি থেকে অন্য সমস্ত ডিরেক্টরিতে নেভিগেট করতে চাই এবং একই মুদ্রণ করতে চাই।

আমার কোডটি এখানে:

#!/usr/bin/python

import os
import fnmatch

for root, dir, files in os.walk("."):
        print root
        print ""
        for items in fnmatch.filter(files, "*"):
                print "..." + items
        print ""

এবং এখানে আমার ও / পি:

.

...Python_Notes
...pypy.py
...pypy.py.save
...classdemo.py
....goutputstream-J9ZUXW
...latest.py
...pack.py
...classdemo.pyc
...Python_Notes~
...module-demo.py
...filetype.py

./packagedemo

...classdemo.py
...__init__.pyc
...__init__.py
...classdemo.pyc

উপরে, .এবং ./packagedemoডিরেক্টরি রয়েছে।

তবে, আমাকে নিম্নলিখিত পদ্ধতিতে ও / পি মুদ্রণ করতে হবে:

A
---a.txt
---b.txt
---B
------c.out

উপরে, Aএবং Bডিরেক্টরিগুলি এবং বাকী ফাইলগুলি।


6
অজগর শক্তি সম্পর্কে আমি এই ছোট্ট পোস্টটি এখানে যুক্ত করতে চাই: >>> 2 * '-' ----
নিতাই

উত্তর:


228

এটি আপনাকে কাঙ্ক্ষিত ফলাফল দেবে

#!/usr/bin/python

import os

# traverse root directory, and list directories as dirs and files as files
for root, dirs, files in os.walk("."):
    path = root.split(os.sep)
    print((len(path) - 1) * '---', os.path.basename(root))
    for file in files:
        print(len(path) * '---', file)

6
পাথ = os.path.relpath (মূল, বেসপথ) .স্প্লিট (os.sep)
সেম্প্রিনি

9
@ অজয় ​​হতাশ হয়ে থাকুন এবং সর্বদা করুন os.walk(u".")কারণ পথগুলি ইউনিকোড হতে পারে।
সিরো সান্তিলি :29 冠状 病 六四 事件

3
আরও ভাল,os.path.curdir
জির

আমি os.path.walkকিছুক্ষণ ব্যবহার করছিলাম , তাই os.walkআমার কাছে নতুন! শীতল মটরশুটি.
টম

@ সেমপ্রিনি basepathআপনার কোডে কি সমান?
স্টিলিওস

23

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""FileTreeMaker.py: ..."""

__author__  = "legendmohe"

import os
import argparse
import time

class FileTreeMaker(object):

    def _recurse(self, parent_path, file_list, prefix, output_buf, level):
        if len(file_list) == 0 \
            or (self.max_level != -1 and self.max_level <= level):
            return
        else:
            file_list.sort(key=lambda f: os.path.isfile(os.path.join(parent_path, f)))
            for idx, sub_path in enumerate(file_list):
                if any(exclude_name in sub_path for exclude_name in self.exn):
                    continue

                full_path = os.path.join(parent_path, sub_path)
                idc = "┣━"
                if idx == len(file_list) - 1:
                    idc = "┗━"

                if os.path.isdir(full_path) and sub_path not in self.exf:
                    output_buf.append("%s%s[%s]" % (prefix, idc, sub_path))
                    if len(file_list) > 1 and idx != len(file_list) - 1:
                        tmp_prefix = prefix + "┃  "
                    else:
                        tmp_prefix = prefix + "    "
                    self._recurse(full_path, os.listdir(full_path), tmp_prefix, output_buf, level + 1)
                elif os.path.isfile(full_path):
                    output_buf.append("%s%s%s" % (prefix, idc, sub_path))

    def make(self, args):
        self.root = args.root
        self.exf = args.exclude_folder
        self.exn = args.exclude_name
        self.max_level = args.max_level

        print("root:%s" % self.root)

        buf = []
        path_parts = self.root.rsplit(os.path.sep, 1)
        buf.append("[%s]" % (path_parts[-1],))
        self._recurse(self.root, os.listdir(self.root), "", buf, 0)

        output_str = "\n".join(buf)
        if len(args.output) != 0:
            with open(args.output, 'w') as of:
                of.write(output_str)
        return output_str

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-r", "--root", help="root of file tree", default=".")
    parser.add_argument("-o", "--output", help="output file name", default="")
    parser.add_argument("-xf", "--exclude_folder", nargs='*', help="exclude folder", default=[])
    parser.add_argument("-xn", "--exclude_name", nargs='*', help="exclude name", default=[])
    parser.add_argument("-m", "--max_level", help="max level",
                        type=int, default=-1)
    args = parser.parse_args()
    print(FileTreeMaker().make(args))

আপনি এটি পাবেন:

root:.
[.]
┣━[.idea]
  ┣━[scopes]
    ┗━scope_settings.xml
  ┣━.name
  ┣━Demo.iml
  ┣━encodings.xml
  ┣━misc.xml
  ┣━modules.xml
  ┣━vcs.xml
  ┗━workspace.xml
┣━[test1]
  ┗━test1.txt
┣━[test2]
  ┣━[test2-2]
    ┗━[test2-3]
        ┣━test2
        ┗━test2-3-1
  ┗━test2
┣━folder_tree_maker.py
┗━tree.py

হাই, আমি আপনার স্ক্রিপ্টটি সত্যিই পছন্দ করি, তবে আমি যে প্রকল্পে কাজ করছি তার জন্য এটি কিছুটা জটিল, কেবলমাত্র -r যুক্তি উপস্থিত থাকার সাথে এটির একটি ছোট ফাংশন হিসাবে আমার থাকতে পারে কি এমন কোনও সুযোগ আছে?
jeff_h

কিভাবে এটি একটি .txt মুদ্রণ? আমি চেষ্টা করেছিলাম print(FileTreeMaker().make(args),file=tree)কিন্তু এটি আমাকে দেয়'charmap' codec can't encode characters in position 17-21: character maps to <undefined>
লুইস ফিলিপ

আইডিসি স্ট্যান্ডের জন্য
ভয়েসেস

আমিও তেমন কিছু লিখেছি os.listdir()। তোমার অনেক ভাল; আমি পুনরাবৃত্তিটি সঠিকভাবে পেতে পারি না, এটি কেবল 2 বা 3 স্তর গভীর করে কাজ করে। শেষ পর্যন্ত আমি os.walk()পরিবর্তে আবার স্ক্র্যাচ থেকে চেষ্টা করার সিদ্ধান্ত নিয়েছি , যা আমি ভেবেছিলাম যে এটি আরও বেশি উপযুক্ত হবে। আমি অবাক হয়েছি আপনি এখানে এখুনি ব্যবহার করেন নি।
ভয়েসেস

11

osপ্যাকেজে এর জন্য আরও উপযুক্ত ফাংশন রয়েছে । তবে আপনার যদি ব্যবহার করতে os.walkহয় তবে আমি এখানে আসছি

def walkdir(dirname):
    for cur, _dirs, files in os.walk(dirname):
        pref = ''
        head, tail = os.path.split(cur)
        while head:
            pref += '---'
            head, _tail = os.path.split(head)
        print(pref+tail)
        for f in files:
            print(pref+'---'+f)

আউটপুট:

>>> walkdir('.')
.
---file3
---file2
---my.py
---file1
---A
------file2
------file1
---B
------file3
------file2
------file4
------file1
---__pycache__
------my.cpython-33.pyc

5
সুতরাং আরও উপযুক্ত ফাংশন কি? (3.5 এর মধ্যে এটি গুরুত্বপূর্ণ)
আল লেলোপাথ

দুঃখিত, আমি এর দ্বারা কী বোঝাতে চাইছি তা মনে করার কোনও সুযোগ নেই। এটি সম্ভব যে আমি বোঝাতে চাইছি os.listdirকিন্তু @ অজয়ের সমাধানটি এটি হারাবে।
zaquest

5

আপনি ব্যবহার করতে পারেন os.walk, এবং এটি সম্ভবত সবচেয়ে সহজ সমাধান তবে এটি অন্বেষণ করার জন্য এখানে আরও একটি ধারণা দেওয়া হয়েছে:

import sys, os

FILES = False

def main():
    if len(sys.argv) > 2 and sys.argv[2].upper() == '/F':
        global FILES; FILES = True
    try:
        tree(sys.argv[1])
    except:
        print('Usage: {} <directory>'.format(os.path.basename(sys.argv[0])))

def tree(path):
    path = os.path.abspath(path)
    dirs, files = listdir(path)[:2]
    print(path)
    walk(path, dirs, files)
    if not dirs:
        print('No subfolders exist')

def walk(root, dirs, files, prefix=''):
    if FILES and files:
        file_prefix = prefix + ('|' if dirs else ' ') + '   '
        for name in files:
            print(file_prefix + name)
        print(file_prefix)
    dir_prefix, walk_prefix = prefix + '+---', prefix + '|   '
    for pos, neg, name in enumerate2(dirs):
        if neg == -1:
            dir_prefix, walk_prefix = prefix + '\\---', prefix + '    '
        print(dir_prefix + name)
        path = os.path.join(root, name)
        try:
            dirs, files = listdir(path)[:2]
        except:
            pass
        else:
            walk(path, dirs, files, walk_prefix)

def listdir(path):
    dirs, files, links = [], [], []
    for name in os.listdir(path):
        path_name = os.path.join(path, name)
        if os.path.isdir(path_name):
            dirs.append(name)
        elif os.path.isfile(path_name):
            files.append(name)
        elif os.path.islink(path_name):
            links.append(name)
    return dirs, files, links

def enumerate2(sequence):
    length = len(sequence)
    for count, value in enumerate(sequence):
        yield count, count - length, value

if __name__ == '__main__':
    main()

আপনি উইন্ডোজ টার্মিনালে TREE কমান্ড থেকে নিম্নলিখিত ডকুমেন্টেশনগুলি সনাক্ত করতে পারেন:

Graphically displays the folder structure of a drive or path.

TREE [drive:][path] [/F] [/A]

   /F   Display the names of the files in each folder.
   /A   Use ASCII instead of extended characters.

5

আপনি বর্তমান ডিরেক্টরিতে সমস্ত ডায়ার থেকে সমস্ত ফাইল পেয়ে থাকেন এবং বর্তমান ডিরেক্টরি থেকে সমস্ত ডায়ার পান এমন একটি ডিরেক্টরিতে পুনরাবৃত্তি করুন - কারণ উপরের কোডগুলির সরলতা নেই (ইমো):

for root, dirs, files in os.walk(rootFolderPath):
    for filename in files:
        doSomethingWithFile(os.path.join(root, filename))
    for dirname in dirs:
        doSomewthingWithDir(os.path.join(root, dirname))

3
সবচেয়ে সহায়ক উত্তর। নোট যে os.path.join(root, filename)ফাইলটি বেশ কয়েকটি ডিরেক্টরিতে নীস্ট করা থাকলেও ফাইলটিকে পুরো পথ দেয়।
ক্লাও

4

এটি ফোল্ডারের নামগুলির জন্য এটি করে:

def printFolderName(init_indent, rootFolder):
    fname = rootFolder.split(os.sep)[-1]
    root_levels = rootFolder.count(os.sep)
    # os.walk treats dirs breadth-first, but files depth-first (go figure)
    for root, dirs, files in os.walk(rootFolder):
        # print the directories below the root
        levels = root.count(os.sep) - root_levels
        indent = ' '*(levels*2)
        print init_indent + indent + root.split(os.sep)[-1]

3
#!/usr/bin/python

import os 

def tracing(a):
    global i>
    for item in os.listdir(a):
        if os.path.isfile(item):
            print i + item 
        else:
            print i + item 
            i+=i
            tracing(item)

i = "---"
tracing(".")

1

একটি ফোল্ডারের নাম দেওয়া হয়েছে, এটির পুনরাবৃত্তভাবে পুরো শ্রেণিবিন্যাসের মধ্য দিয়ে যান।

#! /usr/local/bin/python3
# findLargeFiles.py - given a folder name, walk through its entire hierarchy
#                   - print folders and files within each folder

import os

def recursive_walk(folder):
    for folderName, subfolders, filenames in os.walk(folder):
        if subfolders:
            for subfolder in subfolders:
                recursive_walk(subfolder)
        print('\nFolder: ' + folderName + '\n')
        for filename in filenames:
            print(filename + '\n')

recursive_walk('/name/of/folder')

4
ওস.ওয়াককে পুনরাবৃত্তভাবে কল করার দরকার নেই, কারণ এটি ইতিমধ্যে পুনরাবৃত্তিকে ফ্ল্যাট করে। এজন্য এটি ফোল্ডার নাম আর্গুমেন্টটি দেয়।
বিশ্বব্যাপী

1

সেরা উপায় হবে

def traverse_dir_recur(dir):
    import os
    l = os.listdir(dir)
    for d in l:
        if os.path.isdir(dir + d):
            traverse_dir_recur(dir+  d +"/")
        else:
            print(dir + d)

পাইথন 3 এ আমার পক্ষে কাজ করছেন না। আমি ধরে নিচ্ছি ত্রুটিটি আছেdir + d যা ডিরেক্টরি বিভাজক ছাড়াই তাদের সংমিশ্রণ করতে পারে। os.path.joinফাইলের নাম সহ ডিরেক্টরিগুলি ব্যবহার করার জন্য এটি সম্ভবত আরও ভাল
Zvika

0

এটি চেষ্টা করে দেখুন; সহজ এক

 #!/usr/bin/python
 import os
 # Creating an empty list that will contain the already traversed paths
 donePaths = []
 def direct(path):
       for paths,dirs,files in os.walk(path):
             if paths not in donePaths:
                    count = paths.count('/')
                    if files:
                          for ele1 in files:
                                print '---------' * (count), ele1
                    if dirs:
                          for ele2 in dirs:
                                print '---------' * (count), ele2
                                absPath = os.path.join(paths,ele2)
              # recursively calling the direct function on each directory
                                direct(absPath)
                   # adding the paths to the list that got traversed 
                                donePaths.append(absPath)

 path = raw_input("Enter any path to get the following Dir Tree ...\n")
 direct(path)

======== নীচে আউটপুট =========

 /home/test
 ------------------ b.txt
 ------------------ a.txt
 ------------------ a
 --------------------------- a1.txt
 ------------------ b
 --------------------------- b1.txt
 --------------------------- b2.txt
 --------------------------- cde
 ------------------------------------ cde.txt
 ------------------------------------ cdeDir
 --------------------------------------------- cdeDir.txt
 ------------------ c
 --------------------------- c.txt
 --------------------------- c1
 ------------------------------------ c1.txt
 ------------------------------------ c2.txt

ইতিমধ্যে ট্র্যাশড পাথগুলির জন্য চেকের বিন্দুটি কী? যদি এটি লিঙ্কগুলির কারণে সৃষ্ট লুপগুলি সনাক্ত করতে পারে তবে ওএস.ওয়াকটি স্পষ্টতই নিম্নলিখিত লিঙ্কগুলি অনুসরণ না করে ডিফল্ট। অন্য কিছু পরিস্থিতি আছে?
বিশ্বব্যাপী

0

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

import os
root_name = next(os.walk("."))[0]
dir_names = next(os.walk("."))[1]
file_names = next(os.walk("."))[2]

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


0

আপনি পুনরাবৃত্তভাবে একটি ফোল্ডার দিয়ে হাঁটতে পারেন এবং পাথলিব ব্যবহার করে এর সমস্ত বিষয়বস্তু তালিকাভুক্ত করতে পারেন athপাথ ()

from pathlib import Path


def check_out_path(target_path, level=0):
    """"
    This function recursively prints all contents of a pathlib.Path object
    """
    def print_indented(folder, level):
        print('\t' * level + folder)

    print_indented(target_path.name, level)
    for file in target_path.iterdir():
        if file.is_dir():
            check_out_path(file, level+1)
        else:
            print_indented(file.name, level+1)


my_path = Path(r'C:\example folder')
check_out_path(my_path)

আউটপুট:

example folder
    folder
        textfile3.txt
    textfile1.txt
    textfile2.txt

-3
import os

os.chdir('/your/working/path/')
dir = os.getcwd()
list = sorted(os.listdir(dir))
marks = ""

for s_list in list:
    print marks + s_list
    marks += "---"
    tree_list = sorted(os.listdir(dir + "/" + s_list))
    for i in tree_list:
        print marks + i

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