मुझे सभी सबफ़ोल्डर्स में स्थित प्रत्येक txt फ़ाइल के लिए निम्न स्क्रिप्ट चलाने की आवश्यकता है। मुख्य फ़ोल्डर "सिमुलेशन" है जिसमें अलग-अलग सबफ़ोल्डर हैं (जिन्हें "वर्ष-महीना-दिन" कहा जाता है)। प्रत्येक सबफ़ोल्डर में एक txt फ़ाइल "diagno.inp" होती है। निम्नलिखित डेटा (प्रत्येक दिन के लिए एक पंक्ति) के साथ एक सूची रखने के लिए मुझे प्रत्येक "diagno.inp" फ़ाइल के लिए इस स्क्रिप्ट को चलाने की आवश्यकता है: "वर्ष-महीने-दिन", "W_int", "W_dir" यहां कोड है जो केवल एक सबफ़ोल्डर के लिए काम कर रहा है। क्या आप मुझे एक लूप बनाने में मदद कर सकते हैं?

fid=open('/Users/silviamassaro/weather/simulations/20180105/diagno.inp',  "r")
subfolder="20180105"
n = fid.read().splitlines()[51:]
for element in n:
    "do something" # here code to calculate W_dirand W_int for each day
     print (subfolder, W_int, W_dir)
0
Silvia Massaro 24 मार्च 2020, 12:23

2 जवाब

जब मैं एक निर्देशिका और उसके बच्चे को बार-बार लूप करने की आवश्यकता होती है तो मैं आमतौर पर यहां क्या करता हूं:

import os

main_folder = '/path/to/the/main/folder'
files_to_process = [os.path.join(main_folder, child) for child in os.listdir(main_folder)]

while files_to_process:
    child = files_to_process.pop()
    if os.path.isdir(child):
        files_to_process.extend(os.path.join(child, sub_child) for sub_child in os.listdir(child))
    else:
        # We have a file here, we can do what we want with it

यह छोटा है, लेकिन इसमें बहुत मजबूत धारणाएं हैं:

  1. आप उस क्रम की परवाह नहीं करते हैं जिसमें फाइलों का इलाज किया जाता है।
  2. आपके पास अपने प्रवेश बिंदु के चिल्ड में केवल निर्देशिका या नियमित फ़ाइलें हैं।

संपादित करें: glob का उपयोग करके एक और संभावित समाधान जोड़ा, @jacques-gaudin की टिप्पणी के लिए धन्यवाद

इस समाधान का लाभ यह है कि आपको केवल .inp फ़ाइलें ही प्राप्त होंगी, लेकिन आप अभी भी उनके आदेश के बारे में सुनिश्चित नहीं हैं।

import glob

main_folder = '/path/to/the/main/folder'
files_to_process = glob.glob('%s/**/*.inp' % main_folder, recursive=Tre)

for found_file in files_to_process:
    # We have a file here, we can do what we want with it

उम्मीद है ये मदद करेगा!

1
bastantoine 24 मार्च 2020, 13:15
glob का उपयोग क्यों नहीं कर रहे हैं? यह सब तुम्हारे लिए करता है ना? :)
 – 
Jacques Gaudin
24 मार्च 2020, 13:00

pathlib के साथ आप कुछ ऐसा कर सकते हैं :

from pathlib import Path

sim_folder = Path("path/to/simulations/folder")

for inp_file in sim_folder.rglob('*.inp'):
    subfolder = inp_file.parent.name
    with open(inp_file, 'r') as fid:
        n = fid.read().splitlines()[51:]
    for element in n:
        "do something" # here code to calculate W_dirand W_int for each day
        print (subfolder, W_int, W_dir)

ध्यान दें कि यह .inp फ़ाइलों को देखने के लिए सभी सबफ़ोल्डर्स को पुनरावर्ती रूप से ट्रैवर्स कर रहा है।

0
Jacques Gaudin 24 मार्च 2020, 12:54
नमस्ते! समस्या यह है कि "सिमुलेशन" फ़ोल्डर के अंदर मेरे सबफ़ोल्डर्स को स्क्रिप्ट के अंदर बदलने की आवश्यकता है क्योंकि प्रत्येक अलग सबफ़ोल्डर में एक डायग्नो.इनपी फ़ाइल होती है जिस पर मुझे काम करना होता है।
 – 
Silvia Massaro
24 मार्च 2020, 14:04
मुझे "सिमुलेशन" के प्रत्येक सबफ़ोल्डर में प्रवेश करने और "diagno.file" खोलने की आवश्यकता है। प्रत्येक सबफ़ोल्डर में एक "diagno.file" होता है जिस पर मुझे काम करना होता है..
 – 
Silvia Massaro
24 मार्च 2020, 14:26
ज़रूर, rglob यही कर रहा है। यह सभी सबफ़ोल्डर्स में पुनरावर्ती रूप से जाता है और "*.inp" से मेल खाने वाली कोई भी फ़ाइल ढूंढता है। प्रत्येक मैच के लिए आप अपनी स्क्रिप्ट के साथ आगे बढ़ें।
 – 
Jacques Gaudin
24 मार्च 2020, 14:29