2015-05-03 52 views
1

列表中排除一個子我有一個列表phplist包含下列字符串(下面的例子),也有更多的人,這是整個列表的片段試圖在python

/home/comradec/public_html/moodle/config.php 
/home/comradec/public_html/moodle/cache/classes/config.php 
/home/comradec/public_html/moodle/theme/sky_high/config.php 
/home/comradec/public_html/moodle/theme/brick/config.php 
/home/comradec/public_html/moodle/theme/serenity/config.php 
/home/comradec/public_html/moodle/theme/binarius/config.php 
/home/comradec/public_html/moodle/theme/anomaly/config.php 
/home/comradec/public_html/moodle/theme/standard/config.php 

我是什麼試圖做的只是保留subdir/config.php文件並排除所有其他config.php文件(例如cache/classes/config.php)。

的完整代碼

for folder, subs, files in os.walk(path): 
     for filename in files: 
       if filename.endswith('.php'): 
         phplist.append(abspath(join(folder, filename))) 

for i in phplist: 
      if i.endswith("/config.php"): 
        cmsconfig.append(i) 
        if i.endswith("/mdeploy.php"): 
          cmslist.append(cms1[18]) 

所以結果只會增加/config.php文件路徑列表cmsconfig,但所發生的事情,我讓所有的config.php文件作爲頂級例如

我一直使用is not i.endswith("/theme/brick/config.php")這樣的代碼,但我想從列表中排除主題目錄。

我將輸出放入列表的原因是我在代碼的另一個區域使用該輸出。

+1

我在這裏嗅到[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

+0

(moodle)的圓括號是否意味着任何子目錄? – svenhornberg

+0

我的新答案能解決您的任務嗎? – svenhornberg

回答

0

將您的if條件更改爲if i.endswith("moodle/config.php")

如果你想改變你想這與文件夾:

path_ending = '%s/config.php' % folder_name 

現在改變,如果條件來if i.endswith(path_ending)

這將表明,config.php結尾的文件夾內TBAT你的路徑通過。

+0

想moodle是任何目錄即public_html。等 – Robbie

+0

你可以用別的東西替換文件夾名稱(在這種情況下用moodle)。 – fixxxer

+0

是的,我明白,我向你展示了我正在努力完成的事情。 在os.walk文件夾,潛艇,文件(路徑): 在文件名: 如果filename.endswith( 'PHP'): phplist。ifndsbetweenwith(「/ config.php」)不是decendswith(「/ base/config.php」): cmsconfig如果ifndsnds(「/ config.php」)不是actswith(「/ base/config.php」),則附加(abspath(連接(文件夾,文件名))) for phplist: .append(i) 如果其中包含(「/ mdeploy.php」): cmslist.append(cmsdirectory [18]) – Robbie

0

我認爲這是你想要的。可能會改變它不是pep8風格的變量的命名。

首先我排序所有最短先到的條目,然後我記得哪些部分已經被檢查過。

url1 = '/home/comradec/public_html/moodle/theme/binarius/config.php' 
url2 = '/home/comradec/public_html/moodle/config.php' 
url3 = '/home/comradec/public_html/othername/theme/binarius/config.php' 
url4 = '/home/comradec/public_html/othername/config.php' 

urls = [] 
urls.append(url1) 
urls.append(url2) 
urls.append(url3) 
urls.append(url4) 

moodleUrls = [] 
checkedDirs = [] 

#sort 
for i in sorted(urls): 
    if str(i).endswith('config.php'): 

     alreadyChecked = False 
     for checkedDir in checkedDirs: 
      if str(i).startswith(checkedDir): 
       alreadyChecked = True 
       break 

     if not alreadyChecked: 
      moodleUrls.append(i) 
      checkedDirs.append(str(i).replace('/config.php','')) 

print(checkedDirs) 
print(moodleUrls) 

輸出:

['/home/comradec/public_html/moodle', '/home/comradec/public_html/othername'] 
['/home/comradec/public_html/moodle/config.php', '/home/comradec/public_html/othername/config.php'] 
0

我解決我的問題的方式。提供我正在尋找的輸出。

path = "/home/comradec" 
phplist = [] 
cmsconfig = [] 
config = "config.php" 

for folder, subs, files in os.walk(path): 
     for filename in files: 
       if filename.endswith('.php'): 
         phplist.append(abspath(join(folder, filename))) 
for i in phplist: 
      if i.endswith("/mdeploy.php"): 
         newurl = i 
         newurl = newurl[:-11] 
         newurl = newurl + config 
         for i in phplist: 
           if i.endswith("/config.php"): 
             confirmurl = i 
             if confirmurl == newurl: 
               cmsconfig.append(newurl) 
print('\n'.join(cmsconfig))