Python–6 文件操作

  • 2020 年 1 月 19 日
  • 筆記

文件通常用於存儲數據或應用系統的參數。Python 提供了 OS、 os.path、 shutil 等模組處理文件, 其中包括打開文件、 讀寫文件、 複製和刪除文件等函數。

python文件操作基本流程:

1.打開文件,或者新建立一個文件

2.操作文件,如讀/寫數據

3.關閉文件

6.1 文件的常見操作

6.1.1 文件的打開與關閉

文件句柄 = open('文件路徑', '模式')

打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。

打開文件的模式有:

    • r ,只讀模式【默認】
    • w,只寫模式【不可讀;不存在則創建;存在則清空內容;】
    • x, 只寫模式【不可讀;不存在則創建,存在則報錯】
    • a, 追加模式【可讀;   不存在則創建;存在則只追加內容;】

"+" 表示可以同時讀寫某個文件

    • r+, 讀寫【可讀,可寫】
    • w+,寫讀【可讀,可寫】
    • x+ ,寫讀【可讀,可寫】
    • a+, 寫讀【可讀,可寫】

 "b"表示以位元組的方式操作

    • rb  或 r+b
    • wb 或 w+b
    • xb 或 w+b
    • ab 或 a+b

 註:以b方式打開時,讀取到的內容是位元組類型,寫入時也需要提供位元組類型

<1>打開文件

在python,使用open函數,可以打開一個已經存在的文件,或者創建一個新文件

open(文件名,訪問模式)

示例如下:

f = open('test.txt', 'w')

<2>關閉文件

close( )

示例如下:

# 新建一個文件,文件名為:test.txt f = open('test.txt', 'w') # 關閉這個文件 f.close()

6.1.2 文件的讀寫

<1>寫數據(write)

使用write()可以完成向文件寫入數據

demo:

f = open('test.txt', 'w') f.write('hello world, i am here!') f.close()

注意:

    • 如果文件不存在那麼創建,如果存在那麼就先清空,然後寫入數據

<2>讀數據(read)

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

demo:

f = open('test.txt', 'r') content = f.read(5) print(content) print("-"*30) content = f.read() print(content) f.close()

注意:

如果open是打開一個文件,那麼可以不用寫打開的模式,即只寫 open('test.txt')

如果使用讀了多次,那麼後面讀取的數據是從上次讀完後的位置開始的

<3>讀數據(readlines)

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

#coding=utf-8 f = open('test.txt', 'r') content = f.readlines() print(type(content)) i=1 for temp in content:     print("%d:%s"%(i, temp))     i+=1 f.close()

<4>讀數據(readline)

#coding=utf-8 f = open('test.txt', 'r') content = f.readline() print("1:%s"%content) content = f.readline() print("2:%s"%content) f.close()

  文件的遍歷可以使用循環的方式:

#coding=utf-8

f = open('test.txt', 'r') for line in f: print(line) f.close()

示例:製作文件的備份

  任務描述

  • 輸入文件的名字,然後程式自動完成對文件進行備份
# --*-- coding=utf-8 --*--    oldFileName = input("請輸入要拷貝的文件名字:")    oldFile = open(oldFileName,'r')  # 如果打開文件if oldFile:    # 提取文件的後綴  fileFlagNum = oldFileName.rfind('.')  if fileFlagNum > 0:      fileFlag = oldFileName[fileFlagNum:]    # 組織新的文件名字  newFileName = oldFileName[:fileFlagNum] + '[復件]' + fileFlag    # 創建新文件  newFile = open(newFileName, 'w')    # 把舊文件中的數據,一行一行的進行複製到新文件中  for lineContent in oldFile.readlines():      newFile.write(lineContent)    # 關閉文件  oldFile.close()  newFile.close()

View Code

6.1.3 文件的隨機讀寫

<1>獲取當前讀寫的位置

在讀寫文件的過程中,如果想知道當前的位置,可以使用tell()來獲取

# 打開一個已經存在的文件  f = open("test.txt", "r")  str = f.read(3)  print("讀取的數據是 : ", str)    # 查找當前位置  position = f.tell()  print("當前文件位置 : ", position)    str = f.read(3)  print("讀取的數據是 : ", str)    # 查找當前位置  position = f.tell()  print("當前文件位置 : ", position)    f.close()

View Code

<2>定位到某個位置

如果在讀寫文件的過程中,需要從另外一個位置進行操作的話,可以使用seek()

seek(offset, from)有2個參數

offset:偏移量

from:方向

0:表示文件開頭

1:表示當前位置

2:表示文件末尾

demo:把位置設置為:從文件開頭,偏移5個位元組

# 打開一個已經存在的文件  f = open("test.txt", "r")  str = f.read(30)  print("讀取的數據是 : ", str)    # 查找當前位置  position = f.tell()  print("當前文件位置 : ", position)    # 重新設置位置  f.seek(5,0)    # 查找當前位置  position = f.tell()  print("當前文件位置 : ", position)    f.close()

View Code

