Python 2.7 - 在目录中筛选包含特定字符串的文件名

3
我想通过筛选特定字符串在文件名中,将一个文件从一个目录移动到另一个目录。
似乎fnmatch或glob可以实现这一点,但我无法弄清楚。
在下面的示例中,如何使用文件名中的过滤器High_Quality,使Python仅移动文件test_High_Quality.mb到另一个目录?
>>> import os    
>>> myPath = "C:\Project"    
>>> os.listdir('myPath')    
>>> ['test_Draft.txt', 'test_Mid_Quality.txt', 'test_High_Quality.txt']

你想要文件名中包含“High_Quality”的所有内容吗? - Wayne Werner
如果文件名包含“High_Quality”,那么我想将该文件移动到另一个目录。谢谢。 - ADMMTL
6个回答

3

使用文件名“High_Quality”进行过滤

[d for d in os.listdir('myPath') if 'High_Quality' in d]

要移动到其他目录,请遵循这个解决方案类似的问题


这个解决方案也会很有用。非常感谢你。 - ADMMTL

1
你可以使用 glob.glob() 函数来搜索与模式匹配的文件名。
> from glob import glob
> glob("C:\Project\*High_Quality*")

['test_High_Quality.txt']

请参考链接文档以获取更多详细信息。

尝试上述代码后,我得到了以下结果:['C:/Project\test_High_Quality.txt']。或许 '\' 可能会引起问题,不是吗? - ADMMTL

1
另一种使用 filter 的方法:
high_quality = filter(lambda fname: 'High_Quality' in fname, os.listdir('myPath'))

如果您希望对high_quality进行多次迭代,可以将其转换为列表或集合(filter返回生成器)。

我会学习理解这行代码中发生了什么,因为我不熟悉lambda函数。这对我的脚本非常有用。非常感谢! - ADMMTL

1
你可以使用 fnmatch 模块中的 filter 方法实现相同的目的,非常直接易懂,只需确保根据需要构建正确的模式,例如在您的情况下匹配包括 High_Quality 的所有字符串:
>>> l = ['test_Draft.txt', 'test_Mid_Quality.txt', 'test_High_Quality.txt']
>>> 
>>> import fnmatch
>>> 
>>> fnmatch.filter(l, "*High_Quality*")
['test_High_Quality.txt']

我没想到在应用筛选器之前将所有文件名存储在一个列表中。非常好的技巧。非常感谢。 - ADMMTL
@ADMMTL,这个解决方案没有什么诀窍,除了使用Python的基本编程技巧外,你似乎很新手,多练习这种语言后,这将变得很常识 :) - Iron Fist

0

使用glob模块进行筛选:

导入glob

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']

筛选扩展名 .txt:

files = glob.glob("/home/ach/*/*.txt")

一个单一字符

glob.glob("/home/ach/file?.txt")

数字范围

glob.glob("/home/ach/*[0-9]*")

字母范围

glob.glob("/home/ach/[a-c]*")

0

如果你把这个文件放在一个空目录里,你就可以看到 glob 怎么为你正常工作。你只需要 *High_Quality* 作为你的 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='')

这个脚本对我的技能来说有点高级,但我会非常仔细地学习它。非常感谢你的帮助。 - ADMMTL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接