跟老齐学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实现多线程暴力破解登陆路由器功能代码分享
Jan 04 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
python实现flappy bird小游戏
Dec 24 Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 Python
python join方法使用详解
Jul 30 Python
django 自定义filter 判断if var in list的例子
Aug 20 Python
Python jieba库用法及实例解析
Nov 04 Python
Python动态导入模块和反射机制详解
Feb 18 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
Python发送邮件实现基础解析
Aug 14 Python
python的数学算法函数及公式用法
Nov 18 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相当简单的分页类
2008/10/02 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
JS面向对象编程 for Cookie
2010/09/19 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
python sort、sorted高级排序技巧
2014/11/21 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Python实现读取json文件到excel表
2017/11/18 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
使用HTML5原生对话框元素并轻松创建模态框组件
2019/03/06 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
ORACLE十问
2015/04/20 面试题
光棍节联谊晚会活动策划书
2014/10/10 职场文书
学校师德师风整改方案
2014/10/28 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
检讨书怎么写?
2019/06/21 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers