Python檔案的操作

風雪雲俠發表於2020-12-16

Python檔案的操作

1,開啟檔案(open)

函式說明
open(‘檔名’,‘r’)只讀方式開啟檔案
open(‘檔名’,‘r+’)以讀寫方式開啟,檔案不存在報錯
open(‘檔名’,‘w’)可寫方式開啟檔案
open(‘檔名’,‘w+’)以讀寫方式開啟,檔案不存在新建
open(‘檔名’,‘a’)以追加寫方式開啟,檔案不存在新建
open(‘檔名’,‘a+’)以追加讀寫方式開啟,檔案不存在新建
open(‘檔名’,‘rb’)以二進位制讀方式開啟,只能讀檔案 , 如果檔案不存在,會發生異常
open(‘檔名’,‘wb’)以二進位制寫方式開啟,只能寫檔案 , 如果檔案不存在則建立
fr = open('test.txt','r') # 只讀
fr_ = open('test.txt','r+') # 讀寫,不建立
fw = open('test.txt','w') # 只寫,建立
fw_ = open('test.txt','w+') # 讀寫,建立
fa = open('test.txt','a') # 追加寫,建立
fa_ = open('test.txt','a+') # 追加讀寫,建立
frb = open('test.txt','rb') # 二進位制讀,不建立
fwb = open('test.txt','wb') # 二進位制寫,建立

2,寫資料(write)

使用write()可以完成向檔案寫入資料,如果檔案不存在那麼建立,如果存在那麼就先清空,然後寫入資料

f = open('test.txt','w') # 開啟test.txt檔案,如果沒有就新建,w檔案可寫
f.write('hello world') #寫入hello world,覆蓋原先的全部資料
f.close() # 關閉檔案

3,讀資料(read)

使用read(num)可以從檔案中讀取資料,num表示要從檔案中讀取的資料的長度(單位是位元組),如果沒有傳入num,那麼就表示讀取檔案中所有的資料

f = open('test.txt','r') # 開啟test.txt檔案,如果沒有就新建,w檔案可寫
content = f.read(5)  # 最多讀取5個資料
print(content) # hello
print('*'*10)
content = f.read()  # 從上次讀取的位置繼續讀取剩下的所有的資料
print(content) #  world
f.close() # 關閉檔案

4,讀資料(readlines)

就像read沒有引數時一樣,readlines可以按照行的方式把整個檔案中的內容進行一次性讀取,並且返回的是一個列表,其中每一行的資料為一個元素

f = open('test.txt','w')
f.write('hello world\nhello world\nhello world\nhello world\nhello world') # 寫入5行hello world
 
f = open('test.txt', 'r')
content = f.readlines()
print(type(content))
print(content)
 
i=1
for con in content:
    print("%d:%s" % (i, con))
    i += 1
f.close()
'''
執行結果
<class 'list'>
['hello world\n', 'hello world\n', 'hello world\n', 'hello world\n', 'hello world']
1:hello world
 
2:hello world
 
3:hello world
 
4:hello world
 
5:hello world
'''

4,檔案重新命名

os模組中的rename()可以完成對檔案的重新命名操作

import os
os.rename("test.txt", "test2.txt")

5,刪除檔案

os模組中的remove()可以完成對檔案的刪除操作

import os
os.remove("test2.txt")

6,記得關閉檔案close

當我們操作完檔案之後,記得一定要close檔案,這是為什麼呢?

當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。

所以,為了避免忘記close而檔案內容又能完全寫入,我們可以用with … as …,如下:

with open('test.txt','w+') as f:
    f.write('hello')
    f.seek(0)
    con = f.read()
print(type(con)) # <class 'str'>
print(con) # con是的內容為hello

當我們完成了一系列的檔案操作之後,系統會自動完整的將檔案資料寫入磁碟並關閉檔案

7,檔案有內容,卻讀不出來

f = open('test.txt','w+')
f.write('hello')
con = f.read()
print(type(con)) # <class 'str'>
print(con) # con是一個空字串

按照邏輯,應該讀出內容是hello,那為什麼讀出來是一個空字串呢?
原因指標問題,檔案寫入後指標指向末尾[EOF],因此讀出空。

1,呼叫close後重新開啟,將指標位重置於開頭。(不能用含寫的方式開啟)

f = open('test.txt','w+')
f.write('hello')
f.close() # 關閉
f = open('test.txt','r')
con = f.read()
f.close()
print(type(con)) # <class 'str'>
print(con) # con是的內容為hello

2,呼叫seek指向開頭

f = open('test.txt','w+')
f.write('hello')
f.seek(0)
con = f.read()
f.close()
print(type(con)) # <class 'str'>
print(con) # con是的內容為hello

seek函式:seek(offset[, whence]) ,offset是相對於某個位置的偏移量。位置由whence決定,預設whence=0,從開頭起;whence=1,從當前位置算起;whence=2相對於檔案末尾移動,通常offset取負值。

8,檔案操作的綜合應用:複製檔案

要求,新建一個使用者輸入名字的檔案,在檔案裡面寫入內容,然後複製檔案

old_file_name = input('請輸入檔名:')
old_file = open(old_file_name,'w')
old_file.write('1,hello world\n2,hello world\n3,hello world')
old_file.close()
file_flag_num = old_file_name.rfind('.')
if file_flag_num > 0:
    file_name = old_file_name[:file_flag_num]
    file_flag = old_file_name[file_flag_num:]
    new_file_name = file_name + '附件' + file_flag
else:
    new_file_name = None
new_file = open(new_file_name,'w')
old_file = open(old_file_name,'r')  # 要重新開啟一次,不然是讀取的沒有內容的檔案
contents = old_file.readlines()
for con in contents:
    new_file.write(con)
# 關閉檔案
old_file.close()
new_file.close()

相關文章