讀寫模式 | 是否可讀 | 是否可寫 | 文件不存在時 |
r | 是 | 否 | 報錯 |
r+ | 是 | 是,覆蓋寫入 | 報錯 |
w | 否 | 是,清空原內容 | 創建新文件 |
w+ | 是 | 是,清空原內容 | 創建新文件 |
a | 否 | 是,末尾追加寫入 | 創建新文件 |
a+ | 是 | 是,末尾追加寫入 | 創建新文件 |
上面是python3讀寫文件的幾種模式:
前提:
1 from sys import argv 2 file_name = argv[1] 3 4 #在cmd中執行代碼,需要輸入: 5 >>> python py_open_file.py open_file.txt 6 7 則 argv接收到python后面的兩個參數,argv[0] 是python后的第一個參數:py_open_file.py ; argv[1]接收的值是:open_file.txt
讀:
1 #r只讀模式 2 with open(file_name,'r') as f: 3 print(f.read()) 4 5 #r+可讀可寫 6 with open(file_name,'r+') as f: 7 f.write('r+寫入') 8 f.seek(0) #將光標移動到文件首部 9 print(f.read())
寫:
1 #w純寫入,清空原內容 2 with open(file_name,'w') as f: 3 f.write("這是w寫入的內容") 4 #w+可讀可寫 5 with open(file_name,'w+') as f: 6 f.write("這是w+") 7 f.flush() #刷新內容,將寫入的內容由內存刷新到磁盤中; 8 f.seek(0) #將光標移動到文件首部 9 print(f.read()) #讀取文件全部內容
追加寫:
1 #a追加模式,在文件末尾追加內容,如果文件不存在,則創建 2 with open(file_name,'a') as f: 3 f.write("\n這是a追加寫入的內容;") 4 5 #a+可追加寫可讀模式 6 with open(file_name,'a+') as f: 7 f.write("\n這是a+的內容") 8 #f.flush() 9 f.seek(0) 10 print(f.read())
隨機寫入文件內容示例:
1 import random 2 3 with open(file_name,'w') as f: 4 f.truncate() #清空文件內容 5 for i in range(1,10): # range生成1到9的序列 6 s_name = 'num_' + str(i) 7 s_age = random.randint(14,19) #隨機生成范圍(14--19)的整數 8 ss = s_name + ',' + str(s_age) + '\n' 9 f.write(ss) #循環寫入,模式可以是a,也可以是w
優化后的例子:
1 import random 2 3 with open(file_name,'w+') as f: 4 f.truncate() 5 for i in range(1,10): 6 s_name = 'num_' + str(i) 7 s_age = random.randint(14,19) 8 ss = s_name + ',' + str(s_age) + '\n' 9 f.write(ss) 10 f.flush() 11 f.seek(0) 12 print(f.read())
文件光標:
1 with open(file_name,'r') as f: 2 f.read() 3 print(f.tell()) #f.tell() 顯示當前光標位置 4 f.seek(0) #移動光標到0的位置 5 f.seek(10) #移動光標到10的位置
在練習的過程中,會出現編碼報錯問題,各種嘗試,如果報錯,就嘗試修改為如下:
1 with open(file_name,'r',encoding='utf-8') as f:
有時候添加了encoding='utf-8',讀取或者寫入的時候會中文亂碼,則去掉試試。
注:
以前打開文件習慣性:
1 f = open(file_name,'w') 2 f.write("這是寫入的內容。") 3 #這種寫法需要手動關閉文件后再查看文件,才能看到內容 4 f.close() 5 6 #而with可以自動關閉文件 7 with open(file_name,'w') as f: 8 f.write("這是寫入的內容。")