Python —— 檔案處理
1. 開啟檔案
open(filename, mode, buffering)
mode=‘r’:以只讀模式開啟檔案。若此檔案不存在,報錯
mode=‘w’:以寫模式開啟。若此檔案不存在,則建立一個;若此檔案已存在,則先清空
mode=‘a’:以追加模式開啟。若此檔案存在,則在檔案尾部追加內容
mode=‘r+’或者‘w+’或者a+:以讀寫模式開啟
mode=b:以二進位制只讀模式開啟
buffering:設定快取區,可以預設,一般用-1表示系統預設緩衝區域。
2. 讀檔案
(1)file.read( n ):表示讀檔案的前n個字元
(2)file.readline( n ):表示讀
(3)file.readlines( ):表示把檔案從頭到尾讀出來,並儲存為一個列表
3. 寫檔案
(1)file.write( ):表示把字串寫入
(2)file.writelines( ):表示把一個列表寫入
4. 關閉檔案
(1)普通方法:
file.open(r'abc.txt')
file.readline
file.close() # 只要檔案被open過,就必須close
(2)with方法——自動關閉,懶人專用
with open(r'abc.txt') as f:
f.readline() # 此方法會自動關閉被開啟的文件
5. 檔案指標
檔案指標是指檔案在讀寫過程中的位置問題。如:從某檔案的第n個字元開始插入一段話
如下圖:
檔案開啟後,讀取時指標先指向頭部,從第一個位元組再向後讀取了3個位元組後(第四個位元組),再寫入內容時指標預設指向第四個位元組
(1)file.seek( ): 定位到檔案某個位置
file.seek(offset, whence) #將檔案指標從某指定的位置向左/向右移動多少位位元組
offset:指標偏移量
whence:指定指標位置,0表示檔案頭,1表示當前位置,2表示檔案尾
# 'abc.txt'檔案內容如下:123456789
# 從頭讀3個字元
f = open(r'abc.txt')
f.seek(2,0) # 從檔案頭後移2個字元
f.read(3)
>>>345
# 從檔案尾讀取3個字元
f = open(r'abc.txt')
f.seek(-3,2) # 從檔案尾部前移3個字元
f.read(3)
>>>789
(2)file.tell( ):指標當前位置
file.tell( ) #表示當前指標位置
舉個栗子:加入現有檔案abc.txt,檔案內容是”0123456789”
f = open(abc.txt, 'r+') #以讀寫方式開啟abc.txt
import os # 記得在用檔案指標方法時必須匯入OS模組
f.tell()
>>>0 # 指標位置在檔案頭部
f.read(3) # 讀取檔案abc.txt的前三個位元組
>>>012
f.tell()
>>>3 # 此時指標在檔案的第3個位元組處
f.seek(0, os.SEEK_SET) # 使指標回到文章起始位置
f.tell()
>>>0 # 指標又回到起始位置
f.seek(-2, os.SEEK_END) # 使指標指向檔案結束位置然後向前移動2個位元組
f.tell()
>>>7 # 文章結束位置時9,-2表示指標前移2個位元組,即指向7
6. 檔案的處理 —— os模組
(1)重新命名檔案rename
os.rename(原檔名,目標檔名)
(2)刪除檔案remove
os.remove('abc.txt')
(3)提取檔案路徑dirname
p = 'C:/study/abc.txt'
os.path.dirname(p)
>>>'C:/study'
(4)提取檔名basename
p = 'C:/study/abc.txt'
os.path.basename(p)
>>>abc.txt
(5)分割檔案字尾split
p = 'C:/study/abc.txt'
os.path.split(p)
>>>('C:/study','abc.txt')
(6)建立目錄mkdir
if not os.path.exists('abc.txt'): # 先判斷此目錄是否存在
os.mkdir('abc.txt') # 若不存在,則建立
(7)列出當前目錄下所有檔案listdir&walk
假設當前目錄下有abc.txt、demo.py、test01、234.txt。
其中:test01是資料夾,其餘是檔案
# 列出當前目錄所有內容
print os.path.listdir('.')
>>>['abc.txt','demo.py','test01','234.txt']
# 列出當前目錄所有內容,且分別顯示檔案和資料夾
print list(os.walk('.')) # walk()會生成當前目錄下所有檔案+資料夾
[('.', [abc.txt,demo.py,234.txt],[test01]), ('.\\test01',[],[])]
(8)返回當前目錄getcwd
os.getcwd()
>>>
6. 栗子
假設有一個較Test的目錄,包含2個檔案:檔案1是abc.txt,檔案2是新建的空檔案demo.py。
abc.txt內容如下:
Google
Baidu
Wangyi
Facebook
題目1:把abc.txt的內容讀出了,按照下面的格式寫到一個新檔案abc_new.txt中:
1.Google
2.Baidu
3.Wangyi
4.Facebook
答題:
粗糙寫法:
f1 = open(r'abc.txt')
contents = f1.readlines() # 讀取abc.txt所有內容,儲存為列表contents
f1.close()
for i in range(0,len(contents)):
content[i] = str(i+1) + ':' +content[i] # 在每一行之前加'序號:'
f2 = open(r'abc_new',w) # 以寫模式開啟abc_new.txt,若沒有則建立
f2.writelines(contents) # 把加了序號後的內容寫進去
f2.close()
整理&改進
def read_file(): # 把讀檔案抽象成一個函式
with open(r'abc.txt') as f1:
content = f1.readlines()
return content
def write_file(cont): # 把寫檔案抽象成一個函式
with open(r'abc_new',w) as f2:
f2.writelines(cont)
contList = [] # 定義一個列表,用來獲取檔案內容
for i,j in enumerate(read_file): # 修改內容
contList.append(str(i+1) + ':' +j)
write_file(conList) # 呼叫寫函式
題目2:此時Test目錄下有三個檔案:abc123.txt、abc_new123.txt、demo.py
要求給所有.txt檔案重新命名,變成如下檔名:
abc.txt
abc_new.txt
demo.py
答題:
inport os
def rename_file():
f.list = os.listdir('.') # 列出Test目錄下的所有檔案
for file_name in f.list:
if file_name.endswith('txt'): # 過濾出.txt檔案
# 修改檔名:去掉檔名中的數字
new_name = file_name.transtrate(None,'0123456789')
print new_name
os.rename(file_name, new_name) # 重新命名
rename_file()