1. 程式人生 > >Python —— 檔案處理

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 ):表示

檔案的前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(20) # 從檔案頭後移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()