阿加西的python之旅

《笨方法学Python》加分题17

题目
通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 os.path.exists 在拷贝前判断被拷贝的文件是否已经存在,之后由用户判断是否继续完成拷贝。

新知识
os.path.exists 是一个本题的新知识点。和 sys 一样,os 也是 python 自带的基本库中的一员,主要提供和操作系统有关的功能。其中 path 正如其名提供了和路径操作有关的功能。在 path 模块中拥有 exists 这个方法,它的作用是判断所提供的文件名是否已经存在于磁盘中,如果已经存在则返回 False ,反之则返回 True

len() 用来返回其中项目的数量,例如

1
2
3
# 返回字符串的长度
>>> len("abcde")
5

加分练习
在多读读 import 的资料,将 python 运行起来,试试这条命令。
这个脚本是在有点烦人,没必要在拷贝前问一遍把,没必要在屏幕上打印那么多东西吧。试着删掉一部分功能,让它使用起来更加友好。
看看你能把这个脚本改多短,Zed 能改为一行。
在 liunx 系统的同学可以了解一下 cat 命令(shell终端中输入 man cat ),通过它检查拷贝是否成功了。
找出为什么要在代码中写 out_put.close()

17.0 基础练习

复制代码
 1 # 载入 sys.argv, os.path.exists 模块,以获取脚本运行参数。
 2 from sys import argv
 3 from os.path import exists
 4 
 5 
 6 # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 from_file, to_file。
 7 script, from_file, to_file = argv
 8 
 9 print(f"Copying from {from_file} to {to_file}")
10 
11 # we could do these two on one line, how?
12 in_file = open(from_file)
13 indata = in_file.read()
14 
15 # 打印文件字符长度。
16 print(f"The input file is {len(indata)} bytes long")
17 
18 # 打印目标文件是否已经存在。
19 print(f"Does the output file exist? {exists(to_file)}")
20 # 用户决定是否完成复制操作
21 print("Ready, hit RETURN to continue, CTRL-C to abort.")
22 input()
23 
24 # 以写入模式打开目标文件
25 out_file = open(to_file, 'w')
26 # 写入复制的内容
27 out_file.write(indata)
28 
29 # 打印操作完成(实际打印这段话的时候根本没完成)
30 print("Alright, all done.")
31 
32 # 关闭文件(真保存至硬盘)
33 out_file.close()
34 in_file.close()
复制代码

 

利用了之前练习产生的 ex17_test.txt 进行拷贝。linux下的同学使用 cat ex17_new_file.txt 可以把拷贝后的内容打印在屏幕上

17.2 友好的精简代码

复制代码
 1 # 载入 sys.argv, os.path.exists 模块,以获取脚本运行参数。
 2 from sys import argv
 3 from os.path import exists
 4 
 5 
 6 # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 from_file, to_file。
 7 script, from_file, to_file = argv
 8 
 9 
10 # we could do these two on one line, how?
11 indata = open(from_file).read()
12 
13 open(to_file, 'w').write(indata)
复制代码

这样一来,只是读取和写入文件,其他提示都没有,如果文件已存在则直接覆盖。

 

17.3 极限精简

复制代码
 1 # 载入 sys.argv, os.path.exists 模块,以获取脚本运行参数。
 2 from sys import argv
 3 from os.path import exists
 4 
 5 
 6 # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 from_file, to_file。
 7 script, from_file, to_file = argv
 8 
 9 
10 # we could do these two on one line, how?
11 open(to_file, 'w').write(open(from_file).read())
复制代码

 

17.5 为什么要 output.close()
原因在于如果不写,则新复制的文件中是不会保存任何内容的。也就是没有保存(如同在 16 题 Zed 介绍的一样)
out_put = open(to_file, 'w') 执行时会创建 to_file 文件,但是没内容
out_put.write(indata) 执行时,内容会写入到 to_file 的内存数据中,但仍未写入硬盘。
只有在执行 close 时 python 才指定文本的各种操作已经结束了,不会再有任何变化,这个时候在写入硬盘可以尽可能地减少硬盘读写操作,提高效率(特别在特大文件的时候)

那么为什么在 精简练习、极限精简练习 中不需要关闭呢?
我的理解:
关键点在于没有使用变量,也就是没有个打开的文件起名字。
这个时候,任何操作是一次性的,我们没办法在写入了一些东西后再说“喂,就你,你再写入这些内容”,python 不知道这句‘喂’说的是哪一个内存堆栈中的数据。
所有没有其名的代码都是一次性的,不会保存在内存中,针对 open 来说,python 就自动关闭它了。

posted on   阿加西的python之旅  阅读(496)  评论(0编辑  收藏  举报

编辑推荐:
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示