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

9 投票
4 回答
13464 浏览
提问于 2025-04-17 06:27

我对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 个回答

3

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

还有一些其他需要考虑的事情:

  • 你从 os.walk 返回的每个元组中的元素顺序可能搞错了,建议你查看一下这个函数的文档
  • 假设你已经修正了这个问题,还要记得你需要遍历 files,并且要把每个文件用 os.join 连接到 root,而不是 src
  • 如果你打印出 os.walk 返回的值,并把那段循环中的其他代码注释掉,上面的内容应该会很明显。
  • 对于像移动文件这样的可能会造成破坏的操作,我建议你先尝试一些代码,只打印出传给 shutil.move 的参数,直到你确认这些参数是正确的。
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:
            ...
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)

撰写回答