python基于文件名中的文本字符将多个文件从一个文件夹移动到另一个文件夹

python基于文件名中的文本字符将多个文件从一个文件夹移动到另一个文件夹,python,python-2.7,Python,Python 2.7,我对Python还是个新手。我一直在探索shutil模块,通常可以移动东西。我的问题是: 想象一下,在一个导出文件夹中有数百个文件。虽然所有文件都是不同的,但每个文件中有13个是针对特定供应商的。我想创建一个脚本,通过导出文件夹,计算每个文件名,获取所有苹果文件并将其放入苹果文件夹,英特尔文件并将其放入英特尔文件夹,等等。任何智慧都将不胜感激 我试图在shutil副本中使用通配符,但没有任何运气 谢谢 JT假设文件名中有特定字符串标识报告所涉及的供应商,您可以创建一个字典,将这些标识字符串映射到

我对Python还是个新手。我一直在探索
shutil
模块,通常可以移动东西。我的问题是:

想象一下,在一个导出文件夹中有数百个文件。虽然所有文件都是不同的,但每个文件中有13个是针对特定供应商的。我想创建一个脚本,通过导出文件夹,计算每个文件名,获取所有苹果文件并将其放入苹果文件夹,英特尔文件并将其放入英特尔文件夹,等等。任何智慧都将不胜感激

我试图在
shutil
副本中使用通配符,但没有任何运气

谢谢


JT

假设文件名中有特定字符串标识报告所涉及的供应商,您可以创建一个字典,将这些标识字符串映射到相应的供应商。例如:

import shutil
import os

path = '/path/to/location'

vendorMap = {'apple': 'Apple', 
             'intel': 'Intel', 
             'stringID3': 'vendor3'}

files = os.listdir(path)

for f in files:
    for key, value in vendorMap.iteritems():
        if key in f.lower():
            shutil.copy(f, path + '/' + value)
        else:
            print 'Error identifying vendor for', f

这将在当前目录中创建一个文件夹,以适当的供应商命名,并将该供应商的报告复制到该文件夹中。请注意,此示例使用该方法,因此供应商名称是否大写无关紧要。

我能想到的最简单的解决方案:

import glob, shutil

for file in glob.glob('path_to_dir/apple*'):
    shutil.move(file, new_dst)


# a list of file types
vendors =['path_to_dir/apple*', 'path_to_dir/intel*'] 

for file in vendors:
     for f in (glob.glob(file)): 
         if "apple" in f: # if apple in name, move to new apple dir
             shutil.move(f, new_apple_dir)
         else:
             shutil.move(f, new_intel_dir) # else move to intel dir
import shutil
import os

source = '/path/to/source_folder'
dest1 = '/path/to/apple_folder'
dest2 = '/path/to/intel_folder'

files = os.listdir(source)

for f in files:
    if (f.startswith("Apple") or f.startswith("apple")):
        shutil.move(f, dest1)
    elif (f.startswith("Intel") or f.startswith("intel")):
        shutil.move(f, dest2)

目标文件夹确实需要存在。

Andreas的答案对于您给出的Apple示例很好。如果你想找更肉质的东西,看看Regex。它们允许您搜索文本的重复模式

例如,在我工作的地方,根据文件是报告还是技术图纸等,我们有不同的文本格式。它们都遵循类似于“公司首字母缩写/项目编号/部门”的格式

作为正则表达式,您可以搜索以下内容:

import re

fileregex = re.compile(r'(\w\w)/(\d{4})/(\w\w))
for file in os.listdir(*path*):
    filename = fileregex.search(file)

这是一个方便的工具。

对Padaic的答案进行小编辑:

import glob
import shutil

vendors = ("*Apple*.*", "*Intel*.*")
paths = (".\\Apple\\", ".\\Intel\\")
for idx in range(len(vendors)):
    for matches in glob.glob(vendors[idx]):
        shutil.move(matches, paths[idx])

以下代码适用于我-

import os
import shutil


ent_dir_path = input("Enter the path of the directory:") #source directory


out_dir_path = input("Enter the path of the directory where you want to move all these files:")  #destination directory

if not os.path.exists(out_dir_path):  #create folder if doesn't exist
    os.makedirs(out_dir_path)


file_type = input("Enter the first few characters of type of file you want to move:") 

entries = os.listdir(ent_dir_path)

for entry in entries:
     if entry.startswith(file_type):
         #print(ent_dir_path + entry)
         shutil.move(ent_dir_path + entry, out_dir_path)

# ent_dir_path + entry is the path of the file you want to move 
# example-   entry = Apple.txt  
#            ent_dir_path = /home/user/Downloads/
#            ent_dir_path + entry = /home/user/Downloads/Apple.txt  (path of the 
#            file)  

所有苹果文件是否都包含字符串Apple,以及类似的Intel等?是什么将文件区分为每一类?谢谢你的问题。所有文件都将包含Applex.xlsx、Applebig.xlsx、intelx.xlsx、intelbig.xlsx等。字符串将包含Apple和Intel,这一点永远不会混淆。我只想忽略除common元素外的其他字符串,然后将其放入Apple文件夹(大约13个文件)。所有文件都有标题,因此您无法轻松将所有Apple文件排序在一起。因此,您只需要Apple?我想学习如何将其用于两种情况(本例中为Apple、intel)因此,我可以看到机制,了解它与1种情况的区别,并根据需要将其扩展到n种情况。os.listdir()将列出目录和文件。在尝试复制它之前,可能值得检查f是否是文件而不是目录。耶!这两种方法我都无法使用。我回家后会进行修补。感谢您的友好想法189和Padraic!不用担心,我将添加一种方法来列出不同的文件。我尝试了f下面,但没有运气:导入glob,在glob.glob('C:/Users/r6/Desktop/a/apple*'):shutil.move(file,'C:/Users/r6/Desktop/b/'))#文件类型列表供应商=['C:/Users/r6/Desktop/a/apple*','C:/Users/r6/Desktop/a/intel*']在供应商中的文件:在(glob.glob(file)):如果是“苹果“在f中:#如果名称中有苹果,移动到新的苹果目录shutil.move(f,'C:/Users/r6/Desktop/b/')或者:shutil.move(f,'C:/Users/r6/Desktop/b/)#或者移动到英特尔目录就不会
shutil.move
需要路径和文件名到
f
,不仅仅是文件名?为了让它对我起作用,我必须在导入os和shutil.move(os.path.abspath(f),dest1)之后执行os.chdir(source)。根据Herbet上面提到的,我认为f变量只代表文件名,而不是完整路径。abspath(f)将为您处理该问题。