用Python自动化无聊的第一个实践项目,Ch。 9

时间:2016-02-17 04:07:07

标签: python shutil

所以我和我的朋友在使用Python自动化无聊的东西的上一章的第一个练习项目时遇到了问题。提示符为:"编写一个遍历文件夹树的程序,并搜索具有特定文件扩展名的文件(例如.pdf或.jpg)。将这些文件从它们所在的位置复制到新文件夹中。"

为简化起见,我们正在尝试编写一个程序,将My Pictures中的所有.jpg文件复制到另一个目录。这是我们的代码:

#! python3
# moveFileType looks in My Puctures and copies .jpg files to my Python folder

import os, shutil

def moveFileType(folder):
    for folderName, subfolders, filenames in os.walk(folder):
        for subfolder in subfolders:
            for filename in filenames:
                if filename.endswith('.jpg'):
                    shutil.copy(folder + filename, '<destination>')

moveFileType('<source>')

我们不断出现错误&#34; FileNotFoundError:[Errno 2]没有这样的文件或目录&#34;。

编辑:我添加了一个&#34; \&#34;到我的源路径的末尾(我不确定这是否是你的意思,@ Jacob H),并且能够复制该目录中的所有.jpg文件,但在尝试时遇到错误复制该目录的子文件夹中的文件。我在子文件夹中为子文件夹添加了一个for循环,我不再收到任何错误,但它实际上并没有在子文件夹中查找.jpg文件。

2 个答案:

答案 0 :(得分:2)

您的代码存在更基本的问题。使用SET GLOBAL MAX_ALLOWED_PACKET = ...时,它已经遍历每个目录,因此手动循环遍历子文件夹将多次产生相同的结果。

另一个更直接的问题是os.walk()生成相对文件名,因此您需要将它们粘合在一起。基本上你省略了目录名,并在当前目录中查找os.walk()在某个子目录中找到的文件。

以下是修复代码的快速尝试:

os.walk()

使函数接受def moveFileType(folder): for folderName, subfolders, filenames in os.walk(folder): for filename in filenames: if filename.endswith('.jpg'): shutil.copy(os.path.join(folderName, filename), '<destination>') 参数作为第二个参数,而不是硬编码destination,这将使它对未来更有用。

答案 1 :(得分:0)

确保正确键入源文件目标地址。当我测试你的代码时,我写了

moveFileType('/home/anum/Pictures')

我得到了错误;

IOError: [Errno 2] No such file or directory: 

当我写作

moveFileType('/home/anum/Pictures/')

代码完美无缺...... 尝试这样做,希望能做你的工作。 M使用Python 2.7

这是重新定义的代码,用于从那里进入子文件夹和复制jpg文件。

import os, shutil

def moveFileType(folder): 
  for root, dirs, files in os.walk(folder): 
               for file in files: 
                   if file.endswith('.jpg'):
                    image_path=os.path.join(root,file)  # get the path location of each jpeg image.
                    print 'location: ',image_path 
                    shutil.copy(image_path, '/home/anum/Documents/Stackoverflow questions')


moveFileType('/home/anum/Pictures/')