0

ディレクトリのツリー内のすべての Excel ファイルを別のディレクトリにコピーする Python スクリプトを作成しています。簡単ですよね?

なんらかの理由で、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!"
4

2 に答える 2

1

あなたは(乱用)することができます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)

fnmatchより複雑なワイルドカードなどが必要な場合は、モジュールを確認することもできます...マッチング(おそらく次のようなもの):

def not_xlsx(path, names):
    actual_files = filter(os.path.isfile, names)
    return set(actual_files).difference(fnmatch.filter(actual_files, '*.xlsx'))
于 2012-09-28T16:13:53.290 に答える
0

このメソッドを使用するのは良いことですが、andの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!"

OK、車輪の再発明はしないでください。

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

ここを参照してください現在のディレクトリ内のすべてのサブディレクトリのリストを取得する

于 2012-09-28T15:21:23.433 に答える