我有大量的.txt文件以“cb”+ number(如cb10,cb13)的组合命名,我需要从包含“cb +”中命名的所有文件的源文件夹中过滤掉它们数字“,包括目标文件。
目标文件名中的数字都是随机的,因此我必须列出所有文件名。
import fnmatch
import os
import shutil
os.chdir('/Users/college_board_selection')
os.getcwd()
source = '/Users/college_board_selection'
dest = '/Users/seperated_files'
files = os.listdir(source)
for f in os.listdir('.'):
names = ['cb10.txt','cb11.txt']
if names in f:
shutil.move(f,dest)
答案 0 :(得分:0)
if names in f:
无法正常工作,因为f
是文件名,而不是列表。也许你想要if f in names:
但是,您不需要为此扫描整个目录,只需循环播放您正在定位的文件,它们就存在:
for f in ['cb10.txt','cb11.txt']:
if os.path.exists(f):
shutil.move(f,dest)
如果你有很多cbxxx.txt
个文件,可能另一种方法是使用os.listdir
计算此列表与set
的结果的交集(为了更快的查找而不是list
,值得拥有很多元素):
for f in {'cb10.txt','cb11.txt'}.intersection(os.listdir(".")):
shutil.move(f,dest)
在Linux上,有很多" cb"文件,这会更快,因为listdir
没有执行fstat
,而os.path.exists
则执行。{/ p>
编辑:如果文件具有相同的前缀/后缀,您可以使用set comprehension构建查找集,以避免繁琐的复制/粘贴:
s = {'cb{}.txt'.format(i) for i in ('10','11')}
for f in s.intersection(os.listdir(".")):
或第一种选择:
for p in ['10','11']:
f = "cb{}.txt".format(p)
if os.path.exists(f):
shutil.move(f,dest)
编辑:如果必须移动所有 cb*.txt
个文件,则可以使用glob.glob("cb*.txt")
。我不会详细说明,链接的重复目标"答案解释得更好。