demo:把位置設置為:離文件末尾,3位元組處

# 打開一個已經存在的文件  # f = open("test.txt", "r")  # 程式運行報錯io.UnsupportedOperation: can't do nonzero cur-relative seeks  # 修改為:  f = open("test.txt", "rb")      # 查找當前位置  position = f.tell()  print("當前文件位置 : ", position)    # 重新設置位置  f.seek(-3,2)    # 讀取到的數據為:文件最後3個位元組數據  str = f.read().decode()    print("讀取的數據是 : ", str)    f.close()

View Code

6.1.4 文件的重命名、刪除

有些時候,需要對文件進行重命名、刪除等一些操作,python的os模組中都有這麼功能

<1>文件重命名

os模組中的rename()可以完成對文件的重命名操作

rename(需要修改的文件名, 新的文件名)

import os os.rename("畢業論文.txt", "畢業論文-最終版.txt")

<2>刪除文件

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

remove(待刪除的文件名)

import os os.remove("畢業論文.txt")

6.2 文件夾的相關操作

實際開發中,有時需要用程式的方式對文件夾進行一定的操作,比如創建、刪除等

就像對文件操作需要os模組一樣,如果要操作文件夾,同樣需要os模組

<1>創建文件夾

import os os.mkdir("張三")

<2>獲取當前目錄

import os os.getcwd()

<3>改變默認目錄

import os os.chdir("../")

<4>獲取目錄列表

import os os.listdir("./")

<5>刪除文件夾

import os os.rmdir("張三")

示例:應用【面試題】:批量修改文件名

源文件:

[root@rs1 renameDir]# ll 總用量 0 drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-1.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-2.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-3.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-4.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-5.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-6.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-7.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-8.txt drwxr-xr-x 2 root root 6 9月 24 17:17 新三國-9.txt

修改後的文件:

[root@rs1 enameDir]# ll 總用量 0 drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-1.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-2.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-3.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-4.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-5.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-6.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-7.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-8.txt drwxr-xr-x 2 root root 6 9月 24 17:17 [英皇出品]-新三國-9.txt

#coding=utf-8    # 批量在文件名前加前綴    import os    funFlag = 1 # 1表示添加標誌  2表示刪除標誌    folderName = './renameDir/'    # 獲取指定路徑的所有文件名字  dirList = os.listdir(folderName)    # 遍歷輸出所有文件名字  for name in dirList:      print name        if funFlag == 1:          newName = '[英皇出品]-' + name      elif funFlag == 2:          num = len('[英皇出品]-')          newName = name[num:]      print newName        os.rename(folderName+name, folderName+newName)

View Code

6.3 文件內容的搜索和替換

文件內容的搜索和替換可以結合前面學習的字元串查找和替換來實現。例如,從 hello.txt 文件中查找字元串 「hello」 ,並統計 「hello」 出現的次數。 hello.txt 文件如下所示。

1 hello world

3 hello hello China

下面這段程式碼從 hello.txt 中統計字元串 「hello」 的個數。

#文件的查找 import re f1 = open('hello.txt') count = 0 for s in f1.readlines():     li = re.findall('hello',s) if len(li) > 0:         count = count + li.count('hello') print("查找到"+ str(count) + "個hello") f1.close()

【程式碼說明】

口第 5行程式碼定義變數count,用於計算字元串 「hello」 出現的次數。

口第 6行程式碼每 次從文件 hello .txt中讀取1行到變數。

口第7行程式碼調用re 模組的函數findall()查詢變數s, 把查找的結果存儲到列表li中。

口第8行程式碼, 如果列表中的元素個數大於0,則表示查找到字元串 「hello」 。

口第9行程式碼調用列 表的count()方法, 統計當前列表中 "hello"出現的次數。

口第10行程式碼輸出結果:

下面這段程式碼把 hello .txt 中的字元串 「hello」 全部替換為 「hi」 ,並把結果保持到文件hello2.txt中。

# 文件的替換 f1 = open("hello.txt") f2 = open("hello2.txt","w") for s in f1.readlines() :     f2.write(s.replace('hello','hi')) f1.close() f2.close()

第 5行程式碼 先使用replace()把變數s中的「hello」替換為「hl,然後把結果寫入到hello2.txt

中。 文件 hello2.txt的內容如下所示。

管理上下文

為了避免打開文件後忘記關閉,可以通過管理上下文,即:

with open('log','r') as f:

...

如此方式,當with程式碼塊執行完畢時,內部會自動關閉並釋放文件資源。

在Python 2.7 及以後,with又支援同時對多個文件的上下文進行管理,即:

with open('log1') as obj1, open('log2') as obj2:

pass

作業:

文件test.txt中包含以下內容:

今年是2017年。

2017年你好。

2017年再見

1) 讀取該文件,並輸出所有內容。

2) 去掉文件內容中的換行。

3) 計算出文件的長度。

4 )使用歐冠2018替換 2017。

5 )創建另一個文件test2.txt, 寫入本文件的內容。