今天在分类代码和整理文件时发现需要创建近100个文件夹,文件夹名呈规律性递增,如‘Question1-lv1’,‘Question2-lv1’, ‘Question(n)-lv1’, 这是问题数量的递增,然后便是问题等级的递增,Q1~Q30 为等级一类型,Q20~60为等级二,其余为等级三。在用鼠标点点点创建了5个文件以后,猛然醒悟:这样下去得创建到猴年马月,于是捣鼓了一下Python的文件操作。实现了一下功能:
首先,Python对文件实现操作需要用到 os 模块
import os
首先我欲创建的带名字的文件夹们如下:
这里只是节选一部分作为例子说明哈。我们现在来逐步拆解思路
Step1:找规律,发现只有数字在不断增大(6–14),其余并没有变化。先来for一下输出6到14这几个数,可能这一步看起来比较幼稚,但从最简单的知识点开始想起往往能带来不一样的灵感。
for i in range(6, 15): # range函数存在差一法则,即数学上的左闭右开区间
print(i, end=', ') # end= 参数实现不换行输出,用 逗号+空格 隔开
结果如图
既然是要创建文件夹,那就来看看创建单个文件夹的文件操作。
新单词:dir
我爱学英语
abbr. 目录(directory);方向(direction);用法(directione);
指示(direct)
n. (Dir)人名;(塞)迪尔
新单词:path, mode, exit:
即括号内有这三个参数可以选择,这里我们舍去参数path,表示就是在当前路径下面创建,即Pycharm左侧工作栏可以看到的,exit_ok: 表示如果文件夹已经存在,那就什么都不做,这里我给了这个exit_ok,加粗,因为有个重点,如果重复创建相同名字的文件夹,则会报错
makedirs:做 dir 嘶,这里有复数,难道就这么简单就可以创建目录们了吗?
import os
os.makedirs('这是要被创建的文件夹')
结果
只成功创建了一个,这个时候,我们在这个基础上再创建一个同名的文件夹,先是不添加 exit_ok=True 这个参数的
报错啦,牢记:同名文件夹已经存在,要么更换名字,要么添加exit参数
有点像 try–except—finally 捕获异常,先让程序运行再说,不要被一些细枝末节打扰卡住报错等等。
根据刚刚的思路热身我们可以发现,应该要有一个 “模板” ,也就是除了规律数字不同以外其他都相同的模板,然后将数字规律 逐个放入 文件夹名字中,也就是 新单词mode 这个参数里面。
mode: Question()–lv2,中间的阔哈是要循环添加进去的数字
个人感觉精华全部在这里了,当时想着这么能够循环输出类似的效果
就在这时,灵光一闪,老早之前学习过 格式化输出 ,
dir_number = 1
content = f'Question{dir_number}' 比 .format() 要快的方法
content2 = 'Question{}'.format(dir_number)
print(content)
print(content2)
这里用了一个用了一个更快的方法哈哈,在引号前面加个f,便可以直接在花括号中放入想要被格式化的东西哈,如果对格式化还不是很理解的朋友 可以看看下面哈
age = 20
age = str(age)
print("我今年" + age + '岁了。')
print(f'我今年{age}岁了')
print('我的年龄为{}'.format(age))
请看大屏幕
最短平快的 f与引号 这个组合,另外两个 隐约透露出一股小学生的气息
尤其是第一个
简短的休息过后,再次灵光一闪,这个 mode 不就是:
"Question{}–lv2" 吗?,于是赶紧放进循环
mode = 'Quesiton{}--Lv2'
for i in range(1,5):
print(mode.format(i))
这里我没有用 f + 引号 这个组合,因为我的mode本来就已经有引号了
好了,离大功告成只剩一步了,只需要将print改成 os.马克敌人是 就行了,当然也不要忘了加上 exit_ok=True 这个参数,养成提前预测到异常出现的地方是一个非常好的习惯哈
mode = 'Quesiton{}--lv2'
for i in range(1,5):
os.makedirs(mode.format(i), exist_ok=True)
大功告成,请看左栏
批量创建文本文档,csv文件等等都是同样的思路哈
还是猛地发现我文件夹的命名有点问题,lv 不够 Lv 美观,完蛋了,难道要全部删除创建好的再来一次吗?经过第一次猛然醒悟以后便有了信心,不如来个循环更改名字?
说干就干,我们先来试一下更改单个文件夹的名字
os.rename('这个是要被创建的文件夹', '改名吧小老弟')
好了,不难理解,新单词:rename 括号里面的第一个参数:旧文件夹的名字,第二个:新文件夹的名字
看到这里,大家肯定已经轻松知道要使用格式化,循环填补数字来实现改名了。
因为有两个参数,自然而然就应该能想到应该要两个格式化
来试一下
mode = 'Quesiton{}--lv2'
new_mode = 'Question{}--Lv2'
for i in range(1,5):
os.rename(mode.format(i), new_mode.format(i))
mode = '我是第{}个文件夹啊'
for i in range(1,5):
with open(mode.format(i) + '.txt', 'w', encoding='utf-8') as f:
pass
这里就不一一解释啦,pass为占位语句,想不出写什么,但是又要保持程序完整性,所以就先占个位置
content = '这个东西得想办法写进刚刚创建的五个文本文档(记事本)里面'
写内容的时候应该改为追加写,即a:append,否则会覆盖掉之前的内容,不过因为这五个文件里面本来什么都没有所以这里可以不用管,但是为了保持良好的习惯还是 a它一下吧
content = '这个东西得想办法写进刚刚创建的五个文本文档(记事本)里面'
mode = '我是第{}个文件夹啊'
for i in range(1,5):
with open(mode.format(i) + '.txt', 'a', encoding='utf-8') as f:
f.write(content)
覆盖写和追加写绝对是一个超级大坑,在两个不同的py文件也可以跨区域影响
坑点可以见我另一篇博客
https://blog.csdn.net/weixin_43329700/article/details/86768422
它进去了!!,另外五个文件也是这样。
这篇文章只展示了非常小的一部分文件操作,还有各种骚操作有待发掘,望对大家有帮助,有什么更好的方法记得留言分享!PS:养成边编程边喝水的习惯很重要