Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试复制目录中的所有Excel文件,但未发生任何操作,也未调用任何错误_Python_Batch File_Copy_Shutil - Fatal编程技术网

Python 尝试复制目录中的所有Excel文件,但未发生任何操作,也未调用任何错误

Python 尝试复制目录中的所有Excel文件,但未发生任何操作,也未调用任何错误,python,batch-file,copy,shutil,Python,Batch File,Copy,Shutil,我正在编写一个python脚本,将目录树中的所有Excel文件复制到另一个目录。直截了当,对吧 好吧,出于某种原因,shutil.copy(或者copy2,或者copyfile)什么都不做,甚至不吐出错误消息。有什么想法吗 def goFunc(self, event): print "Starting Go" for (path, dirs, files) in os.walk(self.path): print path print dirs

我正在编写一个python脚本,将目录树中的所有Excel文件复制到另一个目录。直截了当,对吧

好吧,出于某种原因,shutil.copy(或者copy2,或者copyfile)什么都不做,甚至不吐出错误消息。有什么想法吗

def goFunc(self, event):
    print "Starting Go"
    for (path, dirs, files) in os.walk(self.path):
        print path
        print dirs
        print files
        for every_file in files:
            filename = str(path) + str(every_file)
            print filename
            if filename.endswith('.xlsx'):
                print "Copying " + filename + " to " + str(self.path2)
                shutil.copyfile(filename, str(self.path2))
    print "All DONE!"
因此,我添加了一个尝试,除了复制步骤之外,似乎这一步才是问题所在:

def goFunc(self, event):
    print "Starting Go"
    for (path, dirs, files) in os.walk(self.path):
        print path
        print dirs
        print files
        for every_file in files:
            filename = str(path) +'/' + str(every_file)
            print filename
            if filename.endswith('.xlsx'):
                print "Copying " + filename + " to " + str(self.path2)
                try:
                    shutil.copyfile(filename, str(self.path2))
                except:
                    print "Something went wrong"
                    pass
    print "All DONE!"
现在输出为:

Starting Go
/Users/laptop/Desktop
[u'test']
[u'.DS_Store', u'.localized', u'Maytag.xlsx', u'mer.xlsx']
/Users/laptop/Desktop/.DS_Store
/Users/laptop/Desktop/.localized
/Users/laptop/Desktop/Maytag.xlsx
Copying /Users/laptop/Desktop/Maytag.xlsx to /Users/laptop/test
Something went wrong
/Users/laptop/Desktop/mer.xlsx
Copying /Users/laptop/Desktop/mer.xlsx to /Users/laptop/test
Something went wrong
/Users/laptop/Desktop/test
[]
[]
All DONE!
由于某些原因,这些文件仍然没有被复制

解决方案:

看起来我需要向目标添加文件名。现在它就像一个符咒!谢谢大家的时间和帮助

def goFunc(self, event):
    print "Starting Go"
    for (path, dirs, files) in os.walk(self.path):
        print path
        print dirs
        print files
        for every_file in files:
            filename = str(path) +'/' + str(every_file)
            print filename
            if filename.endswith('.xlsx'):
                print "Copying " + filename + " to " + str(self.path2) + '/' + str(every_file)
                try:
                    shutil.copyfile(filename, str(self.path2)+'/'+ str(every_file))
                except:
                    print "Something went wrong"
                    pass
print "All DONE!"

使用th
os.walk
方法很好,但它也会返回类似
[]
的内容,所以请小心使用。 下面是一个类方法,它应该:

def goFunc(self, event):
    '''this should be enough to copy files that end with xlsx'''
    print "Starting Go"
    for file in os.listdir(Yourdir):
        if file.endswith('.xlsx'):
                print "Copying " + filename + " to " + str(self.path2)
                shutil.copyfile(filename, self.path2)
    print "All DONE!"
好的,不要重新发明轮子:

dirs=[o for o in os.listdir(TopOfTree) if os.path.isdir(o)]
for dir in dirs:
    goFunc(event)
参见此处

您可以(ab)使用
shutil.copytree

import shutil
import os.path

src = '/home/jon/Development/number5'
dst = '/home/jon/tmpso'

def not_xlsx(path, names):
    return {name for name in names if os.path.isfile(name) and not name.endswith('.xlsx')}

shutil.copytree(src, dst, ignore=not_xlsx)
如果需要更复杂的通配符/etc,还可以查看
fnmatch
模块。。。匹配(可能类似于):


filename
中没有路径分隔符……我刚想发布我把它放进去的内容,但它仍然不起作用。每个文件的路径2都在更改吗?如果没有,它将继续覆盖path2是什么。copyfile需要dst的完整文件名。如果您想要接受目标目录的内容,可以使用shutil.copy。我之所以使用os.walk而不是os.listdir,是因为我想要文件树中的所有文件,而不仅仅是一个目录。我想我可以编写一个递归函数来实现这一点,我只是觉得os.walk会更简单。哦,对不起,我不清楚。只需过滤掉像“[]”和“.”之类的内容,看看os.walk的输出。我想这可能是你的问题的原因。我也这么认为,但当我看到我的打印语句的输出时,它们看起来很好:
Starting Go/Users/laptop/Desktop[u'test'][u'.DS_Store',u'.localized',u'Maytag.xlsx',u'mer.xlsx']/Users/laptop/Desktop/.DS_Store/Users/laptop/Desktop/.localized/Users/laptop/Desktop/Maytag.xlsx复制/Users/laptop/Desktop/Maytag.xlsx到/Users/laptop/test
,然后什么都没有发生我只是扩展了如何获取子目录列表,从中复制所有Excel文件。实际上,文件可能有问题,看到我的自我回答了吗
def not_xlsx(path, names):
    actual_files = filter(os.path.isfile, names)
    return set(actual_files).difference(fnmatch.filter(actual_files, '*.xlsx'))