使用python,将文件复制到与该文件几乎同名的文件夹中

使用python,将文件复制到与该文件几乎同名的文件夹中,python,copy,Python,Copy,我会尽力解释我想做什么,但英语不是我的第一语言 我有一个项目列表,例如[“猫的大小”、“房子大小”、“汽车大小”] 以及一些包含列表中项目名称的文件。e、 g.cat.size.txt和house.size.fromBob.txt 我想做以下复制:cat.size.txt到directotyH:/new/2CopyTo/cat size/和house.size.fromBob.txt到directoryH:/new/2CopyTo/house size/ 下面是我将文件复制到一个目录的步骤,但我

我会尽力解释我想做什么,但英语不是我的第一语言

我有一个项目列表,例如
[“猫的大小”、“房子大小”、“汽车大小”]
以及一些包含列表中项目名称的文件。e、 g.
cat.size.txt
house.size.fromBob.txt

我想做以下复制:
cat.size.txt
到directoty
H:/new/2CopyTo/cat size/
house.size.fromBob.txt
到directory
H:/new/2CopyTo/house size/

下面是我将文件复制到一个目录的步骤,但我希望每个文件都位于自己的目录中(在我的电脑上,列表包含50项,因此不想手动执行)

谢谢

import glob
import shutil
import os

#=========List of items
list = ["cat size","house size","car size"]

#=========directories
FromDir = "H:/New/1RecievedFiles/"
CopyDir = "H:/New/2CopyTo/"

#=========get list of items to be used in glob.glob
filesList = [x.replace(" ", "*")+"*.*" for x in list]

#=========get list of new files in FromDir, use filesList in glob.glob
listOfNew = [glob.glob(FromDir+item) for item in filesList ]
# returns [['H:/New/1RecievedFiles\\cat.size.txt'], ['H:/New/1RecievedFiles\\house.size.fromBob.txt']]    

#=========make a single list from the list in a list
listOfNewfiles = [item for sublist in listOfNew for item in sublist]
# returns ['H:/New/1RecievedFiles\\cat.size.txt', 'H:/New/1RecievedFiles\\house.size.fromBob.txt']

#=========copy files
[shutil.copy2(item, CopyDir) for item in listOfNewfiles]

反复浏览列表,并检查将其保存在哪里的术语分类。即“猫”、“狗”或“房子”

像这样的

import os,shutil

for item in list:
    if 'cat' in listitem:
        shutil.copyfile(source, 'H:/new/2CopyTo/cat size/')
    elif 'house' in listitem:
        shutil.copyfile(source, 'H.......etc etc
    elif 'car'.....

这就是您想要的吗?

我设置了一个测试目录,如下所示:

$ ls -1
copyto/
car.size.txt
cat.size.txt
house.size.fromBob.txt
我相信这和你的情况很相似。根据您的相同列表,以下是我如何处理您的问题:

import os, shutil
# lst not list -- naming it list overshadows a builtin
lst = ['cat size', 'house size', 'car size']
# PEP8 - lowercase with underscore here; CamelCase for classes
from_dir = os.path.abspath(os.path.expanduser('~/test'))
copy_dir = os.path.abspath(os.path.expanduser('~/test/copyto'))

to_copy = [f for f in os.listdir(from_dir) if os.path.isfile(f)]
# ['car.size.txt', 'house.size.fromBob.txt', 'cat.size.txt']

for filename in to_copy:
    needle = ' '.join(filename.split('.')[:2])
    if needle in lst:
        dest_dir = os.path.join(copy_dir, needle)
        os.mkdir(dest_dir)
        shutil.copy2(os.path.join(from_dir, filename), dest_dir)
在此之后,我的
测试
目录与前面所示完全相同,这是
ls-R1 copyto
的结果:

copyto:
car size/
cat size/
house size/

copyto/car size:
car.size.txt

copyto/cat size:
cat.size.txt

copyto/house size:
house.size.fromBob.txt

这对你的案子有用吗?(PS-Python在这方面非常棒,不是吗?

顺便说一句,你的代码格式和英语处理都非常出色。我完全同意两位。这样的代码组织使得调试和代码修改最简单、最快。我敢打赌,你遇到的大多数问题都不会出现在这里,因为你通常可以准确地看到问题所在。Bravo这里不需要硬编码的
if/elif/else
树。我们可以使用文件名与目标目录的关系(见我的答案)。你完全正确。你认为解决办法更好。我犹豫了一下,因为没有实际的列表,我担心它可能包含像“福特.游骑兵”和“中型.轿车”这样的东西,它们也需要放在“汽车尺寸”文件夹中。谢谢,它实际上非常好,我会记下来的。我只是有一个很长的列表,所以我想尝试自动化它,目前我有一个bat文件,可以复制所有东西,但要维护它是一件痛苦的事情。感谢感谢感谢如此之多,我不得不仔细研究它才能理解(我对python还不是很了解),但它会起作用的。我同意100%python在这方面非常好,实际上它非常棒,我只使用它5个月了,我喜欢它。