আমি কোনও প্রদত্ত ডিরেক্টরিতে ফাইলগুলির মাধ্যমে পুনরাবৃত্তি করতে পারি?


554

আমাকে .asmএকটি প্রদত্ত ডিরেক্টরিতে সমস্ত ফাইল দিয়ে পুনরাবৃত্তি করতে হবে এবং সেগুলিতে কিছু ক্রিয়া করা উচিত।

এটি কীভাবে কার্যকরভাবে করা যায়?

উত্তর:


807

আসল উত্তর:

import os

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue

উপরের উত্তরের পাইথন ৩. version সংস্করণটি ব্যবহার করে os- ধরে নেওয়া যায় যে আপনাকে strভেরিয়েবলের মধ্যে একটি অবজেক্ট হিসাবে ডিরেক্টরি পথ বলে থাকে directory_in_str:

import os

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
         continue
     else:
         continue

বা পুনরাবৃত্তভাবে, ব্যবহার করে pathlib:

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)

1
এটি কেবল ডিরেক্টরিগুলির অধীনে ডিরেক্টরি বা ফাইলগুলি তালিকাভুক্ত মনে হয়। নীচে পেড্রোমেটো দ্বারা উত্তরগুলি একটি পুনরাবৃত্ত তালিকা তৈরি করে বলে মনে হচ্ছে।
জে শেঠ

8
দয়া করে নোট করুন পাইথন ৩.6 ডিরেক্টরিতে বাইটে থাকা প্রত্যাশিত এবং তারপরে তালিকাভুক্তি ফাইল নামগুলির একটি তালিকা বাইট ডাটা টাইপের মধ্যেও ছড়িয়ে দেবে যাতে আপনি এতে সরাসরি প্রান্তে চালাতে পারবেন না। এই কোড ব্লকটি পরিবর্তন করা উচিতdirectory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue
কিম স্ট্যাকস

13
print(os.path.join(directory, filename))print(os.path.join(directory_in_str, filename))অজগর 3.6 এ কাজ করার জন্য এটি পরিবর্তন করতে হবে
হুগো কোপম্যানস

54
যদি আপনি এটি 2017 বা এর বাইরে দেখতে পাচ্ছেন তবে os.scandir (dir_str) এখন উপলব্ধ এবং ব্যবহারের জন্য আরও ক্লিনার। ফেনসকোডের দরকার নেই। for entry in os.scandir(path): print(entry.path)
ছাগল

2
পছন্দ if filename.endswith((".asm", ".py")):করুনif filename.endswith(".asm") or filename.endswith(".py"):
মেরোলোসসিও

150

এটি কেবল ডিরেক্টরিগুলির তাত্ক্ষণিক শিশুদের জন্য নয়, সমস্ত বংশধর ফাইলগুলিতে পুনরাবৃত্তি করবে:

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)

3
Os.walk ফাংশনটির জন্য একটি রেফারেন্স নিম্নলিখিতটিতে পাওয়া যায়: ডকস.পিথথন.আর
লাইব্রেরি

136

আপনি গ্লোব মডিউল ব্যবহার করার চেষ্টা করতে পারেন :

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

পাইথন ৩.৫ থেকে আপনি উপ-ডিরেক্টরিগুলিও অনুসন্ধান করতে পারেন:

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

ডক্স থেকে:

ইউনিব শেল দ্বারা ব্যবহৃত বিধি অনুসারে গ্লোব মডিউল একটি নির্দিষ্ট প্যাটার্নের সাথে মেলে সমস্ত পাথের নামগুলি সন্ধান করে, যদিও ফলাফলগুলি স্বেচ্ছামূলক ক্রমে ফিরে আসে। কোনও টিলডে সম্প্রসারণ করা হয়নি, তবে *,?, এবং [] এর সাথে প্রকাশিত চরিত্রের ব্যাপ্তিগুলি সঠিকভাবে মিলে যাবে।


18

পাইথন ৩.৩ থেকে , os.scandir ( ) দিয়ে জিনিসগুলি অনেক সহজ

with os.scandir(path) as it:
    for entry in it:
        if entry.name.endswith(".asm") and entry.is_file():
            print(entry.name, entry.path)

