基本操作
f = open("file1", "r") # 打開文件
first_line = f.readline() # 讀一行
data = f.read() # 讀取剩下所有內容,文件大時候不要用
f.close() #關閉文件
如果我們想循環文件,並且在第九行輸出分割的話:
for index, line in enumerate(file.readlines()):
if(index == 5):
print("-------我是分割線-------")
continue
print(line.strip())
注意: strip()方法是用來去除字符串首尾空格的
但是當我們打開一個大文件的時候我們就會發現一個問題,file.readlines()是提前將所有行數都先讀取出來,再進行操作,那么當我們打開一個幾十個G的文件的時候效果可想而知,因此上述方法基本不使用,應該使用以下方法:
count = 0
for line in file:
if count == 9:
print("-------我是分割線-------")
count += 1
continue
print(line)
count += 1
打開文件的模式有:
- r, 只讀模式(默認)
- w,只寫模式【不可讀;不存在則創建;存在則刪除內容】
- a,追加模式【可讀;不存在則創建;存在則只追加內容】
“+”表示可以同時讀寫某個文件
- r+,可讀寫文件【可讀;可寫;可追加】-----一般使用這個模式
- w+,可寫讀文件【可寫;可讀;可追加】-----基本用不到
- a+,追加讀寫文件
“b”表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,Linux可忽略,windows處理二進制文件時需要標注)
- rb,以二進制的模式讀取文件,不可以傳encoding參數
- wb,以二進制編碼的模式寫文件
f.write("string字符串".encode())
“U”表示在讀取時,可以將\r\n \r \n自動轉換成\n(與r或r+模式同時使用)
- rU
- r+U
文件的方法
- tell() 當前文件指向的指針,計數方式是按照字符個數
- seek(字符位置) 查找文件相應字符位置
seek(0)就是返回到文件開始位置,一般和tell()方法一起使用- encoding() 返回當前文件編碼格式
- flush() 刷新當前緩沖區,建議在關閉文件前先flush當前緩沖區。
模仿進度條: import sys, time for i in range(20): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)
在前面,我們已經注意到python寫文件的時候,會將之前的內容刪除掉,重寫覆蓋,那么我們如何來修改文件呢?
文件修改的方式
- 將文件加載到內存中像VIM那樣,再進行修改
- 打開一個文件,修改完成之后寫到新文件里
修改文件的思路
- 打開兩個文件
- 從源文件逐行讀取,邊讀邊寫進新文件中
- 通過語句進行判斷,找到需要需改的地方,修改文件,再將修改過后的內容寫到新文件中。
f = open("yesterday", 'r', encoding="utf-8")
fnew = open("yesterday.bak", "w", encoding="utf-8")
for line in f:
if "修改前的語句" == line:
line = line.replace("修改前的語句", "修改后的語句")
fnew.write(line)
f.close()
fnew.close()
line = line.replace("修改前的語句", "修改后的語句")
注意是line
而不是f
with語句
為了避免打開文件后忘記關閉,可以通過管理上下文,即:
with open("需要打開的文件", 'r', encoding="utf-8") as f:
# 執行語句...
# 當跳出with程序塊時,自動關閉文件
如此方式,當with代碼塊執行完畢后,內部會自動關閉並釋放文件資源。
在python2.7后,with又支持同時對多個文件的上下文進行管理,即:
with open("需要打開的文件1") as f, open("需要打開的文件2") as f2:
# 執行語句...
# 當跳出with程序塊時,自動關閉文件