পাইথন তালিকা ডিরেক্টরি, সাব ডিরেক্টরি ডিরেক্টরি এবং ফাইল


130

আমি একটি প্রদত্ত ডিরেক্টরিতে সমস্ত ডিরেক্টরি, উপ ডিরেক্টরি এবং ফাইল তালিকাভুক্ত করার জন্য একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি।
আমি এটি চেষ্টা করেছি:

import sys,os

root = "/home/patate/directory/"
path = os.path.join(root, "targetdirectory")

for r,d,f in os.walk(path):
    for file in f:
        print os.path.join(root,file)

দুর্ভাগ্যক্রমে এটি সঠিকভাবে কাজ করে না।
আমি সমস্ত ফাইল পাই, তবে তাদের সম্পূর্ণ পথ পাই না।

উদাহরণস্বরূপ যদি ডির স্ট্রাক্টটি হ'ল:

/home/patate/directory/targetdirectory/123/456/789/file.txt

এটি মুদ্রিত হবে:

/home/patate/directory/targetdirectory/file.txt

আমার যা দরকার তা প্রথম ফলাফল। কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে! ধন্যবাদ।

উত্তর:


225

ডিরেক্টরি এবং ফাইলের নামos.path.join একত্রিত করতে ব্যবহার করুন :

for path, subdirs, files in os.walk(root):
    for name in files:
        print os.path.join(path, name)

ব্যবহারের দ্রষ্টব্য pathএবং rootসংযুক্তকরণের মধ্যে, যেহেতু ব্যবহার rootভুল হবে।


পাইথন ৩.৪-তে, পাথলিব মডিউলটি সহজ পথের হেরফেরের জন্য যুক্ত করা হয়েছিল। সুতরাং সমতুল্য os.path.joinহবে:

pathlib.PurePath(path, name)

এর সুবিধাটি pathlibহ'ল আপনি পথগুলিতে বিভিন্ন উপকারী পদ্ধতি ব্যবহার করতে পারেন। আপনি যদি কংক্রিটের Pathবৈকল্পিক ব্যবহার করেন তবে আপনি সেগুলির মাধ্যমে প্রকৃত ওএস কলগুলিও করতে পারেন, যেমন কোনও ডিরেক্টরিতে ঝাঁকুনি, পাথ মোছা, ফাইলটি এটি নির্দেশ করে এবং আরও অনেক কিছু।


"অজগরটিতে সমস্ত ফাইলগুলি কীভাবে পুনরুত্পাদন করা যায়" সম্পর্কিত যে প্রশ্ন করা হয়েছিল সে সম্পর্কে এটিই একমাত্র এবং একমাত্র কার্যকর উত্তর।
হ্যারিসনফুরর্ড

বোধগমনের তালিকা: all_files = [os.path.join (পথ, নাম) ফাইলের জন্য নামের জন্য পাথ, সাবডিয়ারস, ওএস.ওয়াকের ফাইলগুলি (ফোল্ডার)]
নীর

45

কেবলমাত্র ক্ষেত্রে ... ডিরেক্টরিতে সমস্ত ফাইল এবং উপ-ডিরেক্টরিগুলি কিছু প্যাটার্নের সাথে মিলছে (* .পি উদাহরণস্বরূপ):

import os
from fnmatch import fnmatch

root = '/some/directory'
pattern = "*.py"

for path, subdirs, files in os.walk(root):
    for name in files:
        if fnmatch(name, pattern):
            print os.path.join(path, name)

10

এখানে একটি ওয়ান-লাইনার:

import os

[val for sublist in [[os.path.join(i[0], j) for j in i[2]] for i in os.walk('./')] for val in sublist]
# Meta comment to ease selecting text

বাইরের সর্বাধিক val for sublist in ...লুপটি তালিকাটিকে এক মাত্রিক করে তুলবে। jলুপ প্রতিটি ফাইল basename একটি তালিকা সংগ্রহ এবং বর্তমান পথ থেকে এটি যোগ দিল। অবশেষে, iলুপটি সমস্ত ডিরেক্টরি এবং উপ ডিরেক্টরিতে পুনরাবৃত্তি করে।

এই উদাহরণটিতে হার্ড কোডেড পাথ ব্যবহার ./মধ্যে os.walk(...)কল, আপনি যে কোনো পথ স্ট্রিং আপনার মত সম্পূরক পারবেন না।

দ্রষ্টব্য: os.path.expanduserএবং / অথবা os.path.expandvarsপাথের স্ট্রিংয়ের মতো ব্যবহার করা যেতে পারে~/

এই উদাহরণটি প্রসারিত করা:

ফাইল বেসনেম টেস্ট এবং ডিরেক্টরি নাম পরীক্ষায় এটি যুক্ত করা সহজ।

উদাহরণস্বরূপ, *.jpgফাইলগুলির জন্য পরীক্ষা করা:

... for j in i[2] if j.endswith('.jpg')] ...

অতিরিক্তভাবে, .gitডিরেক্টরি বাদ দিয়ে :

... for i in os.walk('./') if '.git' not in i[0].split('/')]

এটি কাজ করে, তবে .git ডিরেক্টয়কে উত্সাহিত করার জন্য আপনাকে '.git' পথে প্রবেশ করছে না কিনা তা পরীক্ষা করা উচিত।
রোমান আরডিজিজে

হাঁ। যদি '.git' আমি [[0] .স্প্লিট ('/')] তে না হয় তবে হওয়া উচিত
রোমান আরডিজিজে

আমি os.walkএকটি ম্যানুয়াল চালিত লুপের উপরে সুপারিশ করব , জেনারেটর দুর্দান্ত, তাদের ব্যবহার করুন।
থারস্মমনার

9

এখানে এত উত্তর লিখতে মন্তব্য করতে পারেনি। এটি আমি স্পষ্টতম এক-লাইনটি দেখেছি:

import os
[os.path.join(path, name) for path, subdirs, files in os.walk(root) for name in files]

4

আমি তৈরি এই নমুনাটি একবার দেখে নিতে পারেন। এটি os.path.walk ফাংশনটি ব্যবহার করে যা হুঁশিয়ার করা হয়। সমস্ত ফাইলপথ সংরক্ষণ করার জন্য একটি তালিকা ব্যবহার করে

root = "Your root directory"
ex = ".txt"
where_to = "Wherever you wanna write your file to"
def fileWalker(ext,dirname,names):
    '''
    checks files in names'''
    pat = "*" + ext[0]
    for f in names:
        if fnmatch.fnmatch(f,pat):
            ext[1].append(os.path.join(dirname,f))


def writeTo(fList):

    with open(where_to,"w") as f:
        for di_r in fList:
            f.write(di_r + "\n")






if __name__ == '__main__':
    li = []
    os.path.walk(root,fileWalker,[ex,li])

    writeTo(li)

4

কিছুটা সহজ ওয়ানলাইনার:

import os
from itertools import product, chain

chain.from_iterable([[os.sep.join(w) for w in product([i[0]], i[2])] for i in os.walk(dir)])

2

যেহেতু এখানে প্রতিটি উদাহরণ কেবল walk(সাথে join) ব্যবহার করছে , তাই আমি একটি দুর্দান্ত উদাহরণ এবং তুলনা দেখাতে চাই listdir:

import os, time

def listFiles1(root): # listdir
    allFiles = []; walk = [root]
    while walk:
        folder = walk.pop(0)+"/"; items = os.listdir(folder) # items = folders + files
        for i in items: i=folder+i; (walk if os.path.isdir(i) else allFiles).append(i)
    return allFiles

def listFiles2(root): # listdir/join (takes ~1.4x as long) (and uses '\\' instead)
    allFiles = []; walk = [root]
    while walk:
        folder = walk.pop(0); items = os.listdir(folder) # items = folders + files
        for i in items: i=os.path.join(folder,i); (walk if os.path.isdir(i) else allFiles).append(i)
    return allFiles

def listFiles3(root): # walk (takes ~1.5x as long)
    allFiles = []
    for folder, folders, files in os.walk(root):
        for file in files: allFiles+=[folder.replace("\\","/")+"/"+file] # folder+"\\"+file still ~1.5x
    return allFiles

def listFiles4(root): # walk/join (takes ~1.6x as long) (and uses '\\' instead)
    allFiles = []
    for folder, folders, files in os.walk(root):
        for file in files: allFiles+=[os.path.join(folder,file)]
    return allFiles


for i in range(100): files = listFiles1("src") # warm up

start = time.time()
for i in range(100): files = listFiles1("src") # listdir
print("Time taken: %.2fs"%(time.time()-start)) # 0.28s

start = time.time()
for i in range(100): files = listFiles2("src") # listdir and join
print("Time taken: %.2fs"%(time.time()-start)) # 0.38s

start = time.time()
for i in range(100): files = listFiles3("src") # walk
print("Time taken: %.2fs"%(time.time()-start)) # 0.42s

start = time.time()
for i in range(100): files = listFiles4("src") # walk and join
print("Time taken: %.2fs"%(time.time()-start)) # 0.47s

সুতরাং আপনি নিজের জন্য যেমন দেখতে পাচ্ছেন, listdirসংস্করণটি আরও কার্যকর। (এবং এটি joinধীর)

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