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

本题除了 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())

open(file, mode=’r’, buffering=-, 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() 这个方法来查看函数或方法的文档:

 # 打开文件 '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

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

《笨方法学Python》加分题15的更多相关文章

  1. "笨方法学python"

    <笨方法学python>.感觉里面的方法还可以.新手可以看看... 本书可以:教会你编程新手三种最重要的技能:读和写.注重细节.发现不同.

  2. 笨方法学python 22,前期知识点总结

    对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...

  3. 笨办法学python 13题:pycharm 运行

    笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...

  4. 《笨方法学Python》加分题20

    加分练习通读脚本,在每一行之前加注解,以理解脚本里发生的事情.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line ...

  5. 《笨方法学Python》加分题29

    加分练习猜一猜 “if 语句” 是什么,他有什么作用.在做下一道题之前,试着用自己的话回答下面的问题: 你认为 if 对他下一行代码做了什么?为什么 if 语句的下一行需要 4 个空格缩进?如果不缩进 ...

  6. 《笨方法学Python》加分题17

    题目通过前学习的文件操作把一个文件中的内容拷贝到另一个文件中,并使用 os.path.exists 在拷贝前判断被拷贝的文件是否已经存在,之后由用户判断是否继续完成拷贝. 新知识os.path.exi ...

  7. 《笨方法学Python》加分题32

    注意一下 range 的用法.查一下 range 函数并理解它在第 22 行(我的答案),你可以直接将 elements 赋值为 range(0, 6) ,而无需使用 for 循环?在 python ...

  8. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  9. 《笨方法学Python》加分题28

    #!usr/bin/python # -*-coding:utf-8-*- True and True print ("True") False and True print (& ...

随机推荐

  1. Eclipse配置Python的IDE

    我第一个用来实际应用的编程语言是Java,于是对Eclipse情有独钟.但是自从上手了Notepad++后,使用Eclipse的机会越来越少. 最近开始学习Python,因为对Python不太熟悉,有 ...

  2. c 链表和动态内存分配

    兜兜转转又用到了c.c的一些基本却忘记的差不多了(笑哭)!! 动态内存分配 当malloc完将返回的指针类型强制转换成想要的类型后,指针中存有该指针的数据结构,而分配的内存恰好可用于该数据结构. 链表 ...

  3. 【python】 del 的用法

    转自 https://blog.csdn.net/love1code/article/details/47276683 python中的del用法比较特殊,新手学习往往产生误解,弄清del的用法,可以 ...

  4. MySQL 批量添加

    自己封装的一个批量添加. $data 是一个二维数组.key对应是数据表的字段名: /** * 批量创建 * @param array $data * @return int $res 影响行 * @ ...

  5. 前端-JavaScript1-4——JavaScript之变量

    变量(Variables),和高中代数学习的x.y.z很像,它们不是字母,而是蕴含值的符号. 它和直接量不同,直接量5,就是数字5:直接量”你好”就是字符串“你好”.现在这个变量不一样了,你看见一个a ...

  6. leetcode每日刷题计划-简单篇day3

    收到swe提前批面试hhh算是ep挂了的后续 努力刷题呀争取今年冲进去! Num 21 合并两个有序链表 Merge Two Sorted Lists 注意新开的链表用来输出结果的是ListNode ...

  7. 第二篇*2、Python字符串格式化

    1.字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 1)百分号方式 %[(name)][flags][width].[precision]typecode (nam ...

  8. source tree使用经验

    FeatureXXX具体功能开发分支,从develop分支拉,功能开发自测完后合并到develop分支.来不及上线的feature分支不要合并到develop. develop开发分支,上面代码都是已 ...

  9. git从远程分支clone项目到本地,切换分支命令,其他常用命令

    1.在git命令窗口输入git clone git@139.129.217.217:sg/sgsq_cms.git 回车,即可克隆远程项目到本地.红色字体为远程分支的SSHkey,可以登录到gitli ...

  10. c++之__attribute__((unused))

    转自https://blog.csdn.net/u013083059/article/details/19342935 内核时注意到有些函数会有添加__attribute__((unused)), 在 ...