我有一个文件夹,其中包含一个名为
的文件列表0.csv, 1.csv, 2.csv .... 359.csv
如何提取这些文件名中缺少的数字?假设列表以0开头并以359结尾。
以下代码段读取文件夹中的所有文件。
import os,sys
folder = '..Acad/Code'
for filename in os.listdir(folder):
infilename = os.path.join(folder,filename)
以下代码段显示整数列表中缺少的元素。
def missing_numbers(num_list):
original_list = [x for x in range(num_list[0], num_list[-1] + 1)]
num_list = set(num_list)
return (list(num_list ^ set(original_list)))
如何修改上述代码段以从上一代码的输出中读取?任何的想法?
答案 0 :(得分:2)
您的infilename
不会收集该文件夹的所有文件名,因为您会在每个循环中覆盖它。因此它只显示最后一个条目。使用列表推导这个解决方案怎么样:
#separate the file name from the file name extension for each file in the folder
filenumbers = [x.split(".")[0] for x in os.listdir(folder)]
#compare numbers in expected range with file numbers in folder
missingnumbers = [i for i in range(360) if str(i) not in set(filenumbers)]
答案 1 :(得分:1)
您应该按如下方式生成set
个整数:
my_set = set(int(f.split('.csv')[0]) for f in os.listdir('./') if os.path.isfile(f) and 'csv' in f)
然后将其与所有整数进行比较:
missing_ints = set(range(max(my_list))) - my_set
missing_files = [str(i) + '.csv' for i in missing_ints]
这将为您提供不在您拥有的文件列表中的整数
因此,如果您有0.csv
1.csv
和3.csv
,则my_set
为{0, 1, 3}
,max(my_set)
为3,set(range(max(my_list)))
为{0, 1, 2, 3}
然后差异missing_ints = set(range(max(my_list))) - my_set
为{2}
,因此missing_files = ['2.csv']
如果您有大量文件,比较set
将比比较字符串更快。