Python2.7-使用目录中文件名中的特定字符串筛选文件
我想通过使用特定字符串过滤文件名,将文件从一个目录移动到另一个目录 似乎fnmatch或glob可以做到这一点,但我想不出来 在下面的示例中,python如何使用文件名中的过滤器High_Quality将文件test_High_Quality.mb仅移动到另一个目录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') >>>
>>> 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]*")