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

利用了之前练习产生的 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. Eclipse 上传 删除 下载 分析 hdfs 上的文件

    本篇讲解如何通过Eclipse 编写代码去操作分析hdfs 上的文件. 1.在eclipse 下新建Map/Reduce Project项目.如图:  项目建好后,会默认加载一系列相应的jar包. 下 ...

  2. 【学习】数据规整化:清理、转换、合并、重塑(续)【pandas】

    @合并重叠数据 还有一种数据组合问题不能用简单的合并或连接运算来处理.比如说,你可能有索引全部或部分重叠的两个数据集 使用numpy的where函数,它用于表达一种矢量化的if - else a = ...

  3. mac环境破解navicat premium 12.1

    1. 下载破解工具 https://github.com/DoubleLabyrinth/navicat-keygen/tree/mac 其中,navicat-keygen为破解器:navicat-p ...

  4. 腾讯、爱奇艺、优酷等vip视频在线解析

    http://vip.mist.xin 菠萝蜜TV全网VIP视频在线看 菠萝蜜tv http://jx.mist.xin 全网VIP视频在线解析接口 免费全网影视VIP视频vip会员免广告看电影!亲们 ...

  5. JAVA学习记录(二)————JAVA中的IO

    Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列. 数据流是一串连续不断的数据的集合,就象水 ...

  6. Spring整合quart初识

    Spring集成quart有两种方式,一种是实现Job接口,一种是继承QuartzJobBean 刚开始报错:持久化时未序列化异常 <bean id="simpleJobDetail& ...

  7. sed的替换元字符的语法

    \(和\)用于保存正则表达式的一部分,而\1和\2用于保存回调的部分. 例如: 将sample.txt,内容如下 1...........55...........1010..........1010 ...

  8. frist Django app — 三、 View

    前面已经说过了Django中model的一些用法,包括orm,以及操作的api,接下来就是搭一些简单的界面学习view——Django中的view.主要介绍以下两个方面: url映射 请求处理 模板文 ...

  9. [Flutter] 因为不讲这个重点, 全网所有 flutter 实战视频沦为二流课程

    二流课程也有其存在的价值,看到不同组件的轮流使用也是不断熟悉的过程,不过太眼花缭乱了. 授人以渔,基础用法是其一,讲清套路是其二,不然坑萌新. 那么 flutter 的套路是什么呢,我认为有下面几点: ...

  10. angualrjs添加ngTouch

    angularjs没有touch时间需要添加directive 插件代码如下 "use strict"; angular.module("ngTouch", [ ...