转至:http://pmghong.blog.51cto.com/3221425/1349978
一、文件打开/读取/关闭
>>> f = open(r"E:\python\fileIO\test.txt")
>>> f
<_io.TextIOWrapper name='E:\\python\\fileIO\\test.txt' mode='r' encoding='cp936'>
>>> f.read()
'Hi everyone!\nWhat a good day it is!'
>>> f.close()
二、文件写入
步骤:以写入的形式打开--》写入--》(保存)关闭
不能直接写入数据,因为默认打开的文件时‘r’的只读形式
>>> f = open(r"E:\python\fileIO\test.txt")
>>> f.write('nice to meet you!')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: not writable
指定可写模式:
>>> f = open(r"E:\python\fileIO\test.txt","w")
>>> f.write('nice to meet you!')
此时数据只是写到缓存中,并未保存到文件,下面输入就可以看出了,原先的文件内容已经被清空了
$ cat E:/python/fileIO/test.txt
$
关闭这个文件即可将缓存中的数据写入到文件中
$ cat E:/python/fileIO/test.txt
nice to meet you!
注意:这一步需要相当慎重,因为如果编辑的文件存在的话,这一步操作会先清空这个文件再重新写入。那么如果不要清空文件再写入该如何做呢?
>>> f.close()
>>> f = open(r"E:\python\fileIO\test.txt","r+")
>>> f.write("being")
>>> f.close()
$ cat E:/python/fileIO/test.txt
beingto meet you!
可以看到,如果在写之前先读取一下文件,再进行写入,则写入的数据会添加到文件末尾而不会替换掉原先的文件。这是因为指针引起的,r+ 模式的指针默认是在文件的开头,如果直接写入,则会覆盖源文件,通过read() 读取文件后,指针会移到文件的末尾,再写入数据就不会有问题了。这里也可以使用a 模式
>>> f = open(r"E:\python\fileIO\test.txt","r+")
>>> f.read()
'\nbygto meet you!'
>>> f.write('nice to meet you!')
>>> f.close()
$ cat E:/python/fileIO/test.txt
bygto meet you!nice to meet you!
其他模式的介绍。见表
模式 |
描述 |
r |
以读方式打开文件,可读取文件信息。 |
w |
以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容 |
a |
以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建 |
r+ |
以读写方式打开文件,可对文件进行读和写操作。 |
w+ |
消除文件内容,然后以读写方式打开文件。 |
a+ |
以读写方式打开文件,并把文件指针移到文件尾。 |
b |
以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。 |
文件对象的方法:
1、f.readline()逐行读取数据
方法一
>>> f = open(r"E:\python\fileIO\test.txt")
>>> f.readline()
'nice to meet you!nice to meet you!\n'
>>> f.readline()
'nice to meet you!\n'
>>> f.readline()
'nice to meet you!\n'
>>> f.readline()
'nice to meet you!1\n'
>>> f.readline()
'nice to meet you!2'
>>> f.readline()
''
方法二
>>> for i in open(r'e:\python\fileIO\test.txt'):
... print(i)
...
nice to meet you!nice to meet you!
nice to meet you!
nice to meet you!
nice to meet you!1
nice to meet you!2
2、f.readlines() 将文件内容以列表的形式存放
>>> f = open("e:/python/fileIO/test.txt")
>>> f.readlines()
['nice to meet you!nice to meet you!\n', 'nice to meet you!\n', 'nice to meet yo
u!\n', 'nice to meet you!1\n', 'nice to meet you!2']
>>> f.close()
f.next() 逐行读取数据,和f.readline() 相似,唯一不同的是,f.readline() 读取到最后如果没有数据会返回空,而f.next() 没读取到数据则会报错(python 3.X中enerator【有yield关键字的函数则会被识别为generator函数【中的next变为__next__了)
>>> f = open('e:/python/fileIO/test.txt')
>>> f.next()
'nice to meet you!nice to meet you!\n'
>>> f.next()
'nice to meet you!\n'
>>> f.next()
'nice to meet you!\n'
>>> f.next()
'nice to meet you!1\n'
>>> f.next()
'nice to meet you!2'
>>> f.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
f.writelines() 多行写入
>>> l = ['\nhello one!','\nhello two','\nhello three']
>>> f = open("e:/python/fileIO/test.txt",'a')
>>> f.writelines(l)
>>> f.close()
$ cat E:/python/fileIO/test.txt
hello one!
hello two
hello three
f.seek(偏移量,选项)
选项=0,表示将文件指针指向从文件头部到“偏移量”字节处
选项=1,表示将文件指针指向从文件的当前位置,向后移动“偏移量”字节
选项=2,表示将文件指针指向从文件的尾部,向前移动“偏移量”字节
>>> f = open('e:/python/fileIO/test.txt','r+')
>>> f.seek(0,2)
36
>>> f.readline()
''
>>> f.seek(0,0)
0
>>> f.readline()
'\n'
>>> f.readline()
'hello one!\n'
>>> f.readline()
'hello two\n'
>>> f.readline()
'hello three'
>>> f.readline()
''
f.flush() 将修改写入到文件中(无需关闭文件)
>>> f.write('\nhello python!')
14
>>> f.flush()
f.tell() 获取指针位置
>>> f.seek(0,0)
0
>>> f.readline()
'\n'
>>> f.tell()
2
>>> f.readline()
'hello one!\n'
>>> f.tell()
14
内容查找和替换
一、内容查找
实例:统计文件中hello个数
思路:打开文件,遍历文件内容,通过正则表达式匹配关键字,统计匹配个数。
方法一
import re
f = open('e:/python/fileIO/test.txt')
source = f.read()
f.close()
r = r'hello'
s = len(re.findall(r,source))
for i in re.findall(r,source):
print (i)
print(s)
方法二、
fp = open('e:/python/fileIO/test.txt','r')
count = 0
for s in fp.readlines():
li = re.findall('hello',s)
if len(li)>0:
count = count +len(li)
print("search",count,"hello")
fp.close()
二、替换