《笨方法学Python》加分题15
Posted 阿加西的python之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《笨方法学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,’\\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() 返回一个文件对象,其类型取决于模式,并通过它执行标准文件操作,如读和写。 当使用 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
以上是关于《笨方法学Python》加分题15的主要内容,如果未能解决你的问题,请参考以下文章