《笨方法学Python》加分题17

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

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

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

# 返回字符串的长度
>>> 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 就自动关闭它了。

原文地址:https://www.cnblogs.com/python2webdata/p/10059277.html