《笨方法学Python》加分题17

时间:2021-11-25 10:22:54

题目
通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 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 基础练习

 # 载入 sys.argv, os.path.exists 模块,以获取脚本运行参数。
from sys import argv
from os.path import exists # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 from_file, to_file。
script, from_file, to_file = argv print(f"Copying from {from_file} to {to_file}") # we could do these two on one line, how?
in_file = open(from_file)
indata = in_file.read() # 打印文件字符长度。
print(f"The input file is {len(indata)} bytes long") # 打印目标文件是否已经存在。
print(f"Does the output file exist? {exists(to_file)}")
# 用户决定是否完成复制操作
print("Ready, hit RETURN to continue, CTRL-C to abort.")
input() # 以写入模式打开目标文件
out_file = open(to_file, 'w')
# 写入复制的内容
out_file.write(indata) # 打印操作完成(实际打印这段话的时候根本没完成)
print("Alright, all done.") # 关闭文件(真保存至硬盘)
out_file.close()
in_file.close()

《笨方法学Python》加分题17

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

17.2 友好的精简代码

 # 载入 sys.argv, os.path.exists 模块,以获取脚本运行参数。
from sys import argv
from os.path import exists # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 from_file, to_file。
script, from_file, to_file = argv # we could do these two on one line, how?
indata = open(from_file).read() open(to_file, 'w').write(indata)

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

17.3 极限精简

 # 载入 sys.argv, os.path.exists 模块,以获取脚本运行参数。
from sys import argv
from os.path import exists # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 from_file, to_file。
script, from_file, to_file = argv # we could do these two on one line, how?
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 就自动关闭它了。

《笨方法学Python》加分题17的更多相关文章

  1. "笨方法学python"

    <笨方法学python>.感觉里面的方法还可以.新手可以看看... 本书可以:教会你编程新手三种最重要的技能:读和写.注重细节.发现不同.

  2. 笨方法学python 22,前期知识点总结

    对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...

  3. 笨办法学python 13题:pycharm 运行

    笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...

  4. 《笨方法学Python》加分题20

    加分练习通读脚本,在每一行之前加注解,以理解脚本里发生的事情.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line ...

  5. 《笨方法学Python》加分题15

    本题本题开始涉及文件的操作,文件操作是一件危险的事情,需要仔细细心否则可能导致重要的文件损坏. 本题除了 ex15.py 这个脚本以外,还需要一个用来读取的文件 ex15_sample.txt 其内容 ...

  6. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  7. 《笨方法学Python》加分题29

    加分练习猜一猜 “if 语句” 是什么,他有什么作用.在做下一道题之前,试着用自己的话回答下面的问题: 你认为 if 对他下一行代码做了什么?为什么 if 语句的下一行需要 4 个空格缩进?如果不缩进 ...

  8. 《笨方法学Python》加分题28

    #!usr/bin/python # -*-coding:utf-8-*- True and True print ("True") False and True print (& ...

  9. 《笨方法学Python》加分题16

    基础部分 # 载入 sys.argv 模块,以获取脚本运行参数. from sys import argv # 将 argv 解包,并将脚本名赋值给变量 script :将参数赋值给变量 filena ...

随机推荐

  1. JQuery中的事件以及动画

    .bind事件 <script src="script/jquery-1.7.1.min.js"></script> <script> $(fu ...

  2. 201521123098 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  3. CSS 弹性容器

    该文章为英文原文译文及一些自己的拙见墙裂推荐读原文浏览原文请戳这里 : CSS-STRICKS 弹性布局 (Flexbox Layout) 什么是弹性布局 Flexbox Layout 模块旨在提供一 ...

  4. MySQL 非空约束位置不同对自增列造成的影响

    MySQL版本 select version(); +------------+ | version() | +------------+ | 5.7.21-log | +------------+ ...

  5. 信息摘要算法之五:HMAC算法分析与实现

    MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMAC算法. ...

  6. 【Linux】【Jenkins】系统配置报反向代理设置有误问题的解决方案

    1.如图所示: 2.点击更多信息,查看解决办法: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+says+my+reverse+proxy+s ...

  7. Linux systemd limits

    https://www.cnblogs.com/IMxY/p/8941022.html limits 关于Centos 7 / RHEL 7 中的limits要了解以下几点: CentOS 7 / R ...

  8. 【洛谷p1319】压缩技术

    (许久不见,甚是想念) 压缩技术[传送门] 洛谷上滴算法标签: 然而这是一道入门难度的题.(不管不管,就写它了) 好的先说一下思路吧wait!我忘记了咋做的当时. 首先做题第一道坎儿,如何输入若干个( ...

  9. C&plus;&plus;进阶--不让编译器自动生成类函数

    //############################################################################ /* * 不让编译器自动生成类函数 * * ...

  10. glob获取指定目录下的东西&plus;更改工作目录

    一:不更改工作目录 import glob path = 'image/imgs/*.jpg' # 正则匹配 指定路径 file_path = glob.glob(path) # 即可获取所有jpg的 ...