Exercise 15:读文件

来源:互联网 发布:sql select a,b,c 编辑:程序博客网 时间:2024/05/01 08:44

原文链接:http://learnpythonthehardway.org/book/ex15.html

       你已经学习了关于 raw_input 和 argv 的相关知识,那么现在你可以开始学习如何读文件了。你可能必须做完大部分练习才能理解发生了什么事情,所以你必须仔细的学习并且做好检查工作。如果你不够细心的话文件操作可能很容易就毁掉你整个功能。

       这次的练习中涉及到写两个文件。一个就是你经常运行的 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.
        我们想要做的就是在我们脚本中打开这个文件并且把其中的内容打印出来。然而,我们不想用“硬编码”的方式来那个将名为 ex15_sample.txt的文本内容加载到我们的脚本中。“硬编码”的意思是把本应该来自用户输入内容写作一个常量的字符串信息放到我们的脚本中。这是不好的做法,因为在后面我们还想加载其他文件内容。解决这个问题的办法就是使用 argv 和 raw_input 来要求用户输入想要读取的文件名来来代替“硬编码”方式设置的文件名。

from sys import argvscipt ,filename = argvtxt = open(filename)print "Here's your file %r:" % filenameprint txt.read()print "Type the filename again:"file_again = raw_input("> ")txt_again = open(file_again)print txt_again.read()
这个脚本文件中将会发生一些神奇的事情,让我们赶紧来分析一下这个些代码:

       1~3行是我吗所熟悉的使用 argv 来得到一个文件名。在下面的五行中有一个新的命令 open 。现在,运行 pydoc open相关命令阅读对这个命令的介绍。主要到这其实很像你
脚本中的 raw_input功能,都是得到一个相关参数后将其赋给你自己的一个变量。这里你只是用open做了一个打开文件的操作。

       在第7行我们打印了一小行文本,但是在第8行就有一个新奇的东西了。我们调用了txt上的一个函数。txt 就是打开 file 后返回的一个值,并且它可以接受你给它的指令。一个文件名可以通过 “."(点 或者 英式句号),指令名称和参数三个组成来调用一个相关指令。就行如 open 和 raw_input 函数一样。不同之处在于当你说 txt.read()你的意思就是:“嘿,txt !你读取了一个没有带参数的指令”。

       程序中剩下的几行原理都差不多,所以剩下的几个就留在研究训练中让你来分析。

输出结果如下:

我创建了一个名为 “ex15_sample.txt” 的文本然后运行我的脚本。
E:\>python ex15.py ex15_sample.txtHere's your file '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.Type the filename again:> ex15_sample.txtThis is stuff I typed into a file.It is really cool stuff.Lots and lots of fun to have in here.

研究训练:

这次练习有一个比较大的跳跃,在你继续往下学习之前尽可能的做好研究训练中的练习。
1、上面的每一行代码用英文写下他们都做了什么事情。
2、如果你不是很确定你可以问别人或者在线搜索。很多时候搜索“python THING"类似的关键字就可以找到关于THING在python中起了什么作用的回答。试着搜索下”python open“。
3、在这里我使用了”指令“这个词,但是它们通常也被称作”函数“或者”方法“。在网上搜索下看看别人是怎么定义的。不要担心他们迷惑你,一些知识渊博的程序员的回答让你感到迷惑时很正常的事情。
4、去掉使用了raw_input 的10~15行代码然后在运行该脚本。
5、运行只有raw_input 的10~15行代码的脚本。想想为什么这种方式获取文件名比上一种更好。
6、运行 pydoc file 命令然后往下滚动直到看见了read() 指令(函数或方法)。你应该能看见一些其它的指令了吧?跳过所有前面带有_ _(两个下划线)的内容,因为这些内容是没有实际用处的。然后尝试着使用一下其它指令吧。
7、再次运行 python 并且通过提示符的方式来使用open打开一个文件。注意你怎样才能正确的打开和读取一个文本呢?
8、在你的脚本中对 txt 和 txt_again 变量做 close()函数操作,当你读取完一个文本后关闭它是一个非常重要的操作。

学生遇见的常见问题:

txt = open(filename) 表达式是返回文件的文本内容吗?
答:不是的,它不会返回文本内容。它实际上是返回了一个被称作”文件句柄“的东西。你可以认为它像一个在一台二十世纪50年代大型计算机上的旧的磁带驱动器,或者像现在的DVD播放器一样。你可以把它们放在里面来回旋转,然后”读取“上面的东西,但是这里的文件是没有目录的。

我不能按照你”研究训练“中的第七个说的那样在终端或者命令行工具中输入相关代码。
答:首先,你应该在命令行中只输入 python 然后单击Enter。那么现在你就是在 python 中就像我们之前做过的几次操作那样。一旦你进入了 python 中你就可以直接在里面输入代码python将会一小块一小块的运行你的代码。就按我说的这样操作。你可以通过输入 quit() 单击 Enter来退出这种模式。

from sys import argv起了什么作用?
答:现在你只要理解 sys 是一个封装,这段代码的作用就是从这个封装中得到 argv 的功能。在后面可以学到更多相关这个的知识。

我像这样:script ,ex15_sample.txt = argv 来传递文件名但是无效。
答:肯定没用的,都不知道你怎么会这么写。把你的代码写的和我的一样,然后也像我一样输入命令来运行脚本。你这样做根本没有把文件名传入脚本中,而是还是让Python来传入文件名。

为什么我打开了两次文件却没有出现错误?
答:Python 不会限制你不止一次打开文本但有时限制也是有必要的。

0 0
原创粉丝点击