如何在Python中将具有随机名称的文件从一个文件夹移动到另一个文件夹?

时间:2018-05-02 19:27:28

标签: python shutil

我有大量的.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)

1 个答案:

答案 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")。我不会详细说明,链接的重复目标"答案解释得更好。