9

我对python相当陌生,但我一直在尝试学习基础知识。

无论如何,我有几个文件,一旦我从他们的 zip 文件中提取出来(顺便说一句,过程非常缓慢),就会产生数百个子目录,每个子目录有 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

4 回答 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)
于 2011-11-16T16:35:22.520 回答
3

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

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

  • os.walk恐怕你已经从错误的每个元组中返回了元素的顺序- 检查该函数的文档
  • 假设您已经解决了这个问题,还请记住您需要迭代files,并且您需要对os.join其中的每一个进行迭代root,而不是src
  • os.walk如果您打印出返回的值并注释掉该循环中的其余代码,那么上面的内容将是显而易见的。
  • 对于执行诸如移动文件之类的潜在破坏性操作的代码,我总是首先尝试一些仅将参数打印到的代码,shutil.move直到您确定它是正确的。
于 2011-11-16T16:28:38.420 回答
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:
            ...
于 2011-11-16T16:31:23.070 回答
0

您需要在 Python 中执行此操作的任何特殊原因?一个简单的shell命令会不会更简单?如果您使用的是类 Unix 系统,或者可以在 Windows 上访问 Cygwin:

find src_dir -name "*dem.tif" -exec mv {} dst_dir
于 2011-11-16T16:36:00.090 回答