পাইথনের সাথে ডিরেক্টরিগুলির মাধ্যমে আইট্রেট করা


157

আমাকে একটি প্রদত্ত ডিরেক্টরিের সাব-ডিরেক্টরিতে পুনরাবৃত্তি করতে হবে এবং ফাইলগুলি অনুসন্ধান করতে হবে। যদি আমি কোনও ফাইল পাই তবে আমাকে এটি খুলতে হবে এবং সামগ্রীটি পরিবর্তন করতে হবে এবং আমার নিজের লাইনের সাথে এটি প্রতিস্থাপন করতে হবে।

আমি এটি চেষ্টা করেছি:

import os

rootdir ='C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        f=open(file,'r')
        lines=f.readlines()
        f.close()
        f=open(file,'w')
        for line in lines:
            newline = "No you are not"
            f.write(newline)
        f.close()

তবে আমি একটি ত্রুটি পাচ্ছি। আমি কি ভুল করছি?


12
"একটি ত্রুটি" - বিশেষত কোনও ত্রুটি?
ড্যানিয়েল রোজম্যান 10

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

1
আমি যে ত্রুটি বার্তাটি পেয়েছি তা হ'ল শীতল.txt ফাইলটি খুঁজে পাওয়া যায় নি। আমার পরীক্ষার ফোল্ডার আমি একটি অন্য একটি ফোল্ডার নামক src আছে এবং src ফোল্ডার আমি অন্য ফোল্ডারে প্রধান দাওয়াত দিয়েছি, এই ফোল্ডারে আমার আছে cool.txt
উলফ

4
আপনি কি প্রশ্নটিতে ত্রুটিটি লিখতে পারেন? এটির জন্য মন্তব্যগুলির মাধ্যমে পড়তে হবে এটি বিরক্তিকর এবং অপ্রয়োজনীয় beyond
চার্লি পার্কার 18

1
এক বছরেরও বেশি পরে আমি বিশ্বাস করতে পারি না যে আমি ত্রুটিটি পোস্ট করার জন্য অনুরোধ করছি? @ ওল্ফ
চার্লি পার্কার

উত্তর:


300

ডিরেক্টরিগুলির মাধ্যমে আসল পদক্ষেপটি আপনার কোডড হওয়ার সাথে সাথে কাজ করে। আপনি যদি একটি সাধারণ printবিবৃতি দিয়ে অভ্যন্তরীণ লুপের সামগ্রীগুলি প্রতিস্থাপন করেন তবে আপনি দেখতে পাবেন যে প্রতিটি ফাইল পাওয়া গেছে:

import os
rootdir = 'C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print os.path.join(subdir, file)

যদি উপরেরটি চালাতে আপনি এখনও ত্রুটি পান তবে দয়া করে ত্রুটি বার্তাটি সরবরাহ করুন।


পাইথন 3 এর জন্য আপডেট করা হয়েছে

import os
rootdir = 'C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print(os.path.join(subdir, file))

1
সি: / ব্যবহারকারী / এসআইডি / ডেস্কটপ / পরীক্ষা \ এসআরসি \ অ্যাপ্লিকেশন / শীতল.txt সি: / ব্যবহারকারী / এসআইডি / ডেস্কটপ / পরীক্ষা \ এসআরসি \ অ্যাপ্লিকেশন / woohoo.txt আমার কোডের খোলামেলা বিবৃতিতে, আমার মনে হয় আমাকে করতে হবে ফাইলটি পরম পথ দিন। এসডিআরডির জন্য 'রুটডির =' সি: / ব্যবহারকারী / স্পেমমারা / ডেস্কটপ / পরীক্ষা / এসসিআর / অ্যাপ্লিকেশন / এসডিআর / ডিএসপি / এসআরসি / অ্যাপ্লিকেশন: ফাইলগুলিতে ফাইলের জন্য: এফ = ওপেন (সাবডির + '/' + ফাইল , 'r') লাইনগুলি = f.readlines () f.close () f = খোলা (সাবডির + '/' + ফাইল, 'ডাব্লু') লাইনে লাইনের জন্য: newline = "আরে আমি জানি" f.writ (নতুন লাইন) f.close () ধন্যবাদ মানুষ। এটি সমাধান হয়েছে
ওল্ফ

3
ওহে! দয়া করে মনে রাখবেন যে পাইথন 3 এ "মুদ্রণ" এর জন্য প্রথম বন্ধনী প্রয়োজন, অন্যথায় একটি বাক্য গঠন ত্রুটি প্রদান করে। আশাকরি এটা সাহায্য করবে!
টমমসো দি নোটো

