列出包含Python字符串一部分的文件名
我试图列出一个目录中的所有文件,这些文件包含我指定作为其名称一部分的字符串。我想随着循环的每次迭代改变这个字符串。我使用的代码是:列出包含Python字符串一部分的文件名,python,find,subprocess,Python,Find,Subprocess,我试图列出一个目录中的所有文件,这些文件包含我指定作为其名称一部分的字符串。我想随着循环的每次迭代改变这个字符串。我使用的代码是: from subprocess import Popen from subprocess import call species_array = ["homo_sapiens", "pan_troglodytes", "pongo_abelii", "gorilla_gorilla", "macaca_mulatta", "callithrix_jacchus",
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]
该文件的名称中应包含物种_数组[i+1]。提前感谢。如果您想使用
find
,则需要在shell=False
时传递参数的列表<代码>检查输出将适用于您的案例,您可以切片列表而不是使用范围,并且您需要str.format
将每个物种/元素包装在*
:
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)
如果要使用find
,则需要在shell=False
时传递args
的列表<代码>检查输出将适用于您的案例,您可以切片列表而不是使用范围,并且您需要str.format
将每个物种/元素包装在*
:
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)
你的循环完全错了。python的表现力远不止这些:
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*
format()方法是在Python3.0中引入的,但它被后移植到Python2.6(以更有限的形式)。如果由于某种原因,您的安装没有format()方法,您可以使用旧方法:
fname = "*%s*" % species
请参见此处的其他format()示例:
4) 以下是您可以使用全局模块执行的操作:
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__']
--------------------
或者,作为名称的定义,匹配对:
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']
你的循环完全错了。python的表现力远不止这些:
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*
format()方法是在Python3.0中引入的,但它被后移植到Python2.6(以更有限的形式)。如果由于某种原因,您的安装没有format()方法,您可以使用旧方法:
fname = "*%s*" % species
请参见此处的其他format()示例:
4) 以下是您可以使用全局模块执行的操作:
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__']
--------------------
或者,作为名称的定义,匹配对:
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']
请参见仅使用fnmatch的glob也为什么使用i+1
您不想要第一个吗?我不想要第一个。所有这些glob函数只考虑在整个程序中不会改变的字符串。我正在寻找一种代码,该代码使我能够在文件名中查找变量子字符串。请参阅仅使用fnmatch的glob也可以使用I+1
为什么不使用第一个?我不需要第一个。所有这些glob函数只考虑在整个程序中不会改变的字符串。我正在寻找一个代码,使我能够找到一个文件名中的变量子字符串。有一个错误,说检查输出未定义!我使用的是Python 2.6.6check\u output()
是在2.7中引入的。你可以用Popen()
和communicate()
来代替check\u output()
。我得到了一个错误,比如:s=Popen([“find”,path,“-name”,“{}”。format(ele)],stdout=PIPE,stderr=PIPE)ValueError:format中的长度为零的字段名现在就得到了!谢谢Padraic:d这里有一个错误,说明没有定义check_输出!我使用的是Python 2.6.6check\u output()
是在2.7中引入的。你可以用Popen()
和communicate()
来代替check\u output()
。我得到了一个错误,比如:s=Popen([“find”,path,“-name”,“{}”。format(ele)],stdout=PIPE,stderr=PIPE)ValueError:format中的长度为零的字段名现在就得到了!谢谢你