我想将文件从一个文件夹移动到另一个文件夹,但有一些文件异常。一个是特定的文件名,另一个是以AEIOU开头的所有文件夹。我怎么能做到最后一个例外?特定的文件名已经拥有它。感谢。
import os
import shutil
source_dir = "c:/data/abc"
special_dir = "c:/data/zxy"
exclude_files =["file.docx", "file2.xls"]
allfiles = os.listdir(sourcedir)
for each_file in allfiles:
if each_file not in exclude_files:
full_path_source_file = os.path.join(source_dir, each_file)
full_path_target_file = os.path.join(special_dir, each_file)
shutil.move(full_path_source_file, full_path_target_file)
答案 0 :(得分:1)
您可以定义自己的Exception并在必要时抛出它。 你的文件夹的一个例子:AEIOU:
class VocalFolder(Exception) :
def __init__(self, path) :
self.path = path
def __str__(self) :
return repr(self.path)
假设exclude_files
包含以AEIOU开头的文件夹的名称:
try:
if each_file not in exclude_files:
## do your stuff here
else:
raise VocalFolder(each_file)
except VocalFolder as ex :
print "Exception:", str(ex)
希望这有帮助。
以同样的方式为文件执行此操作。
答案 1 :(得分:0)
你想要的是这样的:
import os
import shutil
source_dir = "c:/data/abc"
special_dir = "c:/data/zxy"
exclude_files =["file.docx", "file2.xls"]
allfiles = os.listdir(sourcedir)
for each_file in allfiles:
if each_file not in exclude_files and
not (os.path.isdir(each_file) and each_file[0] not in 'AEIOU'):
full_path_source_file = os.path.join(source_dir, each_file)
full_path_target_file = os.path.join(special_dir, each_file)
shutil.move(full_path_source_file, full_path_target_file)
如果你想检查它是否是一个元音而不关心你想要做each_file[0].upper() not in 'AEIOU'
的情况,那将检查特定情况。
答案 2 :(得分:0)
您可以使用以下功能来帮助完成任务:
您对以AEIOU
开头的目录的附加约束可以表示为isdir(path) and name.startswith('AEIOU')
。请注意,您必须将完整路径传递给isdir()
,但只检查startswith()
的名称。因此,您需要在检查之前构建完整路径,并再次单独使用该名称(使用basename()
)。
但是如果你将所有内容构建到单个if
语句中,它就变得非常难以理解了。因此,我建议将其分解为函数:
def is_excluded(path):
name = basename(path)
if isfile(path) and name in ["file.docx", "file2.xls"]:
return True
if isdir(path) and name.startswith('AEIOU'):
return True
return False
然后,if
语句中的格式变为if not is_excluded(path)
。
一切都在一起:
from os.path import basename
from os.path import isdir
from os.path import isfile
import os
import shutil
source_dir = "c:/data/abc"
special_dir = "c:/data/zxy"
def is_excluded(path):
name = basename(path)
if isfile(path) and name in ["file.docx", "file2.xls"]:
return True
if isdir(path) and name.startswith('AEIOU'):
return True
# Or, if you actually want to check for dirs starting with a vovel:
# if isdir(path) and name[0] in 'AEIOU':
# return True
return False
allfiles = os.listdir(source_dir)
for each_file in allfiles:
full_path_source_file = os.path.join(source_dir, each_file)
full_path_target_file = os.path.join(special_dir, each_file)
if not is_excluded(full_path_source_file):
shutil.move(full_path_source_file, full_path_target_file)
修改:我刚刚根据您可能想要检查以元音开头的目录的评论来实现,因此单个字符['A', 'E', 'I', 'O', 'U']
。
如果是这种情况,您的新支票就会变为name[0].lower() in 'aeiou'
(不区分大小写)或name[0] in 'AEIOU'
(区分大小写)。
答案 3 :(得分:0)
您还可以尝试以下方法:
import os
import shutil
source_dir = "c:/data/abc"
special_dir = "c:/data/zxy"
exclude_files =["file.docx", "file2.xls"]
allfiles = os.listdir(sourcedir) # dirs are also included
for each_file in allfiles:
full_path_source_file = os.path.join(source_dir, each_file)
full_path_target_file = os.path.join(special_dir, each_file)
if os.path.isfile(full_path_source_file):
if each_file not in exclude_files:
shutil.move(full_path_source_file, full_path_target_file)
else: # each_file is a folder
if not each_file.upper().startswith('AEIOU'):
shutil.move(full_path_source_file, full_path_target_file)