《笨办法学 python3》系列练习计划——15.读取文件
2018-03-13 17:04
387 查看
题目
本题本题开始涉及文件的操作,文件操作是一件危险的事情,需要仔细细心否则可能导致重要的文件损坏。本题除了
ex15.py这个脚本以外,还需要一个用来读取的文件
ex15_sample.txt其内容如下:
This is stuff I typed into a file. It is really cool stuff. Lots and lots of fun to have in here.
我们需要用 python 脚本打开文件并打印出来,不过我们不能把
ex15_sample.txt写死在脚本中,而是要利用之前联系过的
argv和
input从用户那里得知要处理的文件名。
加分练习
本题的难度跨度略大,因此 Zed 建议我们尽力做好加分练习后再做后面的练习。在每行上面加注释说明用途。
如果不确定答案,就找人问问,或者利用搜索(比如 “python open”)
Zed 在本题中用了了”命令“这个词,其实它们是“函数”和“方法”,去试着了解它们。
删除 16-24 行(以我的答案)用到的
input部分,再次运行一遍脚本。
只用
input写这个脚本,思考那种得到文件名的方法更好?为什么?
运行
pydoc file找到
read()命令(函数/方法),会看到很多别的命令,找几条试试。不需要看
__(双下划线)的命令,这些只是垃圾而已(?)
再次运行 python 命令行,在命令行下使用
open打开文件,这种 open 和 read 的方法值得也学习一下。
让脚本针对
txt和
txt_again变量执行一下
close(),处理完成的文件需要关闭,这点很重要。
我的答案
15.0 基础练习 + 15.1 注释
# 载入 sys.argv 模块,以获取脚本运行参数。 from sys import argv # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 filename 。 script, filename = argv # 将名为 “filename” 的文件打开,并将打开的内容赋值给变量 txt txt = open(filename) # 打印文件名,并在读取文件内容后打印 print("Here's youer file %r:" % filename) print(txt.read()) # ------------上面是通过 argv 获取文件名-------- # 以 input 方式让用户在脚本运行后输入文件名 print("Type the filename again:") file_again = input("> ") # 打开用户输入的文件 txt_again = open(file_again) # 读取后打印用户输入文件的内容 print(txt_again.read())
1-6 行使用
argv我们相对都比较熟悉了。
open是一个新的东西,我们可以通过
pydoc open查看它的说明,恰巧发现有“友猿”整理了一部分 open 中文版文档 少做排版、补充如下:
open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
(在使用该函数的时候,除了file参数必填外,其他参数可以选用。在本代码中对其他参数使用了默认值。)
在使用 open() 的时候,如果文件不存在,那么将会返回 IOError。
参数说明:
file:文件名称;
mode:制定了文件打开的方式,函数提供了如下方式,其中,’rt’为默认方式。
mode参数 | 解释 | 中文 | 指针位置 |
---|---|---|---|
'r' | open for reading (default) | 只读,默认方式 | 开头 |
'w' | open for writing, truncating the file first | 写入,会覆盖源文件内容 | 开头 |
'x' | create a new file and open it for writing | 创建新文件,并写入内容,如果文件已存在,将会报错:FileExistsError | 开头 |
'a' | open for writing, appending to the end of the file if it exists | 写入,如果文件有内容,则在末尾追加写入 | 末尾 |
'b' | binary mode | 二进制模式 | |
't' | text mode (default) | 文本模式 | |
'+' | open a disk file for updating (reading and writing) | 更新磁盘文件,读写 | |
'U' | universal newline mode (deprecated) | 在paython3中已经弃用 |
buffering:用于设置缓存策略
在二进制模式下,使用0来切换缓冲;在文本模式下,通过1表示行缓冲(固定大小的缓冲区)。
在不给参数的时候,二进制文件的缓冲区大小由底层设备决定,可以通过io.DEFAULT_BUFFER_SIZE获取,通常为4096或8192字节
文本文件则采用行缓冲。
encoding:编码或者解码方式。默认编码方式依赖平台,如果需要特殊设置,可以参考codecs模块,获取编码列表。
errors:可选,并且不能用于二进制模式,指定了编码错误的处理方式,可以通过codecs.Codec获得编码错误字符串
newline:换行控制(仅适用于文本模式),参数有:None,’\n’,’\r’,’\r\n’。
输入时,如果参数为None,那么行结束的标志可以是:’\n’,’\r’,’\r\n’任意一个,并且三个控制符都首先会被转化为:’\n’,然后才会被调用;
如果参数为
'',所有的通用的换行结束标志都可以用,但是行结束标识符返回调用不会被编码。
输出时,如果参数为None,那么行结束的标志可以是:’\n’被转换为系统默认的分隔符;如果是”,’\n’则不会被编码。
如果
closefd = False,则在文件关闭时,底层文件描述符将保持打开状态。 这在给定文件名时不起作用,在这种情况下必须为True。
opener:可以通过调用
*opener*方式,使用自定义的开启器。底层文件描述符是通过调用
*opener*或者
*file*,
*flags*获得的。
*opener*必须返回一个打开的文件描述。将
os.open作为
*opener*的结果,在功能上,类似于通过None。
===以下来自谷歌机翻===
open()返回一
4000
个文件对象,其类型取决于模式,并通过它执行标准文件操作,如读和写。
当使用
open()以文本模式(’w’,’r’,’wt’,’rt’等)打开文件时,它将返回一个TextIOWrapper。 当用于以二进制模式打开文件时,返回的类会有所不同:在读取二进制模式下,它将返回一个BufferedReader; 在写入二进制文件和追加二进制模式时,它返回一个BufferedWriter,并且在读/写模式下,它返回一个BufferedRandom。
也可以使用字符串或字节阵列作为读取和写入的文件。 对于字符串StringIO可以像在文本模式下打开的文件一样使用,对于字节,可以使用BytesIO就像以二进制模式打开的文件一样。
我们把 open 打开的文件赋值给了变量
txt。
接着在打印了一句话后,在第 12 行我们在
txt这个被 open 打开的
file(“文件”类型)类型的变量上使用英文句号
.调用了一个命令
read,并且么有在括号中传递任何参数。
句点
A.B是 python 常用的调用函数或方法,其意义相当于调用 A 下拥有的 B 方法。所有在本题的意思大概就是说“嘿 txt!你有一个‘方法’是 read吧?执行它,不需要任何参数”。
15.3 函数和方法
函数和方法是很相似的东西,因为长的很像,所有有不少人觉得就是一个东西。先来说一下各种语言都有的函数,函数是一组可以重复执行实现一个或一些功能的代码。例如
print()实现了把参数内容打印出来的功能,而且反复执行功能维持不变。
方法则涉及类的概念,类中会有函数,实现类的一些功能,类的功能叫做类的方法。
15.4 删除 input
我尝试注释掉了下面两行都得到了 NameError的错误,我不知道 Zed 这题想干嘛。
file_again = input("> ") txt_again = open(file_again)
15.5 那种方法获得文件名更好?
首先要分情况,根据开发需要选择。单说本题,我认为使用
input兼容性更好打字更少,比如遇到有文件名有空格的时候。用参数需要为文件名添加引号,防止程序误认为是两个参数。
但是如果从程序执行速度来说
input需要人工两次录入(执行一次,文件名一次)会增加程序运行时间。
15.6 运行 pydoc file
python3 中使用 pydoc file 已经报错了,没有这个东西。原因大致是 Py2 的时候使用的是 C 语言的 I/O 。而 Py3 使用了新的的 I/O 虽然常用的方法没什么变化,使用起来也没什么问题,但是背后实现的方法已经发生了变化没有 file 这个类了。Zed 的本意可能是让我们学会看文档,以及预习之后会用到的知识。本题是文件读取,下一题则是文件读写,所有我们不妨先看看我们本题打开的这份文本文件的文档。
额外内容 —— 查看当前变量的文档
之前我有提到过一次,除了
pydoc以外,还可以在命令行中使用
help()这个方法来查看函数或方法的文档:
# 打开文件 'ex15_sample.txt' 并赋值个 file >>> file = open('ex15_sample.txt') # 使用 help 查看 file 的文档 >>> help(file)
使用
help后会看到大致如上的内容(部分截图),介绍当前查看元素的帮助文档,我们从第一行可以看到,在 Py3 环境下使用
open打开的这个东西的帮助文档,实际上是
TextIOWrapper对象的帮助文档。
而用同样的方法在 Py2 环境下打开一个 txt 文档看到的确实下面的。
找到了吗?它其实是一个
file的对象,这样难怪我们在 Py3 无法用 pydoc 查看
file的帮助文档了。
15.8 关闭文件
如果我们使用的是向文件写入东西,如果不关闭的话,是无法保存的。因此在完成文件操作之后切记关闭文件:# 关闭文件 txt.close() txt_again.close()
不过还有一种自动关闭文件的方法,我估计后面会有。着急的自行搜索
with open
返回目录
《笨办法学 python3》系列练习计划——目录相关文章推荐
- 《笨办法学 python3》系列练习计划——20.函数和文件
- 《笨办法学 python3》系列练习计划——17.更多文件操作
- 《笨办法学 python3》系列练习计划——19.函数和变量
- 《笨办法学 python3》系列练习计划——22.总集篇、回忆篇。
- 《笨办法学 python3》系列练习计划——34.访问列表的元素
- 《笨办法学 python3》系列练习计划——9. 打印,打印,打印
- 《笨办法学 python3》系列练习计划——16.读写文件
- 《笨办法学 python3》系列练习计划——33.while循环
- 《笨办法学 python3》系列练习计划——27.记住逻辑关系
- 《笨办法学 python3》系列练习计划——6. 字符串和文本
- 《笨办法学 python3》系列练习计划——1. 第一个程序 print() 练习
- 《笨办法学 python3》系列练习计划——11. 提问 input() 练习
- 《笨办法学 python3》系列练习计划——35.分支和函数
- 《笨办法学 python3》系列练习计划——4. 变量和命名
- 《笨办法学 python3》系列练习计划——26.期中考试
- 《笨办法学 python3》系列练习计划——0. 序言、目录
- 《笨办法学 python3》系列练习计划——30.else 和 if
- 《笨办法学 python3》系列练习计划——28.布尔表达式练习
- 练习15:读取文件
- 《笨办法学 python3》系列练习计划——7. 更多打印