python-文件讀寫

python對文件的操做
對文件操做的步驟:
一、打開文件
二、讀寫文件
三、關閉文件

1、讀取文件的方法有三種:read(),readline(),readlines()
f.readline() #每次讀出一行數據,返回的是一個list,讀完指針下移,適合大文件
f.readlines() #讀取文件裏全部數據,保存在一個list變量中,每行做爲一個元素,換行會讀到\n,讀取大文件比較佔內存
f.read(size) #從當前位置起讀取size字節文件,若無參數size,則讀取至文件結束爲止,文件不存在的時候會報錯
#輸出爲字符串對象,須要對字符串進行分割後才能使用(f.read().splitlines())
A、read()方法:
f = open('file.txt','r') #以只讀的方式打開一個文件,獲取文件句柄,若是隻讀的話,r能夠不寫,默認只讀
f.read()
print(f)
date = f.read().splitlines()
print(date)
f.close() #關閉文件

B、readline()方法:
f = open('file.txt')
line = f.readline()
while line:
print(line)
line = f.readline()
f.close()

C、readlines()方法:
f = open('file.txt')
lines = f.readlines()
for line in lines:
print(line)
f.close()

2、打開文件的模式
r,只讀模式(默認)。
w,只寫模式。【不可讀;不存在則建立;存在則刪除內容;】
a,追加模式。【不可讀; 不存在則建立;存在則只追加內容;】
"+"表示能夠同時讀寫文件
r+,【可讀、可寫;可追加,若是打開的文件不存在的話,會報錯】
w+,【寫讀模式,使用w+的話,已經存在的文件內容會被清空,能夠讀到已經寫的文件內容】
a+,【追加讀寫模式,不存在則建立;存在則只追加內容,讀不到東西;】
"U"表示在讀取時,能夠將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
rU、r+U
"b"表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註)
rb、wb、ab(斷點續傳)
r+b、w+b、a+b
3、文件操做
f = open('file.txt','r+',encoding='utf-8') #打開文件,並賦值給f,encoding='utf-8'讓中文能夠正常顯示不會報錯
f.readline() #讀一行
f.readable() #判斷文件是否可讀
fr.writable() #判斷文件是否可寫
fr.encoding #打印文件的編碼
f.read() #讀取全部內容,大文件不要用
f.readlines() #讀取全部文件內容,大文件不要用
f.tell() #返回光標所在位置
f.seek(0) #移動指針到文件的哪一個位置,0表示最前面
f.seek(0,2) #移動指針到文件的末尾;兩個參數,表示偏移量,從XX開始偏移,默認0:開頭,1:當前位置,2:末尾
f.write('XXX') #寫入內容
f.fulsh() #寫入文件後,當即從內容把數據寫到磁盤中
f.truncate() #從文件指針的位置清空文件內容
f.writelines(['XX','XX']) #將一個列表寫入文件中
f.close() #關閉文件

#f.write()和f.writelines區別
一、write()須要傳入一個字符串作爲參數,不然會報錯
二、writelines()既能夠傳入字符串又能夠傳入一個字符序列,並將該字符序列寫入文件
三、若是使用list寫入txt文件,能夠寫入多行;若是使用str寫入txt文件,則只能寫入一行。
四、在list中的每一個元素末尾必須加上’\n’的換行符,不然list中的各元素將寫入一行之中
#例如:
l = ['123\n','456\n','789\n']
f.writeline(l) #傳一個list,把list裏面的每個元素,寫到文件裏
f = open('a.txt')
f.close()


##循環文件對象,每次取一行,讀完一行的話,就會釋放一行的內容
f = open('file.txt')
for line in f:
print(line)

#with自動關閉文件
在操做文件的時候,常常忘了關閉文件,這樣的就可使用with,它會在使用完這個文件句柄以後,自動關閉該文件,使用方式以下:
with open('file.txt','r') as f: #打開一個文件,把這個文件的句柄賦給f,代碼本身判斷文件調用完,自動關閉
for line in f:
print(line)
with open('file.txt') as fr,with open('file_bak','w') as fw: #這個是多文件的操做,打開兩個文件,fr是讀file.txt,fw是新建一個file_bak文件
for line in fr #循環file.txt中每一行
fw.write(line) #寫到file_bak文件中

4、修改文件
方法一:(簡單粗暴的)文件內容所有讀取到內容,原有文件內容清空,重寫新內容
with open('account.txt','r+') as fr:
l = []
for line in f:
line = line.strip().split(',')
sum = int(line_list[0] + line_list[1] + line_list[2]
avg = sum //3
new_line = '%s,%s\n'%(line,avg)
l.append(new_res)
fr.seek(0)
fr.truncate()
fr.write(l)
fr.close()
方法二:(高效的方式重點)先打開原來文件,再打開一個空文件,循環處理原來文件每一行,處理後寫入新文件,把原來文件刪掉,把新文件改成原來名字
with open('account.txt') as fr,with open('account_new','w') as fw: #這個是多文件的操做,打開兩個文件,fr是讀file.txt,fw是新建一個file_bak文件
for line in fr:#循環file.txt中的每一行
line = line.strip()
line_list = line.split(',')
sum = int(line_list[0] + line_list[1] + line_list[2]
avg = sum //3
new_line = '%s,%s\n'%(line,avg)
fw.write(new_line)#寫到文件中
fw.flush() #當即寫入文件
import os #文件操做
os.remove('account.txt') #刪除源文件
os.rename('account_new','account') #修改文件名
5、練習
# 找到超過20次的ip地址
#一、打開文件
#二、依次讀取文件裏面的每行
#三、取到每行裏面的ip地址 split
#四、存到字典裏面,ip作key,次數作value
#五、循環字典,若是value大於20,那麼就輸出出來
#六、每隔1分鐘監控一次
import timepoint = 0while  True:    with open('access.log',encoding='utf-8') as f:        f.seek(point)        ips = {}        for line in f:            ip = line.split()[0]            if ip not in ips:                ips[ip] = 1            else:                ips[ip] += 1        point = f.tell()        for k,v in ips.items():            if v >=20:                print('有問題的ip地址是%s'%k)    time.sleep(60)
相關文章
相關標籤/搜索