遍历循环文件的模式如下几种:
r:以读方式打开
w :以写方式打开
a :以追加模式
---------------------------
r+ :以读写模式打开
w+:以读写模式打开 (参见 w )
a+:以读写模式打开 (参见 a )
----------------------------
rb:以二进制读模式打开
wb:以二进制写模式打开 (参见 w )
ab:以二进制追加模式打开 (参见 a )
-------------------------------------
rb+:以二进制读写模式打开 (参见 r+ )
wb+:以二进制读写模式打开 (参见 w+ )
ab+: 以二进制读写模式打开 (参见 a+)
------------------------------------
with open
在tmp目录下有个文件:
[[email protected] ~]# cat /tmp/asd.txt
this
is
a
test
In [1]: open('/tmp/asd.txt') //返回文件的一个对象
Out[1]: <open file '/tmp/asd.txt', mode 'r' at 0x34c78a0>
In [2]: aa = open('/tmp/asd.txt') //默认模式为 r
In [3]: type(aa)
Out[3]: file
In [4]: aa. //很多文件的方法:
aa.close aa.errors aa.isatty aa.newlines aa.readinto aa.seek aa.truncate aa.xreadlines
aa.closed aa.fileno aa.mode aa.next aa.readline aa.softspace aa.write
aa.encoding aa.flush aa.name aa.read aa.readlines aa.tell aa.writelines
In [4]: aa.close() //关闭打开的文件
In [6]: aa = open('/tmp/asd.txt', 'w') //指定特定的格式打开文件
In [7]: aa.write("aaa") //只支持 字符串 写入
In [8]: aa.close() //只有这边关闭后,客户端才可以看到写的内容
[[email protected] ~]# cat /tmp/asd.txt //只有一个aaa,也就是说,w 模式会覆盖原有的内容
aaa
In [11]: aa.read() //从头读到尾
Out[11]: 'aaa'
In [12]: aa.read() //上一步已经读取完毕
Out[12]: ''
In [13]: type(aa.read()) //类型为字符串
Out[13]: str
In [18]: aa.read(2) //指定读取的指针位数
Out[18]: 'aa'
In [19]: aa.read()
Out[19]: 'a'
In [20]: aa.read() //一直到读取完毕
Out[20]: ''
In [28]: aa.readline() // readline 代表着 一行一行的 读取内容
Out[28]: '123\n'
In [29]: aa.readline()
Out[29]: 'asd\n'
In [30]: aa.readline()
Out[30]: 'zxd\n'
In [31]: aa.readline() //直到读取完毕
Out[31]: ''
In [33]: aa.readlines() //readlines 代表 有多少行 读读多少行 并以 list的模式展示
Out[33]: ['123\n', 'asd\n', 'zxd\n']
//read 和 readline 返回的都是字符串 格式, 唯有 readlines 返回的是 list 格式。
#! /usr/bin/python
aa = open('/tmp/asd.txt')
for line in aa.readlines():
print line
执行结果如下:
[[email protected] python]# python 2.py
123
asd
zxd
//如上我们看得出来,每行输出默认都会有个换行符,使用
print line,
就会让其没有换行符输出
[[email protected] python]# python 2.py
123
asd
zxd
分析:
#! /usr/bin/python
aa = open('/tmp/asd.txt')
for line in aa.readlines(): //会产生1G的列表
print line,
//如上程序,如果执行的文件超过1G, 如果使用如上的方式,就会在内存中生成一个aa对象,且会占用内存1G的资源,如果硬件资源不是很充足的情况,这种方式是不可行的。
//如下模式,只需要遍历 aa 对象即可,并不会在内存中产生列表(执行结果是一样的):
[[email protected] python]# cat 2.py
#! /usr/bin/python
aa = open('/tmp/asd.txt')
for line in aa:
print line,
[[email protected] python]# python 2.py
123
asd
zxd
其实 文件的方法中还有一个方法叫做 .next 此方法和 for循环是一样的 也是一行一行的做遍历
In [34]: aa = open('/tmp/asd.txt')
In [35]: aa.next()
Out[35]: '123\n'
In [36]: aa.next()
Out[36]: 'asd\n'
In [37]: aa.next()
Out[37]: 'zxd\n'
刚刚使用的 readline 其实就是一行一行的读取内容,当结束后 返回一个空的字符串,空的字符串 即为 False
In [39]: aa = open('/tmp/asd.txt')
In [40]: aa.readline()
Out[40]: '123\n'
In [41]: aa.readline()
Out[41]: 'asd\n'
In [42]: aa.readline()
Out[42]: 'zxd\n'
In [43]: aa.readline()
Out[43]: ''
In [44]: not aa.readline()
Out[44]: True
for 循环是 有一定的次数,循环结束后就会结束,那么 while是 给定一个条件,满足后就会退出,也就是我们刚刚看到的 读到最后,字符串返回一个 False 就结束。
[[email protected] python]# cat 2.py
#! /usr/bin/python
aa = open('/tmp/asd.txt')
while True: ## True 就执行语句
line = aa.readline() ## 读取每行的内容
if not line: ## 读到最后为空字符串,not 后即为 True, 就会执行 如下的 break 跳出循环
break
print line,
[[email protected] python]# python 2.py
123
asd
zxd
注意点:
如上我写的每个程序,只是打开文件,没有执行标准的 .close
#! /usr/bin/python
aa = open('/tmp/asd.txt')
while True:
line = aa.readline()
if not line:
break
print line,
aa.close()
用python的时候,会经常遇到文件数据库的open,但总会不小心忘了close 用with open 语句就能很好的解决这个问题,它会在语句执行完后,自动执行close()
#! /usr/bin/python
with open('/tmp/asd.txt') as aa:
while True:
line = aa.readline()
if not line:
break
print line,
执行结果:
[[email protected] python]# python 2.py
123
asd
zxd
其实日常的文件遍历,如果内容比较小,我们完全可以使用 .read 这个方法来搞定,但是如果文件内容多,且很复杂,这就需要我们使用for 或者while 循环来搞定!