পাইথনে প্রদত্ত ডিরেক্টরিতে আমি সমস্ত ফাইলের (এবং ডিরেক্টরিগুলি) একটি তালিকা কীভাবে পেতে পারি?
পাইথনে প্রদত্ত ডিরেক্টরিতে আমি সমস্ত ফাইলের (এবং ডিরেক্টরিগুলি) একটি তালিকা কীভাবে পেতে পারি?
উত্তর:
ডিরেক্টরি ট্রিতে প্রতিটি ফাইল এবং ডিরেক্টরিকে অতিক্রম করার এই উপায়:
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')
for subdirname in dirnames: if subdirname != '.git'
তুমি ব্যবহার করতে পার
os.listdir(path)
রেফারেন্স এবং আরও ওএস ফাংশনগুলির জন্য এখানে দেখুন:
os.scandir
, যেহেতু অনেক ক্ষেত্রে এটি আপনাকে একটি বিনামূল্যে স্পিডআপ দেয় (আইপিসি এবং আইও উভয় ধীরে ধীরে) দেয় এমন সিস্টেম কল প্রতিরোধ করতে দেয়।
os.path.isdir
।
এখানে আমি প্রায়শই ব্যবহার করি এমন একটি সহায়ক ফাংশন:
import os
def listdir_fullpath(d):
return [os.path.join(d, f) for f in os.listdir(d)]
আপনার যদি গ্লোব্বিং দক্ষতার প্রয়োজন হয় তবে তার জন্য একটি মডিউলও রয়েছে। উদাহরণ স্বরূপ:
import glob
glob.glob('./[0-9].*')
এমন কিছু ফেরত দেবে:
['./1.gif', './2.txt']
ডকুমেন্টেশন এখানে দেখুন ।
এটা চেষ্টা কর:
import os
for top, dirs, files in os.walk('./'):
for nm in files:
print os.path.join(top, nm)
কোনও পাথ নির্দিষ্ট না করেই বর্তমান ওয়ার্কিং ডিরেক্টরিতে ফাইলগুলির জন্য
পাইথন ২.7:
import os
os.listdir(os.getcwd())
পাইথন 3.x:
import os
os.listdir()
অজগর 3.x মন্তব্য করার জন্য স্ট্যাম ক্যালিকে ধন্যবাদ
os.listdir()
ডিফল্ট হিসাবে বর্তমান ডিরেক্টরিতে উপাদান তালিকা! সুতরাং কোনও দরকার নেই os.getcwd()
:)
একটি পুনরাবৃত্তিমূলক বাস্তবায়ন
import os
def scan_dir(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
print path
else:
scan_dir(path)
আমার প্রয়োজন সমস্ত অপশন সহ আমি একটি দীর্ঘ সংস্করণ লিখেছিলাম: 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:])
এখানে আরও একটি বিকল্প রয়েছে।
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 () সর্বদা ইউনিক্সে একটি সিস্টেম কল প্রয়োজন তবে উইন্ডোজে প্রতীকী লিঙ্কগুলির জন্য কেবল একটির প্রয়োজন।
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'),
কেবল পুনরাবৃত্তভাবে ফাইল তালিকাভুক্ত করার জন্য একটি দুর্দান্ত একটি লাইনার। আমি এটি আমার সেটআপ.পি প্যাকেজ_ডাটা নির্দেশিকায় ব্যবহার করেছি:
import os
[os.path.join(x[0],y) for x in os.walk('<some_directory>') for y in x[2]]
আমি জানি এটি প্রশ্নের উত্তর নয়, তবে কাজে আসতে পারে
#!/bin/python2
import os
def scan_dir(path):
print map(os.path.abspath, os.listdir(pwd))
ফিল্টার এবং মানচিত্রের জন্য আপনার এগুলি তালিকা সহ মোড়ানো দরকার ()
#!/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)])
এখানে এক লাইনের পাইথোনিক সংস্করণ রয়েছে:
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)]
এই কোডটি প্রদত্ত ডিরেক্টরি নামে সমস্ত ফাইল এবং ডিরেক্টরিগুলির সম্পূর্ণ পথের তালিকা করে।
#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()
এফওয়াইআই এক্সটেনশনের ফিল্টার যুক্ত করুন বা এক্স ফাইল ফাইল আমদানি করুন
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
নীচে কোড ডিরেক্টরিতে এবং 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)
আমার সাথে যেটি কাজ করেছে সে হ'ল উপরের উত্তর উত্তর থেকে পরিবর্তিত সংস্করণ।
কোডটি নিম্নরূপ:
"dir = 'প্রদত্ত_ডাইরেক্টরি_নাম' ফাইলের নাম = = [os.path.abspath (os.path.join (dir, i)) আমি i. osdistir (dir)] এর জন্য"