2015-01-21 17 views
0

我想列出包含我指定爲其名稱一部分的字符串的目錄中的所有文件。我想在循環的每次迭代中改變這個字符串。我正在使用的代碼是:列表名稱的文件與Python中的一部分字符串

from subprocess import Popen 
from subprocess import call 

species_array = ["homo_sapiens", "pan_troglodytes", "pongo_abelii", "gorilla_gorilla", "macaca_mulatta", "callithrix_jacchus", "bos_taurus", "canis_familiaris", "equus_caballus", "felis_catus", "ovis_aries", "sus_scrofa", "oryctolagus_cuniculus", "rattus_norvegicus", "mus_caroli", "mus_pahari", "mus_musculus"] 
run_length = (len(species_array) - 5) 
path = "/homes/varshith/maf_files/1/testmafs/HAL_Files/" 
for i in range (run_length): 
    s = Popen("find", path, "-name", *species_array[i+1]*) 
    print s.communicate()[0] 

該文件應該包含species_array [i + 1]作爲其名稱的一部分。提前致謝。

+0

請參閱http://stackoverflow.com/questions/3207219/how-to-list-all-files-of-a-directory-in-python – Urban48 2015-01-21 10:41:08

+0

只使用fnmatch的glob也爲什麼使用'i + 1 「你不想要第一個? – 2015-01-21 10:43:22

+0

我不想第一個。所有這些glob函數都只考慮了一個字符串,它不會在整個程序中改變。我正在尋找一個代碼,使我能夠找到一個文件名中的變量子字符串。 – 2015-01-21 10:46:57

回答

2

如果要使用find,則需要通過listargsshell=Falsecheck_output會爲你的情況下工作,你可以切片的列表,而不是使用範圍的,你需要str.format包裹每個物種/ ELE在*

from subprocess import check_output 

species_array = ["homo_sapiens", "pan_troglodytes", "pongo_abelii", "gorilla_gorilla", "macaca_mulatta", "callithrix_jacchus", "bos_taurus", "canis_familiaris", "equus_caballus", "felis_catus", "ovis_aries", "sus_scrofa", "oryctolagus_cuniculus", "rattus_norvegicus", "mus_caroli", "mus_pahari", "mus_musculus"] 
path = "/homes/varshith/maf_files/1/testmafs/HAL_Files/" 
for ele in species_array[1:-5]: 
    s = check_output(["find", path, "-name", "*{0}*".format(ele)]) 
    print s 

對於Python 2.6使用POPEN:

from subprocess Popen,PIPE 

species_array = ["homo_sapiens", "pan_troglodytes", "pongo_abelii", "gorilla_gorilla", "macaca_mulatta", "callithrix_jacchus", "bos_taurus", "canis_familiaris", "equus_caballus", "felis_catus", "ovis_aries", "sus_scrofa", "oryctolagus_cuniculus", "rattus_norvegicus", "mus_caroli", "mus_pahari", "mus_musculus"] 
path = "/homes/varshith/maf_files/1/testmafs/HAL_Files/" 
for ele in species_array[1:-5]: 
    s = Popen(["find", path, "-name", "*{0}*".format(ele)],stdout=PIPE,stderr=PIPE) 
    out,err = s.communicate() 
    print(out,err) 
+0

有一個錯誤說check_output沒有被定義!我正在使用Python 2.6.6 – 2015-01-21 10:52:27

+0

確定給我一秒會切換到Popen – 2015-01-21 10:52:48

+0

'check_output()'是在2.7中引入的。你可以用'Popen()'''用於'()'代替'check_output()'。 – mhawke 2015-01-21 10:53:59

2

你循環都是錯誤的。蟒蛇是遠不止表現:

1)您可以通過啓動範圍在1跳過第一個元素:

for i in range(1, len(species_arr) - 4): 

...然後使用i,而不是你的i+1內循環。

2)即使容易(更地道)是使用列表分片:

for species in species_arr[1:-4]: 

3)您可以格式化使用format()方法在Python字符串。

這裏是採用那些概念的示例:

species_arr = [ 
    "homo_sapiens", 
    "pan_troglodytes", 
    "pongo_abelii", 
    "gorilla_gorilla", 
    "macaca_mulatta", 
    "callithrix_jacchus", 
    "bos_taurus", 
    "canis_familiaris", 
    "equus_caballus", 
    "felis_catus", 
    "ovis_aries", 
    "sus_scrofa", 
    "oryctolagus_cuniculus", 
    "rattus_norvegicus", 
    "mus_caroli", 
    "mus_pahari", 
    "mus_musculus" 
] 

chop_from_end = 4 

for species in species_arr[1:-chop_from_end]: 
    fname = "*{0}*".format(species) 
    print fname 

--output:-- 
*pan_troglodytes* 
*pongo_abelii* 
*gorilla_gorilla* 
*macaca_mulatta* 
*callithrix_jacchus* 
*bos_taurus* 
*canis_familiaris* 
*equus_caballus* 
*felis_catus* 
*ovis_aries* 
*sus_scrofa* 
*oryctolagus_cuniculus* 

格式()方法在Python 3.0中引入 - 但它被反向移植到Python 2.6(在更有限的形式)。如果由於某種原因,你的安裝沒有格式()方法,你可以使用舊的方式:

fname = "*%s*" % species 

查看其他格式()的例子在這裏:

https://docs.python.org/3/library/string.html#format-examples

4)這裏是什麼你可以用glob module做:

import glob 
import os.path 
import pprint 

base_dir = '/Users/7stud/python_programs/dir1' 

names = ['a', 'b', 'c'] 

for name in names: 
    fname = "*{0}*".format(name) 
    path = os.path.join(base_dir, fname) 
    pprint.pprint(glob.glob(path)) 
    print '-' * 20 

--output:-- 
['/Users/7stud/python_programs/dir1/__pycache__', 
'/Users/7stud/python_programs/dir1/a.txt', 
'/Users/7stud/python_programs/dir1/aa.txt', 
'/Users/7stud/python_programs/dir1/ab.txt', 
'/Users/7stud/python_programs/dir1/ba.txt'] 
-------------------- 
['/Users/7stud/python_programs/dir1/ab.txt', 
'/Users/7stud/python_programs/dir1/b.txt', 
'/Users/7stud/python_programs/dir1/ba.txt'] 
-------------------- 
['/Users/7stud/python_programs/dir1/__pycache__'] 
-------------------- 

或者,作爲name, matches雙的字典:

results = dict(
    (
     name, 
     glob.iglob(os.path.join(base_dir, "*{0}*".format(name))) 
    ) 
    for name in names 
) 

for name, _iter in results.items(): 
    print "{0}:".format(name) 
    pprint.pprint(list(_iter)) 

--output:-- 
a: 
['/Users/7stud/python_programs/dir1/__pycache__', 
'/Users/7stud/python_programs/dir1/a.txt', 
'/Users/7stud/python_programs/dir1/aa.txt', 
'/Users/7stud/python_programs/dir1/ab.txt', 
'/Users/7stud/python_programs/dir1/ba.txt'] 
c: 
['/Users/7stud/python_programs/dir1/__pycache__'] 
b: 
['/Users/7stud/python_programs/dir1/ab.txt', 
'/Users/7stud/python_programs/dir1/b.txt', 
'/Users/7stud/python_programs/dir1/ba.txt'] 
相關問題