python - আমি কিভাবে একটি ডিরেক্টরি সব ফাইল তালিকাভুক্ত করা হবে?




directory (20)

পাইথন 2 এবং 3 এর সাথে ফাইলগুলির একটি তালিকা পান

আমি এখানে একটি সংক্ষিপ্ত ভিডিও তৈরি করেছি: পাইথন: কিভাবে একটি ডিরেক্টরিতে ফাইল তালিকা পেতে

os.listdir ()

অথবা ..... বর্তমান ডিরেক্টরির মধ্যে সমস্ত ফাইল (এবং ডিরেক্টরি) পেতে কিভাবে (Python 3)

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

>>> import os
>>> arr = os.listdir()
>>> arr
['$RECYCLE.BIN', 'work.txt', '3ebooks.txt', 'documents']

গ্লোব ব্যবহার করে

আমি glob একই ধরনের ফাইল বা সাধারণ কিছু সঙ্গে নির্বাচন করতে পাওয়া যায়। নিচের উদাহরণটি দেখুন:

import glob

txtfiles = []
for file in glob.glob("*.txt"):
    txtfiles.append(file)

তালিকা বোঝার ব্যবহার

import glob

mylist = [f for f in glob.glob("*.txt")]

Os.path.abspath দিয়ে সম্পূর্ণ পাথ নাম পাচ্ছেন

আপনি লক্ষ্য করেছেন, আপনার উপরের কোডটিতে ফাইলটির সম্পূর্ণ পথ নেই। যদি আপনার পরম পথ থাকা দরকার, তবে আপনি os.path মডিউলটির অন্য ফাংশনটি os.path নামক ব্যবহার করতে পারেন, যা আপনি os.listdir() থেকে একটি ফাইল হিসাবে যুক্ত করেন। সম্পূর্ণ পথ থাকার অন্যান্য উপায় রয়েছে, যেমন আমরা পরে পরীক্ষা করব (আমি প্রতিস্থাপিত করেছি, যেমন মেক্সিকেক্স, _getfullpathname দ্বারা abspath )।

>>> import os
>>> files_path = [os.path.abspath(x) for x in os.listdir()]
>>> files_path
['F:\\documenti\applications.txt', 'F:\\documenti\collections.txt']

হাঁটার সাথে সমস্ত উপড্রাইরেক্টরিতে একটি ধরনের ফাইলের সম্পূর্ণ পাথ নাম পান

আমি অনেক ডিরেক্টরিগুলিতে স্টাফ খুঁজে পেতে এই খুব দরকারী খুঁজে পেয়েছি, এবং এটি আমাকে এমন একটি ফাইল খুঁজে পেতে সাহায্য করেছে যা সম্পর্কে আমার নাম মনে হয়নি:

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 ".docx" in file:
            print(os.path.join(r, file))

os.listdir (): বর্তমান ডিরেক্টরিতে ফাইলগুলি পান (পাইথন 2)

পাইথন 2 এ আপনি যদি বর্তমান ডিরেক্টরির মধ্যে ফাইলগুলির তালিকা চান তবে আপনাকে 'arg' হিসাবে যুক্তি দিতে হবে। অথবা os.getcwd () os.listdir পদ্ধতিতে।

>>> import os
>>> arr = os.listdir('.')
>>> 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')
>>> 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]
>>> arr
['5bs_Turismo1.pdf', '5bs_Turismo1.pptx', 'esperienza.txt']

গ্লোব মডিউল - সব ফাইল

import glob
print(glob.glob("*"))

out:['content', 'start.py']

পরবর্তী (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)

>output

F:\\_python\\dict_class.py
F:\\_python\\programmi.txt

