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

2024-05-12 18:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python比较陌生,但我一直在努力学习基础知识,以帮助我在地质学方面的研究。

不管怎样,我有几个文件,一旦我从他们的zip文件(痛苦的缓慢进程btw)中提取出来,就会产生几百个子目录,每个目录中有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'

Tags: 文件srcdataosfileselsedstutm
3条回答

我想你把应该用的方法弄混了。

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

首先,欢迎来到社区,还有python!你可能想更改你的用户名,特别是如果你经常来这里。:)

我建议如下(偷自Mr. 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)

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

还有几件事要考虑:

  • 您得到了从os.walk返回的每个元组中的元素的顺序,恐怕是错误的,请检查documentation for that function
  • 假设您已经修复了这个问题,还要记住您需要遍历files,并且您需要os.join其中的每一个到root,而不是src
  • 如果您打印出os.walk返回的值并注释掉该循环中的其余代码,那么上面的内容将是显而易见的。
  • 对于执行潜在破坏性操作(如移动文件)的代码,我总是首先尝试一些只将参数打印到shutil.move的代码,直到您确定它是正确的。

相关问题 更多 >