Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Python2.7-使用目录中文件名中的特定字符串筛选文件_Python_Python 2.7 - Fatal编程技术网

Python2.7-使用目录中文件名中的特定字符串筛选文件

Python2.7-使用目录中文件名中的特定字符串筛选文件,python,python-2.7,Python,Python 2.7,我想通过使用特定字符串过滤文件名,将文件从一个目录移动到另一个目录 似乎fnmatch或glob可以做到这一点,但我想不出来 在下面的示例中,python如何使用文件名中的过滤器High_Quality将文件test_High_Quality.mb仅移动到另一个目录 >>> import os >>> myPath = "C:\Project" >>> os.listdir('myPath') >>>

我想通过使用特定字符串过滤文件名,将文件从一个目录移动到另一个目录

似乎fnmatch或glob可以做到这一点,但我想不出来

在下面的示例中,python如何使用文件名中的过滤器High_Quality将文件test_High_Quality.mb仅移动到另一个目录

>>> import os    
>>> myPath = "C:\Project"    
>>> os.listdir('myPath')    
>>> ['test_Draft.txt', 'test_Mid_Quality.txt', 'test_High_Quality.txt']
您可以使用该函数搜索与模式匹配的文件名

> from glob import glob
> glob("C:\Project\*High_Quality*")

['test_High_Quality.txt']
有关更多详细信息,请参阅链接文档。

使用“高质量”文件名进行筛选


要移动到其他目录,请遵循此解决方案,使用另一种方法
过滤器

high_quality = filter(lambda fname: 'High_Quality' in fname, os.listdir('myPath'))

如果您想对其进行多次迭代,请将
high_quality
转换为列表或集合(
filter
返回一个生成器)。

如果您将此文件粘贴在一个空目录中,您可以看到glob如何为您正常工作。您只需要
*高质量*
作为您的全球模式:

from __future__ import print_function

import glob
import os


filenames = [
    'fnord.txt',
    'fizzy.txt',
    'test_Low_Quality.txt',
    'test_Mid_Quality.txt',
    'test_High_Quality.txt',
    'test_High_Quality_one.txt',
    'test_High_Quality_two.txt',
]

for filename in filenames:
    with open(filename, 'w'): pass
print('Files:')
print('\t', '\n\t'.join(os.listdir(os.curdir)), sep='')
print('Files matching *High_Quality*:')
print('\t', '\n\t'.join(glob.glob('*High_Quality*')), sep='')
您可以将
fnmatch
模块中的方法用于相同的目的,非常简单的应用程序,只需确保您根据需要构建正确的模式,就像在您的案例中匹配所有字符串,包括
高质量

>>> l = ['test_Draft.txt', 'test_Mid_Quality.txt', 'test_High_Quality.txt']
>>> 
>>> import fnmatch
>>> 
>>> fnmatch.filter(l, "*High_Quality*")
['test_High_Quality.txt']
带全局模块的过滤器: 导入glob 图案 通配符: Fiter extension.txt: 单个字符 数字范围 字母范围
您希望文件名中的所有内容都具有
High_-Quality
?确切地说,如果文件名包含High_-Quality,那么我想将文件移动到另一个目录。谢谢这是我在尝试上面的代码时得到的:['C:/Project\\test\u High\u Quality.txt']。可能是“\\”会引起问题,不是吗?我将学习了解这行代码中发生了什么,因为我不熟悉lambda函数。这将对我的脚本非常有用。多谢了,他的解决方案也会有用的。非常感谢muchI在应用筛选器之前没有想到将所有文件名存储在列表中。很好的把戏。多谢各位much@ADMMTL,这个解决方案没有什么诀窍,除了在Python中使用初级编程技术外,您似乎很新,在使用这种语言进行更多练习后,它将成为您的常识:)这个脚本对于我的技能来说有点高级,但我会非常仔细地研究它。非常感谢你的帮助
>>> l = ['test_Draft.txt', 'test_Mid_Quality.txt', 'test_High_Quality.txt']
>>> 
>>> import fnmatch
>>> 
>>> fnmatch.filter(l, "*High_Quality*")
['test_High_Quality.txt']
import glob
pattern='*High_Quality*'

files=glob.glob(pattern)
files=glob.glob("data/*")

print(files)


Out:

['data/ks_10000_0', 'data/ks_1000_0', 'data/ks_100_0', 'data/ks_100_1',
'data/ks_100_2', 'data/ks_106_0', 'data/ks_19_0', 'data/ks_200_0', 'data/ks_200_1', 
'data/ks_300_0', 'data/ks_30_0', 'data/ks_400_0', 'data/ks_40_0', 'data/ks_45_0', 
'data/ks_4_0', 'data/ks_500_0', 'data/ks_50_0', 'data/ks_50_1', 'data/ks_60_0', 
'data/ks_82_0', 'data/ks_lecture_dp_1', 'data/ks_lecture_dp_2']
files = glob.glob("/home/ach/*/*.txt")
glob.glob("/home/ach/file?.txt")
glob.glob("/home/ach/*[0-9]*")
glob.glob("/home/ach/[a-c]*")