Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列出包含Python字符串一部分的文件名_Python_Find_Subprocess - Fatal编程技术网

列出包含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.6
check\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.6
check\u output()
是在2.7中引入的。你可以用
Popen()
communicate()
来代替
check\u output()
。我得到了一个错误,比如:s=Popen([“find”,path,“-name”,“{}”。format(ele)],stdout=PIPE,stderr=PIPE)ValueError:format中的长度为零的字段名现在就得到了!谢谢你