【NOTE】
《Python 程序设计—— 从入门到实战》——5.2第一个程序
前期工作
书上给的软件工程方法论
程序的构想与实现
软件工程的思路。
1)理清问题的需求
- 待解决的问题
- 程序名称
- 对象
- 处理
- 运行结果
- 注意事项
2)定义要存储的数据及相关类型
- 查处理目标对象需要导入什么模块(包导入)
- 设置变量及其类型(输入、输出、存放(列表))
- 设计算法与绘制流程图(列出执行的步骤,逻辑的顺序)
3)动手编写程序
- 查询每一步需要的代码。
- 组合编写
4)简易调试方法
错误的种类:
- 语法错误:拼写,需要检查即可
- 逻辑错误
处理步骤思路
和书上给的不太一样。
处理步骤:
1、检查文件夹:source_dir,是否存在,不存在退出
2、搜索source中的文件名和文件大小
4、检查磁盘是否够用(剩余磁盘容量应大于source的文件大小的和)不满足退出、
5、设置文件夹target_dir为output
6、判断源文件夹中是否存在同名文件夹。
7、开始复制。图像编号imageno=0,写一个循环,读每一个文件,命名后写到目标文件夹中。条件是当文件夹中所有文件都被读了以后结束。
正式编写
用户输入路径
print("本程序用于重新编号文件\n请输入要操作的文件路径:")
source_dir=input()
检查路径是否存在:os.path.exists
if os.path.exists(source_dir) == 0:
# 1、检查文件夹:source_dir,是否存在,不存在退出
print("目标文件夹不存在")
exit(1)
加载文件列表:glob.glob
- glob.glob 带路径的列表
- os.listdir 只有文件名的列表
files = glob.glob(source_dir + "\\*.*")
下面这种方法是在搜os模块的时候发现的,试了一下,输出的是只有文件名没有路径名,所以未采用。
files = os.listdir(source_dir)
调试过程:
查看输出的内容:
print("files:", files)
print("文件加载完毕")
检查磁盘是否够用
剩余磁盘容量应大于source的文件大小的和
计算文件夹大小: os.path.getsize()
计算文件夹大小
size = 0
for f in files:
size = size + os.path.getsize(f)
调试过程:
print("size:", size)
计算剩余磁盘大小:
- windows:使用ctypes.ulonglong,如下
- linux:使用os.statvfs
这里书上只给了linux的命令,报错报了好久。。。
if platform.system() == 'Windows':
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p("/"), None, None, ctypes.pointer(free_bytes))
disk = free_bytes.value
else:
st = os.statvfs("/")
disk = st.f_bsize * st.f_blocks
调试过程:
print("disk:", disk )
比较大小
if size>disk:
print("磁盘容量不够!")
exit(1)
else:
print("磁盘检查完毕")
新建目的文件夹
# 设置文件夹target_dir为output
target_dir = source_dir + "/output"
if os.path.exists(target_dir):
print("目的文件夹已存在,请更改输出文件夹名称")
exit(1)
else:
# 6、新建目的文件夹
os.mkdir(target_dir)
print("新建文件夹成功")
文本处理、编号、复制
no=0
for f in files:
#切割路径与文件名
dirname , filename = f.split(source_dir)
#文件名切割文件名和后缀
mainname, extname = filename.split('.')
target_file = target_dir +'/' +str(no) + '.' + extname
shutil.copyfile(f,target_file)
print("复制" + target_file + "成功")
no += 1
print("文件复制成功,请前往目标文件夹查看!")
实际过程中遇到的问题
教材示例和实际操作的环境不一致
IDE:Pycharm
Python版本:3.9.6
安装包:pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
也可以在pycharm下面的包管理地方导入包
书上有一部分内容是介绍anaconda使用的,教学环境是linux,所以有一些操作系统层面的语句经常编译不过去。
顺序上的一些问题
由于在一开始没有理解书上的示例程序的流程,导致没办法按照方法论的顺序实行。
因为程序设计的实现流程是未知的。所以先写出来的那个流程可能最后实现的时候不按照那个东西去执行。
总结
想到哪写到哪
- 调试可以使用pycharm的断点,也可以多加输出。
- 一块一块的去验证,写出来一段就验证一段,这样不会一下子出很多问题很烦;
- 程序的优化也是多加输出,把一些关键的动作完成后写一下,不然如果没有输出不知道是哪一步出了问题
- 语法习惯。if,else,for,这些后面总是忘记加冒号,有的时候不自觉就把分号打出来又删掉。。。
- 优化的角度上来说,操作的参数能不写死就不写死。使用input
- 一个变量被赋值以后,一个函数被计算以后,使用print看看是不是想要的内容。
- 在运行中优化