目标:获取多层文件夹中每个文件的文件名,排列顺序要按照windows的排列顺序来;
问题:目前通过两种方式获得的名称都不是按照Windows文件夹排序的,查了一下这个是按照ASCII码的排列顺序来的;
先记录一下如何获取文件名:
方法一:新建一个TXT,然后里面写一行 dir/a/s/b>LIST.TXT,把txt的后缀名改成bat,运行一下即可
方法二:直接传入到Excel pqquery 里,从新建查询——从文本——文件夹,这里直接把扩展名单列出来了,方便后续筛选;
方法三:通过Python的os
初步都试了一下,发现拿到的数据都不是按照Windows默认的排序,查了一下,目前发现Python的有一个库natsort可以用来排序
import os
from natsort import ns, natsorted
dir1 = r'D:\工作表\工作文件\19任务十九:合同\新建文件夹 (2)\资管长单1'
list1 = os.listdir(dir1)
#把第二层文件夹按照自然顺序排序
list2 = natsorted(list1,alg=ns.PATH)
fp = open(r'D:\test\pth13.csv','a',encoding = 'utf-8')
# 把第二层文件夹拼接成链接,并且放入list5
list5 = []
for t in list2:
pth1 = os.path.join(dir1,t)
list5.append(pth1)
# list4用来放最终的文件名
list4 = []
# 遍历list5
for n in list5:
# print(n)
for root,dirs,files in os.walk(n):
# list3用来放第二层文件夹中的文件名
list3 = []
for file in files:
pth = os.path.join(n,file)
list3.append(pth)
list3 = natsorted(list3,alg=ns.PATH)
list4.append(list3)
# print(list4)
# 写入csv
for ft in list4:
for it in ft:
it = it+'\n'
# print(it)
fp.write(it)
fp.close()
print('finish')
改良版
注意下os.path.isdir(path) 和os.path.isfile(path) 判断文件的类型
import os
from natsort import ns,natsorted
def get_path(dir_pth):
for root,dirs,files in os.walk(dir_pth):
# 把文件夹名称也放进去,这样后续看的更清楚
list_name = []
list_name.append(dir_pth)
for file in files:
fil_name = os.path.join(dir_pth,file)
list_name.append(fil_name)
list_name = natsorted(list_name,alg=ns.PATH)
return list_name
if __name__ == "__main__":
# 第一层文件夹链接
fir_dir = r'D:\工作表\工作文件\19任务十九:合同\新建文件夹 (2)\资管长单1'
fp = open(r'D:\test\pth14.csv','a',encoding = 'utf-8')
dir_list =os.listdir(fir_dir)
# #把第二层文件夹名称按照自然顺序排序
dir_list =natsorted(dir_list,alg=ns.PATH)
# 把第二层文件夹拼接成链接,然后放入sec_list中
sec_list = []
for i in dir_list:
sec_pth = os.path.join(fir_dir,i)
sec_list.append(sec_pth)
# print(sec_list)
final_list = []
for t in sec_list:
# 判断是文件夹的话
if os.path.isdir(t):
dir_pth = t
# print(t)
list5 = get_path(dir_pth)
# print(list5)
final_list.append(list5)
print(final_list)
for ft in final_list:
for nt in ft:
it = nt+'\n'
fp.write(it)
fp.close()
print('finish!')