轉至: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()
二、替換