使用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
到directotyH:/new/2CopyTo/cat size/
和house.size.fromBob.txt
到directoryH:/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个月了,我喜欢它。