পাইথনের ডিরেক্টরিগুলির সমস্ত ফাইল কীভাবে তালিকাভুক্ত করব এবং এগুলিতে একটি যুক্ত করতে পারি list
?
পাইথনের ডিরেক্টরিগুলির সমস্ত ফাইল কীভাবে তালিকাভুক্ত করব এবং এগুলিতে একটি যুক্ত করতে পারি list
?
উত্তর:
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
(_, _, filenames) = walk(mypath).next()
(যদি আপনি বিশ্বাস করেন যে
f.extend(filenames)
আসলে সমতুল্য নয় f = f + filenames
। জায়গায় স্থান extend
পরিবর্তন করবে f
, যেখানে যুক্ত করা একটি নতুন মেমরি অবস্থানে একটি নতুন তালিকা তৈরি করে। এর অর্থ extend
সাধারণত তুলনায় আরও কার্যকর +
, তবে একাধিক বস্তু তালিকায় রেফারেন্স রাখলে এটি কখনও কখনও বিভ্রান্তির কারণ হতে পারে। শেষ অবধি, এটি লক্ষ করার মতো যে এটির f += filenames
সমতুল্য f.extend(filenames)
, নয় f = f + filenames
।
_, _, filenames = next(walk(mypath), (None, None, []))
(_, _, filenames) = next(os.walk(mypath))
আমি glob
মডিউলটি ব্যবহার করতে পছন্দ করি কারণ এটি প্যাটার্ন মেলা এবং সম্প্রসারণ করে।
import glob
print(glob.glob("/home/adam/*.txt"))
এটি কোয়েড করা ফাইলগুলির সাথে একটি তালিকা ফিরিয়ে দেবে:
['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]
/home/user/foo/bar/hello.txt
, তারপর, ডিরেক্টরিতে চলমান থাকলে foo
, glob("bar/*.txt")
ফেরত আসবে bar/hello.txt
। এমন কিছু ঘটনা রয়েছে যখন আপনি বাস্তবে সম্পূর্ণ (অর্থাত্ পরম) পথ চান; এই ক্ষেত্রেগুলির জন্য, stackoverflow.com
glob.glob("*")
হবে।
x=glob.glob("../train/*.png")
যতক্ষণ আমি ফোল্ডারের নাম জানি ততক্ষণ আমার পথের একটি অ্যারে দেবে। খুবই ভাল!
পাইথন 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()
import os
os.listdir("somedirectory")
"কিছু ডিরেক্টরি" ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরিগুলির তালিকা ফিরিয়ে দেবে।
glob.glob
os.listdir()
সর্বদা নিখুঁত ফাইলের নামগুলি দেয় (আপেক্ষিক পাথ নয়)। কি glob.glob()
ফেরত দেয় তা ইনপুট প্যাটার্নের পথ বিন্যাস দ্বারা চালিত হয়।
কেবলমাত্র ফাইলগুলির তালিকা পাওয়ার জন্য একটি লাইন সমাধান (কোনও উপ-ডিরেক্টরি নেই):
filenames = next(os.walk(path))[2]
বা পরম পথের নাম:
paths = [os.path.join(path, fn) for fn in next(os.walk(path))[2]]
import os
। glob()
আমার চেয়ে কম সংক্ষিপ্ত বলে মনে হচ্ছে ।
glob()
এটি একটি ফাইল হিসাবে বিবেচিত হবে। আপনার পদ্ধতি এটি একটি ডিরেক্টরি হিসাবে বিবেচনা করবে।
একটি ডিরেক্টরি এবং এর সমস্ত সাব-ডিরেক্টরি থেকে পুরো ফাইল পাথ প্রাপ্ত
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")
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
সংস্করণ 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 গুণ বেড়েছে ।
আমি নীচে শ্যাডোর্যাঙ্গারের মন্তব্য পড়ারও পরামর্শ দিই।
list
। যদি পছন্দ হয় তবে p.name
প্রথম p
বিকল্পটির পরিবর্তে ব্যবহার করতে পার ।
pathlib.Path()
উদাহরণগুলি উত্সাহিত করতে পছন্দ করব কারণ তাদের অনেকগুলি দরকারী পদ্ধতি রয়েছে যা আমি বর্জ্য নষ্ট করতে চাই না। আপনি str(p)
তাদের কাছে পথের নামের জন্য কল করতে পারেন ।
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
সুবিধার জন্য)।
entry.name
কেবল ফাইলের নাম entry.path
পেতে বা এটির পুরো পথ পেতে ব্যবহার করতে পারেন । সমস্ত জায়গায় আর os.path.join () নেই।
যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল, আমি কল্পনা করেছিলাম পাইথন 2 , এলটিএস সংস্করণ ছিল, তবে কোড নমুনাগুলি পাইথন 3 ( .5 ) দ্বারা চালিত হবে (আমি এগুলিকে পাইথন 2 হিসাবে যথাসম্ভব আনুগত্যযুক্ত রাখব ; এছাড়াও, যে কোনও কোডের অন্তর্ভুক্ত) পাইথন আমি পোস্ট করতে যাচ্ছি, v3.5.4 থেকে - অন্যথায় নির্দিষ্ট না করা পর্যন্ত)। প্রশ্নটির অন্য কীওয়ার্ডের সাথে এর পরিণতি রয়েছে: " এগুলিকে একটি তালিকায় যুক্ত করুন ":
>>> 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
[পাইথন 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']
[পাইথন 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
[পাইথন 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
পুরানো সংস্করণে) ব্যবহার করে[পাইথন 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
[পাইথন 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']
দ্রষ্টব্য :
[পাইথন 2]: dircache.listdir (পথ) ( পাইথন 2 শুধুমাত্র)
os.listdir
ক্যাশে সঙ্গে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
[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()
দ্রষ্টব্য :
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']]
[অ্যাক্টিভ স্টেট। ডকস]: 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']
দ্রষ্টব্য :
win32file.FindFilesW
অংশ পাইথন উইন্ডোজ (pywin32) এক্সটেনশানগুলি জন্য - mhammond / pywin32: [GitHub] , যা একটি হল পাইথন উপর মোড়কের WINAPI গুলিদ্রষ্টব্য :
কোডটি বহনযোগ্য হতে বোঝাচ্ছে (নির্দিষ্ট জায়গাকে লক্ষ্য করে এমন স্থানগুলি বাদ দিয়ে - যা চিহ্নিত রয়েছে) বা ক্রস:
উপরের রূপগুলি জুড়ে একাধিক পাথ শৈলী (পরমাত্মীয়, আত্মীয়) ব্যবহৃত হয়েছিল, ব্যবহৃত "সরঞ্জাম" এই দিকটিতে নমনীয় তা এই সত্যটি চিত্রিত করার জন্য
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 থেকে ) এর মধ্যে যে কোনও একটি ব্যবহার করে প্রয়োগ করা যেতে পারে ( কারওর জন্য আরও বেশি কাজের প্রয়োজন হবে এবং কিছুটা কম)
filter_func=lambda x: True
(এই আউট স্ট্রিপ নেই যেকোনো কিছু) এবং _get_dir_ কনটেন্টের অভ্যন্তরের মতো কিছু: if not filter_func(entry_with_path): continue
(যদি ফাংশনটি একটি প্রবেশের ক্ষেত্রে ব্যর্থ হয় তবে এটি এড়ানো হবে), তবে কোডটি যত জটিল হবে তত বেশি সময় লাগবেনোটা বেন! যেহেতু পুনরাবৃত্তি ব্যবহৃত হয়, তাই আমি অবশ্যই উল্লেখ করতে পারি যে আমি আমার ল্যাপটপে কিছু পরীক্ষা করেছি ( উইন 10 x64 ), এই সমস্যার সাথে পুরোপুরি সম্পর্কিত নয়, এবং যখন পুনরাবৃত্তি স্তরটি কোথাও (990 .. 1000) পরিসরের মানগুলিতে পৌঁছেছিল ( পুনরাবৃত্তি - 1000 (ডিফল্ট)), আমি স্ট্যাক ওভারফ্লো পেয়েছি :)। ডিরেক্টরি গাছ যদি সেই সীমা অতিক্রম করে (আমি কোনও এফএস বিশেষজ্ঞ নই , সুতরাং এটি সম্ভব কিনা তাও আমি জানি না), সমস্যা হতে পারে।
আমার এও উল্লেখ করতে হবে যে আমি পুনরাবৃত্তিমূলকতা বাড়ানোর চেষ্টা করিনি কারণ এ অঞ্চলে আমার কোনও অভিজ্ঞতা নেই ( ওএস- তে স্ট্যাক বাড়ানোর আগে আমি কতটা বাড়িয়ে তুলতে পারি)স্তর), তবে তত্ত্বের ক্ষেত্রে সর্বদা ব্যর্থতার সম্ভাবনা থাকবে, যদি ডিয়ার গভীরতা সর্বাধিক সম্ভাব্য পুনরাবৃত্তি (সেই মেশিনে) এর চেয়ে বড় হয়
কোড নমুনা কেবল বিক্ষোভমূলক উদ্দেশ্যে। এর অর্থ হ'ল আমি ত্রুটি পরিচালনার বিষয়টি অ্যাকাউন্টে নিই না (আমি মনে করি না / চেষ্টা করেছি / বাদে / অন্যথায় / অবশেষে অবরুদ্ধ আছে), তাই কোডটি শক্ত নয় (কারণটি: এটি যতটা সম্ভব সহজ এবং সংক্ষিপ্ত রাখা) )। জন্য উৎপাদন , ত্রুটি পরিচালনা পাশাপাশি যুক্ত করা উচিত
পাইথনকে কেবল একটি মোড়ক হিসাবে ব্যবহার করুন
আমি জানি যে সর্বাধিক বিখ্যাত গন্ধটি আমি সিস্টেম অ্যাডমিনিস্ট্রেটর পদ্ধতির কলকে বলে থাকি :
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
সাধারণভাবে এই পদ্ধতিকে এড়ানো উচিত, যেহেতু কিছু কমান্ড আউটপুট ফর্ম্যাট ওএস সংস্করণ / স্বাদগুলির মধ্যে কিছুটা পৃথক হয় , পার্সিং কোডটিও ঠিকঠাক করা উচিত; স্থানীয় মধ্যে পার্থক্য উল্লেখ না)।
একই নামের মডিউল থেকে আপনি ব্যবহার করার পরামর্শ দিয়ে আদমকের উত্তরটি সত্যিই পছন্দ করেছি 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'))
আশা করি এই উদাহরণগুলি আপনাকে স্ট্যান্ডার্ড পাইথন গ্রন্থাগার মডিউলগুলিতে পাওয়া কয়েকটি ফাংশনের শক্তি দেখতে সহায়তা করবে।
**
আপনি যতক্ষণ সেট করেন ততক্ষণ কাজ করে recursive = True
। দস্তাবেজগুলি এখানে দেখুন: docs.python.org/3.5/library/glob.html#glob.glob
আপনি যদি পাইথনের প্রয়োগের সন্ধানের সন্ধান করেন তবে এটি একটি রেসিপি যা আমি প্রায়শই ব্যবহার করি:
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
সুতরাং আমি এটি থেকে একটি পিপিআই প্যাকেজ তৈরি করেছি এবং একটি গিটহাবের সংগ্রহশালাও রয়েছে । আমি আশা করি যে কেউ এই কোডটির জন্য এটি সম্ভাব্যরূপে দরকারী বলে মনে করছেন।
বৃহত্তর ফলাফলের জন্য, আপনি জেনারেটরের সাথে মডিউলটির 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
অপারেটর ফানক ছেড়ে দেয় তবে তার বর্তমান অবস্থা বজায় রাখে এবং এটি কেবল ফাইল হিসাবে সনাক্ত হওয়া প্রবেশের নামটি ফিরিয়ে দেয়। উপরের সমস্তটি আমাদের জেনারেটরের ফাংশনটি লুপ করতে দেয়।
পরম ফাইলপথগুলির একটি তালিকা ফিরিয়ে দেওয়া, উপ-ডিরেক্টরিতে পুনরাবৃত্তি করে না
L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))]
os.path.abspath(f)
জন্য কিছুটা সস্তা বিকল্প হবে os.path.join(os.getcwd(),f)
।
cwd = os.path.abspath('.')
, তবে এর cwd
পরিবর্তে '.'
এবং os.getcwd()
পুরো জায়গায় ব্যবহার করা হবে যাতে অতিরিক্ত অপ্রয়োজনীয় সিস্টেম কলগুলি এড়ানো যায়।
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
এখানে আমি পুনরাবৃত্তাকার কাঠামো ব্যবহার করি।
একজন জ্ঞানী শিক্ষক আমাকে একবার বলেছিলেন:
যখন কিছু করার জন্য কয়েকটি প্রতিষ্ঠিত পদ্ধতি রয়েছে, সেগুলির কোনওটিই সব ক্ষেত্রে ভাল হয় না।
আমি এইভাবে সমস্যার সাবসেটের জন্য একটি সমাধান যুক্ত করব : প্রায়শই আমরা কেবল যাচাই করতে চাই যে কোনও ফাইল সাব-ডিরেক্টরিতে না গিয়ে কোনও প্রারম্ভিক স্ট্রিং এবং শেষ স্ট্রিংয়ের সাথে মেলে কিনা। আমরা এভাবে একটি ফাংশন চাই যা ফাইলনামগুলির একটি তালিকা ফিরিয়ে দেয়, যেমন:
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
যদি নিজের প্যাটার্নগুলি সর্বদা ফাইলের শুরু বা শেষের সাথে আঁকতে না চান তবে আপনি একটি যুক্তি যুক্ত করতে চাইতে পারেন )।
পাইথন ৩.৪++ এর জন্য আর একটি খুব পঠনযোগ্য রূপটি প্যাথলিব ব্যবহার করছে 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()]
এটির জন্য আমার সাধারণ উদ্দেশ্যে কাজটি এখানে। এটি ফাইলের পরিবর্তে ফাইলের পাথের একটি তালিকা ফেরত দেয় যেহেতু আমি আরও দরকারী বলে খুঁজে পেয়েছি। এটিতে কয়েকটি 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)]
আমি একটি নমুনা ওয়ান লাইনার সরবরাহ করব যেখানে ইনপুট হিসাবে সোসারসেপথ এবং ফাইল টাইপ সরবরাহ করা যেতে পারে। কোডটি সিএসভি এক্সটেনশান সহ ফাইলের নামের একটি তালিকা দেয়। ব্যবহার । সব ফাইল ফেরত দেওয়ার প্রয়োজনে। এটি পুনরাবৃত্তভাবে সাব-ডিরেক্টরিকে স্ক্যান করবে।
[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]
ফাইল এক্সটেনশানগুলি এবং উত্সের পথটি প্রয়োজনীয় হিসাবে সংশোধন করুন।
glob
তবে কেবল ব্যবহার করুন glob('**/*.csv', recursive=True)
। os.walk()
পুনরাবৃত্তি করার জন্য এটি একত্রিত করার দরকার নেই ( recursive
এবং **
পাইথন 3.5 এর পরে সমর্থিত)।
পাইথন 2 এর জন্য: পিপ ইনস্টল করুন rglob
import rglob
file_list=rglob.rglob("/home/base/dir/", "*")
print file_list
ডারচেচে "সংস্করণ ২.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