跟老齐学Python之不要红头文件(1)


Posted in Python onSeptember 28, 2014

这两天身体不给力,拖欠了每天发讲座的约定,看官见谅。

红头文件,是某国特别色的东西,在python里不需要,python里要处理的是计算机中的文件,包括文本的、图片的、音频的、视频的等等,还有不少没见过的扩展名的,在linux中,不是所有的东西都被保存到文件中吗?文件,在python中,是一种对象,就如同已经学习过的字符串、数字等一样。

先要在交互模式下查看一下文件都有哪些属性:

>>> dir(file)
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'mode', 'name', 'newlines', 'next', 'read', 'readinto', 'readline', 'readlines', 'seek', 'softspace', 'tell', 'truncate', 'write', 'writelines', 'xreadlines']

然后对部分属性进行详细说明,就是看官学习了。

打开文件

在某个文件夹下面建立了一个文件,名曰:130.txt,并且在里面输入了如下内容:

learn python
http://qiwsir.github.io
qiwsir@gmail.com

此文件以供三行。

下图显示了这个文件的存储位置:

跟老齐学Python之不要红头文件(1)

在上面截图中,我在当前位置输入了python(我已经设置了环境变量,如果你没有,需要写全启动python命令路径),进入到交互模式。在这个交互模式下,这样操作:

>>> f = open("130.txt")   #打开已经存在的文件
>>> for line in f:
...   print line
... 
learn python

http://qiwsir.github.io

qiwsir@gmail.com

将打开的文件,赋值个变量f,这样也就是变量f跟对象文件130.txt用线连起来了(对象引用)。

接下来,用for来读取文件中的内容,就如同读取一个前面已经学过的序列对象一样,如list、str、tuple,把读到的文件中的每行,赋值给变量line。也可以理解为,for循环是一行一行地读取文件内容。每次扫描一行,遇到行结束符号\n表示本行结束,然后是下一行。

从打印的结果看出,每一样跟前面看到的文件内容中的每一行是一样的。只是行与行之间多了一空行,前面显示文章内容的时候,没有这个空行。或许这无关紧要,但是,还要深究一下,才能豁然。

在原文中,每行结束有本行结束符号\n,表示换行。在for语句汇总,print line表示每次打印完line的对象之后,就换行,也就是打印完line的对象之后会增加一个\n。这样看来,在每行末尾就有两个\n,即:\n\n,于是在打印中就出现了一个空行。

>>> f = open('130.txt')
>>> for line in f:
...   print line,   #后面加一个逗号,就去掉了原来默认增加的\n了,看看,少了空行。
... 
learn python
http://qiwsir.github.io
qiwsir@gmail.com

在进行上述操作的时候,有没有遇到这样的情况呢?

>>> f = open('130.txt')
>>> for line in f:
...   print line,
... 
learn python
http://qiwsir.github.io
qiwsir@gmail.com

>>> for line2 in f:   #在前面通过for循环读取了文件内容之后,再次读取,
...   print line2   #然后打印,结果就什么也显示,这是什么问题?
... 
>>>

如果看官没有遇到上面问题,可以试试。遇到了,这就解惑。不是什么错误,是因为前一次已经读取了文件内容,并且到了文件的末尾了。再重复操作,就是从末尾开始继续读了。当然显示不了什么东西,但是python并不认为这是错误,因为后面就会讲到,或许在这次读取之前,已经又向文件中追加内容了。那么,如果要再次读取怎么办?就从新来一边好了。

特别提醒看官,因为当前的交互模式是在该文件所在目录启动的,所以,就相当于这个实验室和文件130.txt是同一个目录,这时候我们打开文件130.txt,就认为是在本目录中打开,如果文件不是在本目录中,需要写清楚路径。

比如:在上一级目录中(~/Documents/ITArticles/BasicPython),加入我进入到那个目录中,运行交互模式,然后试图打开130.txt文件。

跟老齐学Python之不要红头文件(1)

>>> f = open("130.txt")
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '130.txt'

>>> f = open("./codes/130.txt")   #必须得写上路径了(注意,windows的路径是\隔开,需要转义。对转义符,看官看以前讲座)
>>> for line in f:
...   print line
... 
learn python

