您的位置:首页 > 编程语言 > Python开发

《笨办法学 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》系列练习计划——目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息