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

2 投票
2 回答
1610 浏览
提问于 2025-04-18 02:34

我会尽量解释我想做的事情,但我的英语不是很好。

我有一个物品列表,比如说 ["cat size", "house size", "car size"],还有一些文件,这些文件的名字里包含了我列表中的物品名,比如 cat.size.txthouse.size.fromBob.txt

我想把 cat.size.txt 复制到文件夹 H:/new/2CopyTo/Cat size/,然后把 house.size.fromBob.txt 复制到文件夹 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]

2 个回答

0

遍历你的列表,检查每个项的分类,看看它要保存到哪里。比如说,可能是'猫'、'狗'或者'房子'。

可以像这样做:

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'.....

这就是你想要的吗?

3

我设置了一个测试目录,结构如下:

$ 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)

之后,我的 test 目录和之前展示的一模一样,执行 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

这样做适合你的情况吗?(顺便说一句,Python 在这种事情上真是太棒了,不是吗?)

撰写回答