将子目录中特定文件移动到一个目录中 - python

9

我对Python还比较陌生,但一直在尝试学习基础知识。

无论如何,我有几个文件,一旦我从它们的压缩文件中提取出来(非常缓慢的过程),就会产生几百个包含2-3个文件的子目录。现在我想做的是提取所有以'dem.tif'结尾的文件,并将它们放在一个单独的文件夹中(移动而不是复制)。

我可能已经跳得太深了,但我编写的代码没有错误,所以它肯定没有找到(存在的)文件,因为它给我了else语句。这是我创建的代码:

import os

src = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Extracted' # input
dst = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Analyses' # desired     location

def move():
    for (dirpath, dirs, files) in os.walk(src):
        if files.endswith('dem.tif'):
            shutil.move(os.path.join(src,files),dst)
            print ('Moving ', + files, + ' to ', + dst)
        else:
            print 'No Such File Exists'
4个回答

9

首先,欢迎加入社区和学习 Python!如果您经常光顾这里,可能需要更改您的用户名。 :)

我建议采用以下方式(借鉴自Beazley 先生):

# genfind.py
#
# A function that generates files that match a given filename pattern

import os
import shutil
import fnmatch

def gen_find(filepat,top):
    for path, dirlist, filelist in os.walk(top):
        for name in fnmatch.filter(filelist,filepat):
            yield os.path.join(path,name)

# Example use

if __name__ == '__main__':
    src = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Extracted' # input
    dst = 'O:\DATA\ASTER GDEM\Original\North America\UTM Zone 14\USA\Analyses' # desired     location

    filesToMove = gen_find("*dem.tif",src)
    for name in filesToMove:
        shutil.move(name, dst)

3

更新:提问者在下面澄清了他/她实际上是在调用移动函数,这是我回答中的第一点。

还有几个需要考虑的问题:

  • 恐怕你将每个元组中从os.walk返回的元素顺序搞错了 - 请查看该函数的文档
  • 假设你已经修复了这个问题,还要记住需要遍历files,并将每个文件与root连接起来,而不是src
  • 如果你打印出os.walk返回的值,并注释掉该循环中的其余代码,上述内容应该是显而易见的。
  • 对于像移动文件这样可能会破坏性的操作,我总是先尝试一些只打印shutil.move参数的代码,直到你确定它是正确的。

嗨,马克,谢谢你的回复。抱歉我的英语可能不是最好的,我想说的是,我通过输入move()在shell窗口中运行程序,没有shutil.move语句时一切都正常运行,但是一旦我添加它,就会出现以下错误AttributeError: 'list' object has no attribute 'endswith'。 - GeoPy
@user1041814:那个错误是因为我上面提到的第一点和第二点 - 你的 files 实际上是在遍历每个目录时子目录的列表。 - Mark Longair
再次感谢您的建议!有时候最简单的错误,比如 os.walk 函数的顺序问题,也会让您犯错! - GeoPy

3

我认为您混淆了使用os.walk()的方式。

for dirpath, dirs, files in os.walk(src):
    print dirpath
    print dirs
    print files
    for filename in files:
        if filename.endswith('dem.tif'):
            shutil.move(...)
        else:
            ...

0

你需要用Python做这件事情有什么特别的原因吗?使用一个简单的shell命令不是更简单吗?如果你在类Unix系统上,或者在Windows上有Cygwin的话:

find src_dir -name "*dem.tif" -exec mv {} dst_dir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接