পরবর্তী (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 - পূর্ণ পথ পেতে - সব dirs মধ্যে সব ফাইল

x = [os.path.join(r,file) for r,d,f in os.walk("F:\\_python") for file in f]

>>>x
['F:\\_python\\dict.py', 'F:\\_python\\progr.txt', 'F:\\_python\\readl.py']

os.listdir () - শুধুমাত্র txt ফাইল পান

>>> arr_txt = [x for x in os.listdir() if x.endswith(".txt")]
>>> print(arr_txt)
['work.txt', '3ebooks.txt']

glob - শুধুমাত্র txt ফাইল পেতে

>>> import glob
>>> x = glob.glob("*.txt")
>>> x
['ale.txt', 'alunni2015.txt', 'assenze.text.txt', 'text2.txt', 'untitled.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

গ্লব অন্যান্য ব্যবহার

যদি আমি ডিরেক্টরির মধ্যে সব ফাইল চান:

>>> x = glob.glob("*")

তালিকা ডিরেক্টরি এড়ানোর জন্য os.path.isfile ব্যবহার করে

import os.path
listOfFiles = [f for f in os.listdir() if os.path.isfile(f)]
print(listOfFiles)

> output

['a simple game.py', 'data.txt', 'decorator.py']

পাথলিব ব্যবহার করে (পাইথন 3.4)

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

আপনি তালিকা বোঝার ব্যবহার করতে চান

>>> flist = [p for p in pathlib.Path('.').iterdir() if p.is_file()]

* আপনি Pathlib.Path ("।") এর পরিবর্তে শুধুমাত্র pathlib.Path () ব্যবহার করতে পারেন।

Pathlib.Path () মধ্যে glob পদ্ধতি ব্যবহার করুন

import pathlib

py = pathlib.Path().glob("*.py")
for file in py:
    print(file)

আউটপুট:

stack_overflow_list.py
stack_overflow_list_tkinter.py

Os.walk সঙ্গে সব এবং শুধুমাত্র ফাইল পান

import os
x = [i[2] for i in os.walk('.')]
y=[]
for t in x:
    for f in t:
        y.append(f)

>>> 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]
>>> x
['calculator.bat','calculator.py']

পরের সঙ্গে শুধুমাত্র ডিরেক্টরি পান এবং একটি ডিরেক্টরির মধ্যে পদব্রজে ভ্রমণ

>>> import os
>>> next(os.walk('F://python'))[1] # for the current dir use ('.')
['python3','others']

হাঁটার সঙ্গে সব subdir নাম পান

>>> for r,d,f in os.walk("F:\_python"):
...  for dirs in d:
...   print(dirs)
...
.vscode
pyexcel
pyschool.py
subtitles
_metaprogramming
.ipynb_checkpoints

পাইসন 3.5 থেকে os.scandir ()

>>> import os
>>> x = [f.name for f in os.scandir() if f.is_file()]
>>> 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"))

> output

>'F:\\\python' : 12057 files'

Ex.2: কিভাবে একটি ডিরেক্টরি থেকে অন্য ফাইল সব কপি করবেন?

একটি স্ক্রিপ্ট যাতে আপনার কম্পিউটারে একটি ধরনের সমস্ত ফাইল খুঁজে বের করতে পারে (ডিফল্ট: পিপিটিএক্স) এবং একটি নতুন ফোল্ডারে তাদের অনুলিপি করে।

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("------------------------")
        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')


> Output

_compiti18\Compito Contabilità 1\conti.txt
_compiti18\Compito Contabilità 1\modula4.txt
_compiti18\Compito Contabilità 1\moduloa4.txt
------------------------
==> Found in: `_compiti18` : 3 files

যাত্রা। 3: কিভাবে একটি txt ফাইলে সব ফাইল পেতে

যদি আপনি সমস্ত ফাইলের নামের সাথে একটি txt ফাইল তৈরি করতে চান তবে:

import os
mylist = ""
with open("filelist.txt", "w", encoding="utf-8") as file:
    for eachfile in os.listdir():
        mylist += eachfile + "\n"
    file.write(mylist)

উদাহরণ: একটি হার্ড ড্রাইভের সব ফাইলের সাথে txt

"""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")

C: \\ এর সমস্ত ফাইল একটি টেক্সট ফাইলে

এটি পূর্ববর্তী কোডের একটি ছোট সংস্করণ। যদি আপনি অন্য কোনও অবস্থান থেকে শুরু করতে চান তবে ফাইলটি কোথায় খুঁজে পাওয়া যায় তা পরিবর্তন করুন। এই কোডটি আমার কম্পিউটারে পাঠ্য ফাইলটিতে 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")    

একটি নির্দিষ্ট ধরনের ফাইল অনুসন্ধান করার জন্য একটি ফাংশন

আমদানি os

def searchfiles(extension='.ttf'):
    "Create a txt file with all the file of a type"
    with open("file.txt", "w", encoding="utf-8") as filewrite:
        for r, d, f in os.walk("C:\\"):
            for file in f:
                if file.endswith(extension):
                    filewrite.write(f"{r + file}\n")

# looking for ttf file (fonts)
searchfiles('ttf')

কিভাবে আমি পাইথনের একটি ডিরেক্টরিরির সমস্ত ফাইল তালিকাবদ্ধ করতে এবং একটি list পারি?


পার্ট এক 1

প্রাথমিক নোট

  • যদিও প্রশ্ন পাঠ্যতে ফাইল এবং ডিরেক্টরি পদগুলির মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে, তবে কেউ হয়তো যুক্তিযুক্ত হতে পারে যে ডিরেক্টরি আসলেই বিশেষ ফাইল
  • বিবৃতি: " কোনও ডিরেক্টরিের সমস্ত ফাইল " দুটি উপায়ে ব্যাখ্যা করা যেতে পারে:
    1. সমস্ত সরাসরি (বা স্তর 1) বংশধর
    2. পুরো ডিরেক্টরি গাছের সমস্ত বংশবৃদ্ধি (সাব-ডিরেক্টরিগুলিতে যেগুলি রয়েছে)
  • যখন প্রশ্নটি জিজ্ঞেস করা হয়, তখন আমি কল্পনা করি যে পাইথন , এলটিএস সংস্করণ ছিল, তবে কোড নমুনাগুলি পাইথন 3 ( .5 ) দ্বারা চালানো হবে (আমি তাদের পাইথন 2 হিসাবে যথোপযুক্ত সৃষ্টিকর্তা হিসাবে রাখব; এছাড়াও, যে কোনও কোড পাইথন যা আমি পোস্ট করতে যাচ্ছি, v3.5.4 থেকে - যদি না অন্যথায় উল্লেখ করা হয়)। এর মধ্যে অন্য কোন শব্দ সম্পর্কিত ফলাফল রয়েছে: " তাদের একটি তালিকাতে যুক্ত করুন ":

    • প্রাক পাইথন 2.2 সংস্করণে, ক্রম (এটিরবেবল) বেশিরভাগই তালিকাগুলির দ্বারা উপস্থাপিত হয় (টুপল, সেট, ...)
    • পাইথন 2.2 , জেনারেটরের ধারণা ( [পাইথন]: জেনারেটর ) - [পাইথন] সৌজন্যে : ফলন বিবৃতি ) - চালু করা হয়েছিল। সময়ের পাশাপাশি, জেনারেটরের প্রতিপক্ষগুলি ফাংশনগুলির জন্য উপস্থিত হতে শুরু করে যা তালিকাগুলির সাথে ফেরত / কাজ করে
    • পাইথন 3 , জেনারেটর ডিফল্ট আচরণ
    • এখন, আমি জানি না যে কোনও তালিকা ফেরত নেওয়া এখনও বাধ্যতামূলক (অথবা জেনারেটরও ভাল করবে), তবে list নির্মাতার কাছে জেনারেটরের পাশ দিয়ে এটি একটি তালিকা তৈরি করবে (এবং এটিও ব্যবহার করবে)। নীচের উদাহরণটি [পাইথন] এর পার্থক্যগুলিকে চিত্রিত করে : মানচিত্র ( ফাংশন, পুনরাবৃত্তিযোগ্য, ... )
    Python 2.7.10 (default, Mar  8 2016, 15:02:46) [MSC v.1600 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> m = map(lambda x: x, [1, 2, 3])  # Just a dummy lambda function
    >>> m, type(m)
    ([1, 2, 3], <type 'list'>)
    >>> len(m)
    3
    


    Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 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)  # Construct a list out of the generator
    >>> lm0, type(lm0)
    ([1, 2, 3], <class 'list'>)
    >>>
    >>> lm1 = list(m)  # Construct a list out of the same generator
    >>> lm1, type(lm1)  # Empty list this time - generator already consumed
    ([], <class 'list'>)
    
  • উদাহরণগুলি root_dir নামক ডিরেক্টরিটিতে নিম্নলিখিত কাঠামোর সাহায্যে স্থাপিত হবে (এই উদাহরণটি Win এর জন্য, তবে আমি Ux ( Lnx ) এর জন্য ফোল্ডার ট্রি সদৃশ করেছি।)

    E:\Work\Dev\\q003207219>tree /f "root_dir"
    Folder PATH listing for volume Work
    Volume serial number is 00000029 3655:6FED
    E:\WORK\DEV\\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
    


সলিউশন

প্রোগ্রাম্যাটিক পন্থা:

  1. [পাইথন]: ওএস। listdir ( পাথ = '।' )

    পাথ দ্বারা প্রদত্ত ডিরেক্টরির মধ্যে এন্ট্রি নাম ধারণকারী একটি তালিকা ফেরত। তালিকা ইচ্ছাকৃতভাবে আদেশ, এবং বিশেষ এন্ট্রি অন্তর্ভুক্ত করা হয় না '.' এবং '..' ...


    >>> 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 the items and only keep files (strip out directories)
    ['file0', 'file1']
    

    এখানে আরো বিস্তারিত উদাহরণ রয়েছে ( code_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()
    

    নোট :

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


    আউটপুট :

    (py35x64_test) E:\Work\Dev\\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']
    


  1. [পাইথন]: ওএস। স্ক্যান্ডির ( পাথ = '।' ) ( !!! পাইথন 3.5+ !!! যদিও আমি মনে করি যে আগের সংস্করণগুলির জন্য এটি একটি পৃথক মডিউল ছিল ( পাইথন 2 এও পোর্ট করা হয়েছে))

    পাথ দ্বারা প্রদত্ত ডিরেক্টরির মধ্যে এন্ট্রির অনুরূপ os.DirEntry বস্তুর একটি os.DirEntry Return। এন্ট্রি ইচ্ছাকৃত আদেশ, এবং বিশেষ এন্ট্রি '.' এবং '..' অন্তর্ভুক্ত করা হয় না।

    Listdir () এর পরিবর্তে scandir () ব্যবহার করে উল্লেখযোগ্যভাবে কোডের কার্যকারিতা বৃদ্ধি করতে পারে যা ফাইল টাইপ বা ফাইলের বৈশিষ্ট্য সম্পর্কিত os.DirEntry , কারণ ডিরেক্টরি স্ক্যান করার সময় অপারেটিং সিস্টেম এটি সরবরাহ করলে os.DirEntry বস্তুগুলি এই তথ্য প্রকাশ করে। সমস্ত os.DirEntry পদ্ধতি একটি সিস্টেম কল সঞ্চালন করতে পারে, তবে is_file() এবং is_file() সাধারণত সিম্বলিক লিঙ্কগুলির জন্য শুধুমাত্র একটি সিস্টেম কল প্রয়োজন; os.DirEntry.stat() সর্বদা ইউনিক্সে একটি সিস্টেম কল প্রয়োজন তবে শুধুমাত্র 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
    • কিন্তু এটি আরও বেশি নমনীয় (এবং আরো কার্যকারিতা উপলব্ধ করে), আরও পাইথন আইসি (এবং কিছু ক্ষেত্রে, দ্রুত)


  1. [পাইথন]: ওএস। পদব্রজে ভ্রমণ ( শীর্ষ, topdown = সত্য, সন্ত্রস্ত = কেউ না, followlinks = মিথ্যা )

    গাছটি হাঁটতে উপরের দিকে বা নীচের দিকে হাঁটতে একটি ডিরেক্টরি গাছের ফাইল নাম তৈরি করুন। গাছ ডিরেক্টরিতে মূলী প্রতিটি ডিরেক্টরির জন্য শীর্ষ (তত্সহ শীর্ষ নিজেই), এটি একটি 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\\\\q003207219\\root_dir'
    >>>
    >>> walk_generator = os.walk(root_dir)
    >>> root_dir_entry = next(walk_generator)  # First entry corresponds to the root dir (that was passed as an argument)
    >>> root_dir_entry
    ('E:\\Work\\Dev\\\\q003207219\\root_dir', ['dir0', 'dir1', 'dir2', 'dir3'], ['file0', 'file1'])
    >>>
    >>> root_dir_entry[1] + root_dir_entry[2]  # Display the dirs and the files (that are 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\\\\q003207219\\root_dir\\dir0', 'E:\\Work\\Dev\\\\q003207219\\root_dir\\dir1', 'E:\\Work\\Dev\\\\q003207219\\root_dir\\dir2', 'E:\\Work\\Dev\\\\q003207219\\root_dir\\dir3', 'E:\\Work\\Dev\\\\q003207219\\root_dir\\file0', 'E:\\Work\\Dev\\\\q003207219\\root_dir\\file1']
    >>>
    >>> for entry in walk_generator:  # Display the rest of the elements (corresponding to every subdir)
    ...     print(entry)
    ...
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0', ['dir00', 'dir01', 'dir02'], [])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0\\dir00', ['dir000'], ['file000'])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0\\dir00\\dir000', [], ['file0000'])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0\\dir01', [], ['file010', 'file011'])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0\\dir02', ['dir020'], [])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0\\dir02\\dir020', ['dir0200'], [])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir0\\dir02\\dir020\\dir0200', [], [])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir1', [], ['file10', 'file11', 'file12'])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir2', ['dir20'], ['file20'])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir2\\dir20', [], ['file200'])
    ('E:\\Work\\Dev\\\\q003207219\\root_dir\\dir3', [], [])
    

    নোট :

    • দৃশ্যের অধীনে, এটি ব্যবহার করে os.listdir( os.scandirযেখানে উপলব্ধ)
    • এটা subfolders মধ্যে পুনরাবৃত্তি দ্বারা ভারী উত্তোলন করে


  1. [পাইথন]: গ্লোব। 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
    • বড় গাছের জন্য (বিশেষ করে যদি recursiveথাকে), iglobপছন্দ করা হয়
    • নাম উপর ভিত্তি করে উন্নত ফিল্টারিং অনুমতি দেয় (ওয়াইল্ডকার্ড কারণে)


  1. [পাইথন]: ক্লাস Pathlib। পাথ ( * pathsegments ) ( !!! পাইথন 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']
    

    নোট :

    • এটি আমাদের লক্ষ্য অর্জনের এক উপায়
    • এটি পাথ হ্যান্ডলিং OOP শৈলী
    • কার্যকারিতা প্রচুর প্রস্তাব


  1. [পাইথন]: dircache.listdir (পথ) ( !!! পাইথন 3 মুছে ফেলা !!! )

    • কিন্তু, $ {PYTHON_SRC_DIR} / lib / dircache.py : ~ # 20 + ( v2.7.14 থেকে ) অনুসারে, এটি কেবল একটি (পাতলা) মোড়ানো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
    


  1. [ম্যান]: OPENDIR (3) / [ম্যান]: READDIR (3) / [ম্যান]: বন্ধক (3) [পাইথন] মাধ্যমে : ctypes - পাইথন জন্য একটি বিদেশী ফাংশন লাইব্রেরি ( !!! Ux নির্দিষ্ট !!! )

    ctypes পাইথন জন্য একটি বিদেশী ফাংশন লাইব্রেরি। এটি সি সামঞ্জস্যপূর্ণ ডাটা প্রকার সরবরাহ করে এবং DLL বা ভাগ করা লাইব্রেরিগুলিতে কলিং ফাংশনগুলিকে অনুমতি দেয়। এটি বিশুদ্ধ Python মধ্যে এই লাইব্রেরি মোড়ানো ব্যবহার করা যেতে পারে।

    code_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, sizeof
    
    
    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 = CDLL(None)
    opendir = libc_dll.opendir
    readdir = libc_dll.readdir
    closedir = libc_dll.closedir
    libc_dll.__errno_location.restype = POINTER(c_int)
    errno_loc_func = libc_dll.__errno_location
    
    
    def _get_errno():
        return "errno: {:d}({:d})".format(get_errno(), errno_loc_func().contents.value)
    
    
    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 ({:s})".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() or errno_loc_func().contents.value:
            print("readdir returned NULL ({:s})".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()
    

    নোট :

    • এটি libc (বর্তমান প্রক্রিয়ায়ে লোড করা) থেকে তিনটি ফাংশন লোড করে এবং তাদের কল করে (আরো বিস্তারিত জানার জন্য [স্ট্যাক ওভারফ্লো]: কিভাবে আমি পাইথন ব্যবহার করে একটি ফাইল বিদ্যমান কিনা তা পরীক্ষা করব? (@ ক্রিশ্ফাতির উত্তর) - আইটেম # 4 থেকে শেষ নোট )। যে পাইথন / সি প্রান্ত খুব কাছাকাছি এই পদ্ধতি রাখবে
    • LinuxDirent64হয় ctypes প্রতিনিধিত্ব struct dirent64থেকে dirent.h (তাই হয় DT_*: আমার মেশিন থেকে ধ্রুবক) Ubtu 16 x64 ( 4.10.0-40-জেনেরিক এবং libc6-দেব: AMD64 )। অন্যান্য স্বাদ / সংস্করণগুলিতে, গঠন সংজ্ঞাটি ভিন্ন হতে পারে, এবং যদি তাই হয় তবে ctypes ওরফে আপডেট হওয়া উচিত নয়, অন্যথায় এটি অনির্ধারিত আচরণ উত্পন্ন করবে
    • errno_loc_func(এবং এর সাথে সম্পর্কিত সবকিছু) কারণ ফিনকগুলি errnoত্রুটির ক্ষেত্রে সেট থাকে , এবং এর মূল্য যাচাই করতে হবে। দৃশ্যত, get_errnoকাজ করে না (একটি অবৈধ নাম, opendirআয় NULL, কিন্তু get_errnoএখনও 0 প্রদান করে), বা আমি এখনো এটি খুঁজে বের করে নি
    • এটি os.walkফরম্যাটে তথ্য ফেরত দেয় । আমি এটি পুনরাবৃত্তি করতে বিরক্ত না, কিন্তু বিদ্যমান কোড থেকে শুরু, যে একটি মোটামুটি তুচ্ছ কাজ হবে
    • সবকিছুর উপর করা সম্ভব হয় উইন পাশাপাশি, তথ্য (লাইব্রেরি, ফাংশন, structs মধ্যে, ধ্রুবক, ...) পার্থক্য


    আউটপুট :

    [email protected]:~/work//q003207219$ ./code_ctypes.py
    3.5.2 (default, Nov 23 2017, 16:37:01)
    [GCC 5.4.0 20160609] on linux
    
    ['root_dir', ['dir3', 'dir2', 'dir0', 'dir1'], ['file0', 'file1']]
    


  1. [অ্যাক্টিভেটেট]: win32file.FindFilesW ( !!! Win নির্দিষ্ট !!! )

    উইন্ডোজ ইউনিকোড 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']
    

    নোট :


  1. কিছু (অন্যান্য) তৃতীয় পক্ষের প্যাকেজ ইনস্টল করুন যে কৌশল
    • সম্ভবত, উপরে (অথবা সামান্য কাস্টমাইজেশন সহ) এক (বা আরো) উপর নির্ভর করবে


নোট (উপরে স্টাফ সম্পর্কে):

  • কোডটি পোর্টেবল হতে পারে (নির্দিষ্ট এলাকাগুলিকে লক্ষ্য করে এমন স্থানগুলি ছাড়া - যা চিহ্নিত করা হয়) বা ক্রস:
    • প্ল্যাটফর্ম ( Ux , জয় ,)
    • পাইথন সংস্করণ (2, 3,)
  • একাধিক পাথ শৈলী (পরম, আত্মীয়) উপরের উপায়ে ব্যবহার করা হয়েছে, এই নির্দেশে ব্যবহৃত "সরঞ্জামগুলি" নমনীয়
  • os.listdirএবং os.scandirব্যবহার opendir/ readdir/ closedir( [এমএসডিএন]: FindFirstFile ফাংশন / [এমএসডিএন]: FindNextFile ফাংশন / [এমএসডিএন]: FindClose ফাংশন ) (" $ {PYTHON_SRC_DIR} / মডিউলস /posixmodule.c " এর মাধ্যমে)
  • win32file.FindFilesWসেইগুলি ( উইন নির্দিষ্ট) ফাংশনগুলিও ব্যবহার করে ( " $ {PYWIN32_SRC_DIR} /win32/src/win32file.i " মাধ্যমে)
  • get_dir_content(বিন্দু # 1 থেকে ) এই পদ্ধতিগুলির মধ্যে কোনটি ব্যবহার করে প্রয়োগ করা যেতে পারে (কিছুকে আরো কাজ এবং কিছু কম দরকার)
    • কিছু উন্নত ফিল্টারিং (শুধু ফাইল বনাম ডির পরিবর্তে ) করা যেতে পারে: উদাহরণস্বরূপ include_foldersযুক্তিটি অন্য একটি (উদাহরণস্বরূপ filter_func) দ্বারা প্রতিস্থাপিত করা যেতে পারে, যা একটি ফাংশন যা একটি যুক্তি হিসাবে একটি পথ গ্রহণ করবে: filter_func=lambda x: True(এটি কোনও জিনিস ফাঁক করে না) এবং এর get_dir_contentমতো কিছু ভিতরে : if not filter_func(entry_with_path): continue(যদি ফাংশনটি একটি এন্ট্রির জন্য ব্যর্থ হয় তবে এটি বাদ দেওয়া হবে), তবে কোডটি যত জটিল হবে, এটি কার্যকর হবে
  • নোটা বেনিফিট! যেহেতু পুনরাবৃত্তির ব্যবহার করা হয়, আমি যে আমি আমার ল্যাপটপ (চালু কিছু পরীক্ষার করেনি উল্লেখ আবশ্যক উইন 10 x64 ), সম্পূর্ণই এই সমস্যার সম্পর্কহীন, এবং যখন পুনরাবৃত্তির স্তর কোথাও মান পৌঁছনো যায়নি (990 .. 1000) পরিসীমা ( recursionlimit 1000 - (ডিফল্ট)), আমি পেয়েছিলাম :)। যদি ডিরেক্টরি ট্রি সেই সীমা অতিক্রম করে (আমি একজন FS বিশেষজ্ঞ নই , তাই আমি জানি না যে এটিও সম্ভব কিনা), এটি একটি সমস্যা হতে পারে।
    আমি অবশ্যই উল্লেখ করতে হবে যে আমি recursionlimit বৃদ্ধি করার চেষ্টা করিনি কারণ আমার এই এলাকায় কোন অভিজ্ঞতা নেই ( ওএস এ স্ট্যাক বৃদ্ধি করার আগে আমি এটি কতটা বাড়িয়ে তুলতে পারিস্তর), তবে তত্ত্বের মধ্যে সর্বদা ব্যর্থতার সম্ভাবনা থাকবে, যদি ডির গভীরতা সর্বোচ্চ সম্ভাব্য পুনর্ব্যবহারযোগ্যতার চেয়ে বড় হয় (যে মেশিনে)
  • কোড নমুনা শুধুমাত্র প্রদর্শনের উদ্দেশ্যে। এর মানে হল আমি ত্রুটিযুক্ত হ্যান্ডলিং (আমি কোনও try/ except/ else/ finallyব্লক মনে করি না) অ্যাকাউন্টটি বিবেচনায় নিচ্ছি না , তাই কোডটি শক্তিশালী নয় (কারণ হল: এটি যতটা সম্ভব সহজ এবং ছোট রাখতে)। জন্য উৎপাদন , ত্রুটি পরিচালনা পাশাপাশি যুক্ত করা উচিত

পার্ট এক শেষ 1


1. Home এর পোস্ট (প্রশ্ন / উত্তর) সীমা 30000 অক্ষর ( [SE.Meta]: আপনার সীমা জানার কারণে: কোন প্রশ্ন শিরোনাম, পোস্ট, চিত্র এবং লিঙ্ক ব্যবহার করা সর্বাধিক দৈর্ঘ্য কি? ), উত্তর 2 অংশ বিভক্ত ছিল। দয়া করে আরও দেখুন [SO]: আমি কীভাবে একটি ডিরেক্টরিের সমস্ত ফাইল তালিকাবদ্ধ করব? (@ ক্রিশ্ফাতির উত্তর - "পার্ট টু")


আমি glob মডিউল ব্যবহার পছন্দ করি, কারণ এটি প্যাটার্ন মিলিং এবং বিস্তার করে।

import glob
print(glob.glob("/home/adam/*.txt"))

এটি অনুসন্ধানকৃত ফাইলগুলির সাথে একটি তালিকা প্রদান করবে:

['/home/adam/file1.txt', '/home/adam/file2.txt', .... ]

আমি সত্যিই adamk এর উত্তর পছন্দ করেছি, আপনি একই নামের মডিউল থেকে glob() ব্যবহার করেন। এটি আপনাকে * গুলি সহ প্যাটার্ন মেলা করার অনুমতি দেয়।

কিন্তু অন্যান্য ব্যক্তিরা মন্তব্যের মধ্যে উল্লেখ করে, glob() অসঙ্গতিপূর্ণ স্ল্যাশ দিকগুলির উপর তিরস্কার করতে পারে। এর সাথে সাহায্য করার জন্য, আমি আপনাকে expanduser() join() এবং expanduser() ফাংশন এবং সম্ভবত os মডিউলে expanduser() ফাংশনটি ব্যবহার করার পরামর্শ দিচ্ছি।

উদাহরণ হিসাবে:

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'))

উপরেরটি ভাল কাজ করে, তবে এটি ফোল্ডার নামগুলির উপর নির্ভর করে যা প্রায়ই উইন্ডোজগুলিতে পাওয়া যায় এবং অন্যান্য OS তে প্রায়ই পাওয়া যায় না। এটি একটি নির্দিষ্ট নাম, 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'))

আশা করি এই উদাহরণগুলি আপনাকে স্ট্যান্ডার্ড পাইথন লাইব্রেরী মডিউলগুলিতে পাওয়া কিছু ফাংশনগুলির শক্তি দেখতে সহায়তা করবে।


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

এবং শেষ পর্যন্ত, যেমন উদাহরণটি দেখায়, অন্য একটি তালিকা যোগ করে আপনি এটি ব্যবহার করতে পারেন .extend() অথবা

>>> q = [1, 2, 3]
>>> w = [4, 5, 6]
>>> q = q + w
>>> q
[1, 2, 3, 4, 5, 6]

ব্যক্তিগতভাবে, আমি পছন্দ করি .extend()


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

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")
  • উপরের ফাংশনে আমি যে পথটি সরবরাহ করেছি তাতে 3 টি ফাইল রয়েছে- এদের মধ্যে দুটি রুট ডিরেক্টরীতে এবং অন্যটি একটি সাবফোল্ডারের নাম "সাবফোল্ডার"। আপনি এখন কিছু করতে পারেন:
  • print full_file_paths করবে এমন print full_file_paths মুদ্রণ করুন:

    • ['/Users/johnny/Desktop/TEST/file1.txt', '/Users/johnny/Desktop/TEST/file2.txt', '/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat']

আপনি যদি চান তবে আপনি নীচের কোডটিতে ".dat" এক্সটেনশন সহ ফাইলগুলি খুলতে এবং পড়তে পারেন, বা শুধুমাত্র ফোকাস করতে পারেন:

for f in full_file_paths:
  if f.endswith(".dat"):
    print f

/Users/johnny/Desktop/TEST/SUBFOLDER/file3.dat


ফাইলগুলির তালিকা (কোনও উপ-নির্দেশিকা নয়) পেতে একটি এক-লাইন সমাধান:

filenames = next(os.walk(path))[2]

অথবা পরম পথের নাম:

paths = [os.path.join(path,fn) for fn in next(os.walk(path))[2]]

আপনি যদি একটি ভিন্ন ফাইল টাইপ ব্যবহার করতে চান বা পুরো ডিরেক্টরিটি পেতে চান তবে এই ফাংশনটি ব্যবহার করুন:

import os 
os.listdir(path)

একটি ডিরেক্টরির মধ্যে সব ফাইল তালিকা:

import os
from os import path

files = [x for x in os.listdir(directory_path) if path.isfile(directory_path+os.sep+x)]

এখানে, আপনি একটি ডিরেক্টরির মধ্যে সব ফাইল তালিকা পেতে।


জেনারেটর ব্যবহার করে

# python 2.x
import scandir
import sys

de = scandir.scandir(sys.argv[1])
while 1:
    try:
        d = de.next()
        print d.path
    except StopIteration as _:
        break

osলাইব্রেরি ব্যবহার করে ।

import os
def findfiles(directory):
    objects = os.listdir(directory)  # find all objects in a dir

    files = []
    for i in objects:  # check if very object in the folder ...
        if os.path.isfile(os.path.join(directory, i)):  # ... is a file.
            files.append(i)  # if yes, append it.
    return files

@ এডামক এর উত্তরের কথা উল্লেখ করে, @ অ্যান্টি আর্থের স্ল্যাশ অসঙ্গতি মন্তব্যের প্রতিক্রিয়ায় এখানে আমার ওএস সনাক্তকরণ পদ্ধতি

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()]

আমি অনুমান করছি যে আপনি শুধু তালিকায় basenames চান ।

মেথড 1 এর জন্য একাধিক ফাইল বিন্যাস পূর্ব-নির্ধারণের জন্য এই post পড়ুন ।


আমি অনুমান করছি যে আপনার সমস্ত ফাইলগুলি *.txtবিন্যাসে রয়েছে এবং পাথ সহ কোনও ডিরেক্টরিের মধ্যে সংরক্ষণ করা হয় data/

ডিরেক্টরিটির সমস্ত ফাইল তালিকাবদ্ধ করতে গ্লব মডিউল ব্যবহার করতে পারেন python, এবং fnamesনিম্নোক্ত পদ্ধতিতে তালিকাভুক্ত একটি তালিকাতে যোগ করতে পারেন :

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

আমি একটি নমুনা এক liner সরবরাহ করব যেখানে sourcepath এবং ফাইল টাইপ ইনপুট হিসাবে সরবরাহ করা যেতে পারে। কোডটি csv এক্সটেনশন সহ ফাইলের নামের একটি তালিকা প্রদান করে। ব্যবহার করুন ক্ষেত্রে সব ফাইল ফিরে প্রয়োজন। এটি পুনরাবৃত্তিভাবে সাবডিরেক্টরি স্ক্যান করবে।

[y for x in os.walk(sourcePath) for y in glob(os.path.join(x[0], '*.csv'))]

প্রয়োজন হিসাবে ফাইল এক্সটেনশন এবং উৎস পাথ সংশোধন করুন।


পাইথন 3.5 ডিরেক্টরি মাধ্যমে হাঁটার জন্য একটি নতুন, দ্রুত পদ্ধতি চালু os.scandir()

উদাহরণ:

for file in os.scandir('/usr/bin'):
    line = ''
    if file.is_file():
        line += 'f'
    elif file.is_dir():
        line += 'd'
    elif file.is_symlink():
        line += 'l'
    line += '\t'
    print("{}{}".format(line, file.name))

যদি আপনি খুঁজছেন একটি পাইথন বাস্তবায়নের খোঁজ , এই একটি রেসিপি আমি বরং ঘন ঘন ব্যবহার করেন:

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

তাই আমি এটি থেকে একটি পাইপআই package তৈরি করেছি এবং একটি গিটহাব রিপোজিটরিও রয়েছে । আমি কেউ এই কোড জন্য সম্ভাব্য দরকারী এটি আশা করি।


def list_files(path):
    # returns a list of names (with extension, without full path) of all files 
    # in folder path
    files = []
    for name in os.listdir(path):
        if os.path.isfile(os.path.join(path, name)):
            files.append(name)
    return files 

filenames = next(os.walk(path))[2]

এটি সমস্ত ফাইল এবং ডিরেক্টরি একটি তালিকা ফিরে আসবে path

import os
for root, dirs,files in os.walk("your dir path", topdown=True):
    for name in files:
        print(os.path.join(root, name))

এটি শুধুমাত্র ফাইলগুলির একটি তালিকা প্রদান করবে, সাবডিরেক্টরি নয়।


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

এখানে আমি একটি recursive গঠন ব্যবহার।


import os
lst=os.listdir(path)

os.listdir পাথ দ্বারা প্রদত্ত ডিরেক্টরির মধ্যে এন্ট্রিগুলির নাম ধারণকারী একটি তালিকা প্রদান করে।





directory