一、文件操作
1.文件處理的流程
1)打開文件,得到文件句柄並賦值給一個變量
2)通過句柄對文件進行操作
3)關閉文件
例如:
f = open('chenli.txt') #打開文件
first_line = f.readline()
print('first line:',first_line) #讀一行
data = f.read()# 讀取剩下的所有內容,文件大時不要用
print(data) #打印讀取內容
f.close() #關閉文件
2.文件操作基本用法
1)基本用法:
file_object = open(file_name, access_mode = ‘r’, buffering = -1)
open函數有很多的參數,常用的是file_name,mode和encoding
file_name:打開的文件名,若非當前路徑,需指出具體路徑
access_mode文件打開模式
buffering的可取值有0,1,>1三個,0代表buffer關閉(只適用於二進制模式),1代表line buffer(只適用於文本模式),>1表示初始化的buffer大小;
encoding表示的是返回的數據采用何種編碼,一般采用utf8或者gbk;
2)文件打開模式
- r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
- w,只寫模式【不可讀;不存在則創建;存在則清空內容】
- x, 只寫模式【不可讀;不存在則創建,存在則報錯】
- a, 追加模式【可讀; 不存在則創建;存在則只追加內容】,文件指針自動移到文件尾。
"+" 表示可以同時讀寫某個文件
- r+, 讀寫【可讀,可寫】
- w+,寫讀【可讀,可寫】,消除文件內容,然后以讀寫方式打開文件。
- x+ ,寫讀【可讀,可寫】
- a+, 寫讀【可讀,可寫】,以讀寫方式打開文件,並把文件指針移到文件尾。
"b"表示以字節的方式操作,以二進制模式打開文件,而不是以文本模式。
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼
3)以讀r的方式打開文件
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f=open('1.txt',encoding='utf-8',mode='r')
print(f)
data1=f.read()
print(data1)
1.txt
55542342 123
輸出:
<_io.TextIOWrapper name='1.txt' mode='r' encoding='utf-8'> 55542342 123
補充:
1)python中有三個方法來處理文件內容的讀取: read() #一次讀取全部的文件內容。 readline() #每次讀取文件的一行。 readlines() #讀取文件的所有行,返回一個字符串列表。 2)print(f.readable()) #判斷文件是否是r模式打開的
3)print(f.closed) #判斷文件是否是關閉狀態
4)python中在文本文件內容移動的操作 file.seek(offset,whence=0) #從文件中給移動指針,從whence(0起始,1當前,2末尾)偏移offset個字節,正往結束方向移動,負往開始方向移動 file.tell() #返回當前文件中的位置。獲得文件指針位置
5) file.truncate(size=file.tell()) #截取文件到最大size個字節,默認為當前文件位置
4)以w方式寫入文件
f=open('a.txt','w',encoding='utf-8')
# f=open('b.txt','r',encoding='utf-8') #以讀的方式打開文件,文件不存在則報錯
f=open('b.txt','w',encoding='utf-8')
# print(f.writable())
f.write('111111\n22222222')
f.seek(0)
f.write('\n333333\n444444')
f.writelines(['\n55555\n','6666\n','77777\n'])
f.close()
a.txt 為空
b.txt
333333 444444 55555 6666 77777
補充:
file.write(str) #向文件中寫入字符串(文本或二進制) file.writelines(seq) #寫入多行,向文件中寫入一個字符串列表,注意,要自己加入每行的換行符 file.flush() #刷新文件內部緩沖,直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待輸出緩沖區寫入.
5)文件修改
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
read_f=open('b.txt','r')
write_f=open('.b.txt.swap','w')
for line in read_f.readlines():
if line.startswith('1111'):
line='2222222222\n'
write_f.write(line)
read_f.close()
write_f.close()
os.remove('b.txt')
os.rename('.b.txt.swap','b.txt')
3.上下文管理with語句
當你做文件處理,你需要獲取一個文件句柄,從文件中讀取數據,然后關閉文件句柄。
正常情況下,代碼如下:
file = open("/tmp/foo.txt")
data = file.read()
file.close()
這里有兩個問題。一是可能忘記關閉文件句柄;二是文件讀取數據發生異常,沒有進行任何處理。
然而with可以很好的處理上下文環境產生的異常。下面是with版本的代碼:
with open("/tmp /foo.txt") as file:
data = file.read()
with的基本思想是with所求值的對象必須有一個__enter__()方法,一個__exit__()方法。緊跟with后面的語句被求值后,返回對象的__enter__()方法被調用,這個方法的返回值將被賦值給as后面的變量。當with后面的代碼塊全部被執行完之后,將調用前面返回對象的__exit__()方法。
補充:
模擬 tail -f access.log
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# tail -f access.log
import time
with open('access.log','r',encoding='utf-8') as f:
f.seek(0,2)
while True:
line=f.readline().strip()
if line:
print('新增一行日志',line)
time.sleep(0.5)

