zoukankan      html  css  js  c++  java
  • 《笨方法学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 就自动关闭它了。

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/python2webdata/p/10059277.html
Copyright © 2011-2022 走看看