14

সাব সব ফাইল ফিরে আরেকটি উপায় ব্যবহার করা মডিউল , পাইথন 3.4, যা (পাইথন 2.7 মাধ্যমে Pathlib পাওয়া যায় ফাইলসিস্টেম পাথ হ্যান্ডলিং একটি অবজেক্ট ওরিয়েন্টেড পদ্ধতির প্রদান করে চালু PyPi উপর pathlib2 মডিউল ):pathlib

from pathlib import Path

rootdir = Path('C:/Users/sid/Desktop/test')
# Return a list of regular files only, not directories
file_list = [f for f in rootdir.glob('**/*') if f.is_file()]

# For absolute paths instead of relative the current dir
file_list = [f for f in rootdir.resolve().glob('**/*') if f.is_file()]

পাইথন ৩.৩ থেকে, globমডিউলটি পুনরাবৃত্ত ফাইল অনুসন্ধানে সহায়তা করে:

import os
from glob import iglob

rootdir_glob = 'C:/Users/sid/Desktop/test/**/*' # Note the added asterisks
# This will return absolute paths
file_list = [f for f in iglob('**/*', recursive=True) if os.path.isfile(f)]

file_listউপরে পন্থা পারেন থেকে একটি নেস্টেড লুপ প্রয়োজন ছাড়াই উপর iterated করা যেতে পারে:

for f in file_list:
    print(f) # Replace with desired operations

1
পাইথন ৩.6-এর জন্য এখানে কি পছন্দনীয়?
ফিনিক্সদেব

@ ফিনিক্সডেভ আমি সাধারণভাবে অন্যগুলির চেয়ে একটি পদ্ধতির প্রস্তাব দেওয়ার কথা শুনিনি। আমি pathlibনিজেকে ব্যবহার করতে পছন্দ করি, বেশিরভাগ কারণেই আমি অবজেক্ট ওরিয়েন্টেড পদ্ধতি-সিনট্যাক্স পছন্দ করি। অন্যান্য পার্থক্য রয়েছে, যেমন পাথ লাইব্রেরি স্ট্রিংয়ের পরিবর্তে নির্দিষ্ট পাথ ক্লাস দেয় এবং উপলভ্য ফাংশনগুলি লাইব্রেরির মধ্যে পৃথক হয় (যেমন os.path.expanduser('~')বনাম Path.home())। ডকুমেন্টেশনের মাধ্যমে ব্রাউজ করুন এবং দেখুন আপনি কোন পদ্ধতির পছন্দ করেন।
joelostblom

**গ্লোব প্যাটার্নে যুক্ত করার পরিবর্তে , আপনি ব্যবহার করতে পারেন rglob
জর্জি

12

এর হিসাবে 2020 , glob.iglob(path/**, recursive=True)মনে হয় সবচেয়ে pythonic সমাধান, অর্থাত:

import glob, os

for filename in glob.iglob('/pardadox-music/**', recursive=True):
    if os.path.isfile(filename): # filter dirs
        print(filename)

আউটপুট:

/pardadox-music/modules/her1.mod
/pardadox-music/modules/her2.mod
...

দ্রষ্টব্য:
1 - glob.iglob

glob.iglob(pathname, recursive=False)

একটি পুনরাবৃত্তি করুন যা একই সাথে সমস্তগুলি একই সাথে glob()সংরক্ষণ না করে একই মান দেয়।

2 - যদি পুনরাবৃত্তি হয় Trueতবে প্যাটার্নটি '**'কোনও ফাইল এবং শূন্য বা আরও বেশি directoriesএবং এর সাথে মেলে subdirectories

3 - ডিরেক্টরিতে ফাইলগুলি অন্তর্ভুক্ত থাকলে  .সেগুলি ডিফল্টরূপে মিলবে না। উদাহরণস্বরূপ, এতে অন্তর্ভুক্ত থাকা একটি ডিরেক্টরি বিবেচনা করুন  card.gif এবং .card.gif:

>>> import glob
>>> glob.glob('*.gif') ['card.gif'] 
>>> glob.glob('.c*')['.card.gif']

4 - আপনি এটিও ব্যবহার করতে পারেন rglob(pattern)যা প্রদত্ত আপেক্ষিক প্যাটার্নের সামনে যুক্ত কল glob() করার মতো  **/


1
এই পাইথোনিক সলিউশনটি লুকানো ফাইল (ওরফে ডটফিলস) তালিকাভুক্ত করে না যখন স্বীকৃত ব্যক্তি এটি করে।
আশ্রসমুন

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