2011-11-16 116 views
4

虽然Python对我来说很新,但我一直在尝试学习基础知识,以帮助我在地质学的研究。将子目录中的特定文件移动到一个目录 - 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' 

任何帮助将不胜感激,我提前感谢您的时间。

真诚,

比约恩

回答

5

首先,欢迎来到社区,和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) 
3

更新:提问澄清低于他/她实际上是调用移动功能,这是我回答的第一个点。

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

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

嗨马克,感谢您的回复。对不起,我的英文可能不是最好的,我的意思是说,我正在shell窗口中运行程序,方法是输入move(),并且没有shutil就可以正常运行。移动语句,但只要我添加它,我得到以下错误AttributeError:'列表'对象没有属性'endswith' – BJEBN

+0

@ user1041814:该错误是因为我提到的第一和第二点 - 上述'文件'实际上步行中每个目录中的子目录列表。 –

+0

再次感谢您的建议!它有时总是最简单的错误,如获取os.walk函数的顺序,让你! – BJEBN

2

我想你已经混淆了你应该使用的方式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: 
      ... 
1

任何特别的原因,你需要做的是在Python?简单的shell命令会不会更简单?如果您使用的是类Unix系统,或者有权访问Windows上的Cygwin:

find src_dir -name "*dem.tif" -exec mv {} dst_dir 
相关问题