《笨方法学Python》加分题15

本题本题开始涉及文件的操作,文件操作是一件危险的事情,需要仔细细心否则可能导致重要的文件损坏。

本题除了 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 注释

 1 # 载入 sys.argv 模块,以获取脚本运行参数。
 2 from sys import argv
 3 
 4 # 将 argv 解包,并将脚本名赋值给变量 script ;将参数赋值给变量 filename 。
 5 script, filename = argv
 6 
 7 # 将名为 “filename” 的文件打开,并将打开的内容赋值给变量 txt
 8 txt = open(filename)
 9 
10 # 打印文件名,并在读取文件内容后打印
11 print("Here's youer file %r:" % filename)
12 print(txt.read())
13 
14 # ------------上面是通过 argv 获取文件名--------
15 
16 # 以 input 方式让用户在脚本运行后输入文件名 
17 print("Type the filename again:")
18 file_again = input("> ")
19 
20 # 打开用户输入的文件
21 txt_again = open(file_again)
22 
23 # 读取后打印用户输入文件的内容
24 print(txt_again.read())

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,’
’,’
’,’
’。 
输入时,如果参数为None,那么行结束的标志可以是:’
’,’
’,’
’任意一个,并且三个控制符都首先会被转化为:’
’,然后才会被调用; 
如果参数为'',所有的通用的换行结束标志都可以用,但是行结束标识符返回调用不会被编码。 
输出时,如果参数为None,那么行结束的标志可以是:’
’被转换为系统默认的分隔符;如果是”,’
’则不会被编码。 

如果closefd = False,则在文件关闭时,底层文件描述符将保持打开状态。 这在给定文件名时不起作用,在这种情况下必须为True。 
opener:可以通过调用*opener*方式,使用自定义的开启器。底层文件描述符是通过调用*opener*或者*file*, *flags*获得的。 
*opener*必须返回一个打开的文件描述。将os.open作为*opener*的结果,在功能上,类似于通过None。

===以下来自谷歌机翻=== 
open() 返回一个文件对象,其类型取决于模式,并通过它执行标准文件操作,如读和写。 
当使用 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.5 那种方法获得文件名更好?
首先要分情况,根据开发需要选择。
单说本题,我认为使用 input 兼容性更好打字更少,比如遇到有文件名有空格的时候。用参数需要为文件名添加引号,防止程序误认为是两个参数。

但是如果从程序执行速度来说 input 需要人工两次录入(执行一次,文件名一次)会增加程序运行时间。

15.6 运行 pydoc file
python3 中使用 pydoc file 已经报错了,没有这个东西。原因大致是 Py2 的时候使用的是 C 语言的 I/O 。而 Py3 使用了新的的 I/O 虽然常用的方法没什么变化,使用起来也没什么问题,但是背后实现的方法已经发生了变化没有 file 这个类了。
Zed 的本意可能是让我们学会看文档,以及预习之后会用到的知识。本题是文件读取,下一题则是文件读写,所有我们不妨先看看我们本题打开的这份文本文件的文档。

额外内容 —— 查看当前变量的文档
之前我有提到过一次,除了 pydoc 以外,还可以在命令行中使用 help() 这个方法来查看函数或方法的文档:

1 # 打开文件 'ex15_sample.txt' 并赋值个 file
2 >>> file = open('ex15_sample.txt')
3 # 使用 help 查看 file 的文档
4 >>> help(file)

使用 help 后会看到大致如上的内容(部分截图),介绍当前查看元素的帮助文档,我们从第一行可以看到,在 Py3 环境下使用 open 打开的这个东西的帮助文档,实际上是 TextIOWrapper 对象的帮助文档。

而用同样的方法在 Py2 环境下打开一个 txt 文档看到的确实下面的。

找到了吗?它其实是一个 file 的对象,这样难怪我们在 Py3 无法用 pydoc 查看 file 的帮助文档了。

15.8 关闭文件

如果我们使用的是向文件写入东西,如果不关闭的话,是无法保存的。因此在完成文件操作之后切记关闭文件:

1 # 关闭文件
2 txt.close()
3 txt_again.close()

不过还有一种自动关闭文件的方法,我估计后面会有。着急的自行搜索 with open

https://blog.csdn.net/aaazz47/article/details/79543002



原文地址:https://www.cnblogs.com/python2webdata/p/10043809.html