তালিকাডির () পরিবর্তে স্ক্যানডির () ব্যবহার করা কোডের কার্যকারিতা উল্লেখযোগ্যভাবে বাড়িয়ে তুলতে পারে যার জন্য ফাইল টাইপ বা ফাইল বৈশিষ্ট্য সম্পর্কিত তথ্যও প্রয়োজন, কারণ ওএস.ডায়েন্ট্রি অবজেক্টগুলি যদি কোনও ডিরেক্টরি স্ক্যান করার সময় অপারেটিং সিস্টেম সরবরাহ করে তবে এই তথ্যটি প্রকাশ করে। সমস্ত os.DirEntry পদ্ধতিতে একটি সিস্টেম কল করতে পারে, তবে is_dir () এবং is_file () সাধারণত প্রতীকী লিঙ্কগুলির জন্য একটি সিস্টেম কল প্রয়োজন; os.DirEntry.stat () সর্বদা ইউনিক্সে একটি সিস্টেম কল প্রয়োজন তবে উইন্ডোজে প্রতীকী লিঙ্কগুলির জন্য কেবল একটির প্রয়োজন।


entryএকটি হল posix.DirEntry যেমন কুশলী পদ্ধতি একটি গুচ্ছ টাইপ entry.is_dir(), is_file(),is_symlink()
crypdick

17

পাইথন ৩.৪ এবং পরে স্ট্যান্ডার্ড লাইব্রেরিতে প্যাথলিব সরবরাহ করে। আপনি করতে পারেন:

from pathlib import Path

asm_pths = [pth for pth in Path.cwd().iterdir()
            if pth.suffix == '.asm']

অথবা আপনি যদি তালিকা বোধগম্যতা পছন্দ করেন না:

asm_paths = []
for pth in Path.cwd().iterdir():
    if pth.suffix == '.asm':
        asm_pths.append(pth)

Path অবজেক্টগুলি সহজেই স্ট্রিতে রূপান্তরিত হতে পারে।


9

পাইথনের ফাইলগুলির মাধ্যমে আমি কীভাবে পুনরাবৃত্তি করব তা এখানে:

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

এই প্রযুক্তিগুলির মধ্যে কোনওটিই কোনও নির্দেশনা সরবরাহের গ্যারান্টি দেয় না

হ্যাঁ, সুপার অনির্দেশ্য। লক্ষ্য করুন যে আমি ফাইলের নামগুলি বাছাই করেছি, যা গুরুত্বপূর্ণ যদি ফাইলগুলির ক্রমটি গুরুত্বপূর্ণ হয়, যেমন ভিডিও ফ্রেম বা সময় নির্ভর ডেটা সংগ্রহের জন্য। আপনার ফাইলের নামগুলিতে সূচকগুলি অবশ্যই রাখবেন!


সর্বদা বাছাই করা হয় না ... im1, im10, im11 ..., im2 ... অন্যথায় দরকারী পন্থা। from pkg_resources import parse_versionএবং filenames.sort(key=parse_version)এটা করেছে।
হাস্তুর

5

ডিরেক্টরি এবং তালিকা উল্লেখ করার জন্য আপনি গ্লোব ব্যবহার করতে পারেন :

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

অ্যারেতে সমস্ত ডিরেক্টরি তালিকা পেতে আপনি ওএস ব্যবহার করতে পারেন :

os.listdir(directory)

4

আমি এখনও এই বাস্তবায়নের সাথে খুব সন্তুষ্ট নই, আমি একটি কাস্টম কনস্ট্রাক্টর রাখতে চাই DirectoryIndex._make(next(os.walk(input_path)))যাতে আপনি কেবল যে ফাইলটির জন্য ফাইল তালিকা চান তার পথটি পার করতে পারেন। সম্পাদনা স্বাগত!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)

2

আমি লাইব্রেরিতে scandirনির্মিত নির্দেশিকাটি ব্যবহার করতে পছন্দ করি os। এখানে একটি কার্যকারী উদাহরণ:

import os

i = 0
with os.scandir('/usr/local/bin') as root_dir:
    for path in root_dir:
        if path.is_file():
            i += 1
            print(f"Full path is: {path} and just the name is: {path.name}")
print(f"{i} files scanned successfully.")

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