嗨,我正在尝试使用os.listdir
加载几个文件,但它会跳过几个文件。
直接的文件格式为:
a_0.csv
a_1.csv
a_2.csv
·
·
·
a_25.csv
但是os.listdir
仅接受文件 0,1,10,11 ..
编号为 3,4,5 ... 的文件不在输出对象中。
这是我的功能:
def best_fit_from_attemp(self):
arr =[]
for i in os.listdir(self.path_to_files):
print("i",i)
if i[0] == 'f' and i[1] == 'i' and i[2] == 't':
print("searching for smallest number... ",i)
arr.append(self.find_min_fitness(i))
输出:
i fitness_gen_0.csv
searching for smallest number... fitness_gen_0.csv
i fitness_gen_1.csv
searching for smallest number... fitness_gen_1.csv
i fitness_gen_10.csv
searching for smallest number... fitness_gen_10.csv
i fitness_gen_11.csv
searching for smallest number... fitness_gen_11.csv
答案 0 :(得分:1)
我的猜测是文件名都在那里,只是顺序不符合您的期望。
文件名是字符串。它们根据字符串排序逻辑进行排序:想象一下,将每个0替换为a
,将每个1替换为b
,将每个2替换为c
,依此类推,现在考虑如何字符串将按字母顺序排列。普通的字符串排序并不知道我们喜欢写数字的最低有效位 last 。在普通的字符串排序中,它确实确实先执行1
,然后进行10
,然后进行11
-类似于对字符串进行排序b
,然后进行ba
,然后进行{ {1}},这是正确的字典顺序。它会经过很长的时间才能到达以bb
开头的任何内容(类似地,字典中以3
开头的单词比以d
开头的单词晚得多)。
您可以研究执行“自然排序”的算法/程序包。或者,最可取的最佳实践是简单地将文件命名约定改成开头:确保文件名中嵌入的数字都具有相同的数字位数,并在必要时使用前导零(b
,{{ 1}}等。
答案 1 :(得分:0)
我非常确定问题出在函数self.find_min_fitness(i)
上。列出前几个文件后,其中的某些部分必须导致程序中断。
文件按名称按os.listdir()
排序。列出文件时,它优先使用1
而不是2
,这就是为什么所有以1
开头的文件名都被列出的原因。
作为解决方案:也许尝试注释掉调用self.find_min_fitness(i)
的这一行,看看问题是否仍然存在
答案 2 :(得分:0)
这似乎有问题。
self.find_min_fitness(i)
好吧,我建议您尝试这样的事情。
下面的目录包含编号的文件列表。
files = os.listdir("C:/Users/Danish/Documents/JavaScriptPrimerRepo/MyJSCodes")
for i in files:
print(i)
这是下面的示例输出。
00_BlankPage.html
01_DataType.html
02_LinkingExternalJsfile.html
02_Script.js
03_VariableMutation_cohersion.html
04_Operators.html
05_SampleCodeCalculatingBMI.html
注意:我在迭代之前将结果存储在单独的变量中,重要的是fileName以数字开头。