【问题标题】:shutil moving only one file instead of many files in a directoryshutil 只移动一个文件而不是目录中的许多文件
【发布时间】:2021-10-23 14:59:34
【问题描述】:

我编写了一个代码来移动其中包含子字符串的文件。

import os
import shutil

def move():
    path = os.getcwd()
    shutil.rmtree('Animals')
    firstfolder = 'Animals'
    if not os.path.isdir(firstfolder):
        os.mkdir('Animals')

    for file in os.listdir():
        Buffalo = '1837'
        donkey = '6104'
        Chimpanzee = '9731'
        cat = '2905'
        rat = '6648'
        sheep = '3128'
        lizard = '3053'
        insect = '2681'
        dog = '3901'
        #Buffalo
        if Buffalo in file:
            secondfolder = 'Animals/Buffalo'
            thirdfolder = 'Animals/Buffalo/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #donkey
        if donkey in file:
            secondfolder = 'Animals/donkey'
            thirdfolder = 'Animals/donkey/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #Chimpanzee
        if Chimpanzee in file:
            secondfolder = 'Animals/Chimpanzee'
            thirdfolder = 'Animals/Chimpanzee/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #cat
        if cat in file:
            secondfolder = 'Animals/cat'
            thirdfolder = 'Animals/cat/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)

        #rat
        if rat in file:
            secondfolder = 'Animals/rat'
            thirdfolder = 'Animals/rat/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #sheep
        if sheep in file:
            secondfolder = 'Animals/sheep'
            thirdfolder = 'Animals/sheep/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #lizard
        if lizard in file:
            secondfolder = 'Animals/lizard'
            thirdfolder = 'Animals/lizard/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #insect
        if insect in file:
            secondfolder = 'Animals/insect'
            thirdfolder = 'Animals/insect/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)
        #dog
        if dog in file:
            secondfolder = 'Animals/dog'
            thirdfolder = 'Animals/dog/testfolder'
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
                shutil.move(file, thirdfolder)



move()

在我当前的工作目录中,我有这些文件: 1):- 2905r20.wav 2):- 5fm2905.wav 3):- nso2905.wav 4):-1sny2905wn3i56.wav

当我运行代码时,它只会移动最后一个文件,即 1sny2905wn3i56.wav。它不会移动所有包含 2905 的文件。它应该移动所有 4 个文件。但我不知道为什么它只移动最后一个文件。当我在移动最后一个文件后再次运行代码时,它正在移动第三个文件并删除被移动的第四个文件。当我再次运行代码时,它正在删除第三个文件并移动第二个文件等等......

如何解决??

【问题讨论】:

  • 您的代码在检查文件夹是否存在的if 语句中调用shutil.move。它不应该总是执行吗? IE。检查你的缩进级别。
  • 哦。谢谢。我没有注意到这一点。我的代码现在可以使用了!!

标签: python python-3.x file operating-system shutil


【解决方案1】:

编辑:
您可以像下面这样大大优化您的代码。
Note the use os.path (it's more portable, smart and clear):

animals = {}
animals["Buffalo"] = '1837'
animals["donkey"] = '6104'
animals["Chimpanzee"] = '9731'
animals["cat"] = '2905'
animals["rat"] = '6648'
animals["sheep"] = '3128'
animals["lizard"] = '3053'
animals["insect"] = '2681'
animals["dog"] = '3901'

wd_path = os.getcwd()
animals_path = os.path.join(wd_path, "Animals")
if not os.path.isdir(firstfolder):
    os.mkdir('Animals')

for file in os.listdir(animals_path):
    file_path = os.path.join(animals_path, file)

    for animal, id in animals.items():
        if id in file_path:
            secondfolder = os.path.join(animals_path, animal)
            thirdfolder = os.path.join(secondfolder, "testfolder")
            if not os.path.isdir(secondfolder):
                os.mkdir(secondfolder)
            if not os.path.isdir(thirdfolder):
                os.mkdir(thirdfolder)
            shutil.copy(file_path, thirdfolder)

【讨论】:

  • 我想要实现的目标:- 如果文件名包含数字 3128 或代码中的任何内容,我想将文件移动到另一个文件夹
  • 我明白了。我在缩进中使用了shutil.move。我检查了我的缩进,我明白了
  • @Hacker--RohanRaj 查看优化方面(for循环和os.path对象)
  • 并且有什么办法:- 我可以打印移动后剩余的文件吗?我想打印文件的名称和剩余文件的数量。比如:- 剩下 51 个文件和所有文件名。
  • 好的。我将研究循环和 os.path 对象的方面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
相关资源
最近更新 更多