http://qiwsir.github.io

qiwsir@gmail.com

>>>

创建文件

上面的实验中,打开的是一个已经存在的文件。如何创建文件呢?

>>> nf = open("131.txt","w")
>>> nf.write("This is a file")

就这样创建了一个文件?并写入了文件内容呢?看看再说:

跟老齐学Python之不要红头文件(1)

真的就这样创建了新文件,并且里面有那句话呢。

看官注意了没有,这次我们同样是用open()这个函数,但是多了个"w",这是在告诉python用什么样的模式打开文件。也就是说,用open()打开文件,可以有不同的模式打开。看下表:

模式 描述r 以读方式打开文件,可读取文件信息。w 以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容a 以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建r+ 以读写方式打开文件,可对文件进行读和写操作。w+ 消除文件内容,然后以读写方式打开文件。a+ 以读写方式打开文件,并把文件指针移到文件尾。b 以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。

从表中不难看出,不同模式下打开文件,可以进行相关的读写。那么,如果什么模式都不写,像前面那样呢?那样就是默认为r模式,只读的方式打开文件。

>>> f = open("130.txt")
>>> f
<open file '130.txt', mode 'r' at 0xb7530230>
>>> f = open("130.txt","r")
>>> f
<open file '130.txt', mode 'r' at 0xb750a700>

可以用这种方式查看当前打开的文件是采用什么模式的,上面显示,两种模式是一样的效果。下面逐个对各种模式进行解释

"w":以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容

131.txt这个文件是存在的,前面建立的,并且在里面写了一句话:This is a file

>>> fp = open("131.txt")
>>> for line in fp:     #原来这个文件里面的内容
...   print line
... 
This is a file
>>> fp = open("131.txt","w")  #这时候再看看这个文件,里面还有什么呢?是不是空了呢?
>>> fp.write("My name is qiwsir.\nMy website is qiwsir.github.io") #再查看内容
>>> fp.close()

查看文件内容:

$ cat 131.txt #cat是linux下显示文件内容的命令,这里就是要显示131.txt内容
My name is qiwsir.
My website is qiwsir.github.io

"a":以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建

>>> fp = open("131.txt","a")
>>> fp.write("\nAha,I like program\n")  #向文件中追加
>>> fp.close()              #这是关闭文件,一定要养成一个习惯,写完内容之后就关闭

查看文件内容:

$ cat 131.txt
My name is qiwsir.
My website is qiwsir.github.io
Aha,I like program

其它项目就不一一讲述了。看官可以自己实验。

本讲先到这里,明天继续文件。感冒药吃了,昏昏欲睡。

Python 相关文章推荐
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
pytorch中的自定义反向传播,求导实例
Jan 06 Python
python turtle工具绘制四叶草的实例分享
Feb 14 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
Jupyter notebook如何修改平台字体
May 13 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
python 实现图像快速替换某种颜色
Jun 04 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
python 实现批量图片识别并翻译
Nov 02 Python
python自动化测试之连接几组测试包实例
Sep 28 #Python
python自动化测试之从命令行运行测试用例with verbosity
Sep 28 #Python
跟老齐学Python之有容乃大的list(4)
Sep 28 #Python
跟老齐学Python之做一个小游戏
Sep 28 #Python
跟老齐学Python之坑爹的字符编码
Sep 28 #Python
python自动化测试之setUp与tearDown实例
Sep 28 #Python
python自动化测试实例解析
Sep 28 #Python
You might like
php获得文件扩展名三法
2006/11/25 PHP
PHP7.0版本备注
2015/07/23 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
Prototype Template对象 学习
2009/07/19 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
js加强的经典分页实例
2013/03/15 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python中比较两个列表的实例方法
2019/07/04 Python
wxPython色环电阻计算器
2019/11/18 Python
python numpy库np.percentile用法说明
2020/06/08 Python
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
C#笔试题集合
2013/06/21 面试题
什么是组件架构
2016/05/15 面试题
优秀的2014年两会精神解读
2014/03/17 职场文书
腾讯广告词
2014/03/19 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
Vue自定义铃声提示音组件的实现
2022/01/22 Vue.js
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL
Golang流模式之grpc的四种数据流
2022/04/13 Golang