题目
上一题的加分练习中有让我们查看 file 的帮助文档,虽然 python3 中已经没有 file 这个东西了,不过我们通过 help()
知道了被 open
打开后的这个东西是什么以及它的帮助文档,如果大家有大概看过应该有见过下面的几个方法(函数),请记住它们:
- close —— 关闭文件。如同编辑器中
文件 -> 保存
的作用。 - read —— 读取文件内容。可以把结果赋值给一个变量。
- readline —— 读取文本文件中的一行内容。
- truncate(size) —— 将文件截断指定 size 字节,size 后的内容将删除请小心使用。
- writer(something) —— 把 something 写入文件。
本题将练习写入文件 writer
的使用。
加分练习
- 如果觉的自己没弄懂的话,就用老办法,个每一行加注释。至少能知道哪一行没懂。
- 写一个和 15 题类似的脚本,使用
read
和argv
读取由 基础练习 所创建的那个文本文件。 - 文件中重复的地方太多了,试着用一个
target.write()
将line1
,line2
,line3
打印出来,可以使用字符串、格式化字符、转义字符。 - 找出为什么我们需要给
open
多赋予一个w
参数。
我的答案
16.0 基础练习 + 16.1注释
from sys import argv
# 通过解包 argv 获取 脚本名 和将要保存的 文件名
script, filename = argv
# 询问是否继续编辑文件 filename
print("We're going to erase %r" % filename)
print("If you don't want that, hit CTRL-C (^C).")
print("If you do want that, hit RETURN.")
# 等待用户输入是否继续编辑
input("?")
# 如果用户未输入 ctrl-c 则会继续执行
print("Opening the file...")
# 打开文件对象
target = open(filename, 'w')
# 没有指定 truncate() 的大小,所有实际上删除了文件的内容
print("Truncating the file. Goodbye!")
target.truncate()
# 获取三个 input 变量的内容
print("Now I'm going to ask you for three lines.")
line1 = input("line 1: ")
line2 = input("line 2: ")
line3 = input("line 3: ")
# 将内容写入文件(只在内存中,并未写入硬盘)
print("I'm going to write there to the file.")
target.write(line1)
target.write("\n")
target.write(line2)
target.write("\n")
target.write(line3)
target.write("\n")
# 关闭文件,将文件写入硬盘
print("And finally, we close it.")
target.close()
运行以一下脚本
可以在脚本所在文件价内发现新建的文档 test.txt 打开后其内容正如我们输入的三行内容。
16.2 写一个读取脚本
# 要求用 argv 方式,所有相见载入
from sys import argv
# 解包
script, filename = argv
print("脚本 %r 正在读取文件: %r ..." % (script, filename))
# 打开文件
file_open = open(filename)
# 用 print 打印出读取到的内容
print(file_open.read())
运行一下
16.3 优化脚本
# 太罗嗦了 16.3 题优化掉
# target.write(line1)
# target.write("\n")
# target.write(line2)
# target.write("\n")
# target.write(line3)
# target.write("\n")
nl = '\n'
target.write(line1 + nl + line2 + nl + line3 + nl )
16.4 open 为什么多了一个 w
参数
open()
的默认参数是 open(file, 'rt')
也就是读取文本的模式,默认参数可以不用填写。而本题练习是写入文件,因此不适应使用 r
参数,需要指定写入模式,因此需要增加 w
参数。