Python Glob打印丢失文件列表
我错过了什么 我正在尝试打印丢失文件的列表,例如,我使用“WorhSheet_X”和“WorhSheet_Y”作为预期文件,如果文件夹中有丢失的文件,我希望能够打印丢失文件的名称 否则,这就是为什么我要尝试创建一个代码,当有丢失的文件时自动发送一封电子邮件,并且在电子邮件的正文上有丢失的文件名Python Glob打印丢失文件列表,python,glob,Python,Glob,我错过了什么 我正在尝试打印丢失文件的列表,例如,我使用“WorhSheet_X”和“WorhSheet_Y”作为预期文件,如果文件夹中有丢失的文件,我希望能够打印丢失文件的名称 否则,这就是为什么我要尝试创建一个代码,当有丢失的文件时自动发送一封电子邮件,并且在电子邮件的正文上有丢失的文件名 import glob dir_to_search = r'G:\folder' files_in_dir = glob.glob("{}{}".format(dir_to_search,'*.xls
import glob
dir_to_search = r'G:\folder'
files_in_dir = glob.glob("{}{}".format(dir_to_search,'*.xls?'))
list_of_files = glob.glob('WorkSheet_X*','WorkSheet_Y*', recursive=True)
missing_files = [x for x in list_of_files if x not in files_in_dir]
print(missing_files)
出现错误:
Traceback (most recent call last): ...
list_of_files = glob.glob('WorkSheet_X*','WorkSheet_Y*', recursive=True)
TypeError: glob() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given
编辑:
我需要搜索部分名称为“工作表\u X*”的文件,因为每天在“工作表\u X”中的“X”之后都有不同的日期。您正在比较存在于不同目录中的文件的完整路径名,因为现在的代码是,您正在当前工作目录中搜索patterns WorkSheet_X*和WorkSheet_Y*,这将不同于
dir_to_search
(如果不是,我不确定此程序的意义是什么)。无论如何,此代码允许当前工作目录是除dir\u to\u search
之外的某个目录。因此,这段代码拆分文件的完整路径名,只比较文件名,并尝试进行一些优化(以及对代码的更正):
如果我们讨论的是在dir\u to\u search
目录中构成模式'*.xls?
的大量文件,那么最好不要在\u dir集合中创建文件,而是为每个候选文件执行目录查找:
missing_files = [f for f in list_of_files if not os.path.isfile(os.path.join(dir_to_search, os.path.split(f)[1]))]
然而,有一个微妙的区别。假设我们找到一个名为工作表_X1.csv
的文件,它确实存在于dir\u to\u search
目录中。第一个方法将显示为缺少,因为它与模式*.xls?
不匹配。但是,由于它存在于正确的目录中,因此使用第二种方法不会将其报告为丢失。所使用的glob模式真的应该是“工作表\u X*.xls吗?”
?glob只采用一条路径,您需要分别进行两次搜索-一次搜索以工作表\u X开始的任何内容,另一次搜索工作表\u Y
,然后合并这两个列表。Glob不能使用两个路径,这就是为什么它说它有两个位置参数。一次只能将一个文件规范传递给Glob
,可以是“工作表_X*”或“工作表_Y*”,但不能同时传递这两个文件规范。但你的整个问题有点不清楚。您是否试图确定与当前目录中的模式工作表\u X*
匹配的文件及其任何子目录不在xls
文件中的G:\folder
?因为这似乎是您的代码正在尝试做的。正如其他人所说,您无法使用glob
一次匹配两件事。但是也许你可以使用[]
语法在同一个地方匹配不同的东西:工作表\uxy]*
。我应该做些什么来只搜索文件夹而不是子文件夹?我现在很忙,不能测试代码,但一旦测试它,如果它适合我,我会尽快回复你!谢谢你的支持!!!
missing_files = [f for f in list_of_files if not os.path.isfile(os.path.join(dir_to_search, os.path.split(f)[1]))]