python 文件操作總結

来源:https://www.cnblogs.com/wj-1314/archive/2018/02/27/8476315.html
-Advertisement-
Play Games

文件操作對於編程語言的重要性不言而喻,如果數據不能持久保存,信息技術也就失去了意義。 文件操作的內容包括打開文件,操作文件,關閉文件 一,打開文件 python中打開文件的函數為open('filename',mode='r',encode='None'),open函數預設返迴文件的句柄,我們可以根 ...


  文件操作對於編程語言的重要性不言而喻,如果數據不能持久保存,信息技術也就失去了意義。

  文件操作的內容包括打開文件,操作文件,關閉文件

一,打開文件

  python中打開文件的函數為open('filename',mode='r',encode='None'),open函數預設返迴文件的句柄,我們可以根據句柄來對文件進行增,刪,改,查的操作。將句柄賦給我們定義的變數,假設我們定義變數為f,則f=open('filename',mode='r',encode='utf-8') 或者with open('filename') as f。

註意點:

  1.python解釋器打開文件時,是對硬碟進行操作,需要內核態才可以操作硬碟,故此時python解釋器是調用操作系統的文件讀取介面。windows中文版本預設使用GBK編碼表,linux預設使用utf-8,所有如果操作的文件在windows下,非GBK編碼的,需要在open函數中聲明編碼類型,使操作系統運用相應的編碼規則進行解碼讀取,防止串碼,亂碼現象。

  2.open主要有三種模式,讀(r),寫(w),追加(a),其中,預設為讀模式。各個模式的詳解,見下文。

二,關閉文件

關閉文件有兩組方式:

  1.使用f.close()  ,f為open返回的句柄賦值的變數名。

   2.程式結束後,自動關閉。第一個方法容易造成文件寫操作時,數據的丟失。原因是寫數據時,數據會先保存在記憶體中,文件關閉時才會寫入硬碟,此時如果文件未關閉,軟體因為異常崩潰,導致記憶體中的數據丟失,且未寫入硬碟中。作為第一種關閉方法的優化,是使用:with open('filename') as f 。with會創建一個程式塊,將文件操作置於with程式塊下,這樣with控制塊結束,文件也會自動關閉。

語法如下:

with open('f1.txt') as f1 , open('f2.txt') as f2:
    ......

  

三,操作文件

3.1 file的基本方法

方法

功能

F.read([size])  

size為讀取的長度,以byte為單位

F.readline([size]) 

如果定義了size,有可能返回的只是一行的一部分 

F.readlines([size]) 

把文件每一行作為一個list的一個成員,並返回這個list。其實它的內部是通過迴圈調用readline()來實現的。如果提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分

F.write(str) 

把str寫到文件中,write()並不會在str後加上一個換行符

F.writelines(seq) 

把seq的內容全部寫到文件中。這個函數也只是忠實地寫入,不會在每行後面加上任何東西

F.close() 

關閉文件。python會在一個文件不用後自動關閉文件,不過這一功能沒有保證,最好還是養成自己關閉的習慣。如果一個文件在關閉後還對其進行操作會產生ValueError 

F.flush()

把緩衝區的內容寫入硬碟 ,即將記憶體中的數據刷新到銀盤上

F.fileno() 

返回一個長整型的”文件標簽“ 

F.isatty()

文件是否是一個終端設備文件(unix系統中的)

F.tell() 

返迴文件操作標記的當前位置,以文件的開頭為原點 

F.next()

返回下一行,並將文件操作標記位移到下一行。把一個file用於for ... in file這樣的語句時,就是調用next()函數來實現遍歷的。 

F.seek(offset[,whence]) 

將文件打操作標記移到offset的位置。這個offset一般是相對於文件的開頭來計算的,一般為正數。但如果提供了whence參數就不一定了,whence可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以文件末尾為原點進行計算。需要註意,如果文件以a或a+的模式打開,每次進行寫操作時,文件操作標記會自動返回到文件末尾

F.truncate([size]) 

把文件裁成規定的大小,預設的是裁到當前文件操作標記的位置。如果size比文件的大小還要大,依據系統的不同可能是不改變文件,也可能是用0把文件補到相應的大小,也可能是以一些隨機的內容加上去。

 

3.2 文件的讀取、創建、追加、刪除、清空

一,用python創建一個新文件,內容是0到9的整數,每個數字占一行

f = open('f.txt','w')
for i in range(0,10):
    f.write(str(i)+'\n')
f.close()

二,文件內容追加,從0到9的10個隨機整數

import random
f = open('f.txt','a')
for i in range(0,10):
    f.write(str(random.randint(0,9)))
f.write('\n')
f.close()

三、文件內容追加,從0到9的隨機整數, 10個數字一行,共10行

import random
f = open('f.txt','a')
for i in range(0,10):
    for i in range(0,10):
        f.write(str(random.randint(0,9)))
    f.write('\n')
f.close()

四、把標準輸出定向到文件

import sys
sys.stdout = open('stdout.txt','w')

五,文件的讀寫

5.1,文件打開

f = file(name[, mode[, buffering]])
name 文件名

mode   選項,字元串

buffering   是否緩衝 (0=不緩衝,1=緩衝, >1的int數=緩衝區大小) 

文件的讀寫屬性

  file對象有自己的屬性和方法。先來看看file的屬性。(+和b可以和其他的字元組合成mode,例如rb以二進位只讀方式打開,mode參數是可選的,如果沒有預設為r)

(註意:文件打開之後,應當被及時關閉,可以查看f.closed屬性以確認文件是否被關閉)

mode

function

r

只讀模式(預設,文件不存在,則發生異常)文件的指針將會放在文件的開頭

w

只寫模式(可讀,文件不存在則創建,存在則刪除內容,再打開文件)

a

追加模式(只能寫,文件不存在則創建,存在則追加內容)

r+

可讀寫模式(可讀,可寫,可追加)

b

以二進位方式打開(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進位文件時需標註)

w+

先寫再讀(可讀,可寫,可追加) 如果該文件已存在則將其覆蓋。如果該文件不存在,創建新文件。

a+

同a(可讀可寫,文件不存在則創建,存在則追加內容)。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。

rb

以二進位讀方式打開,只能讀文件 , 如果文件不存在,會發生異常

wb

以二進位寫方式打開,只能寫文件, 如果文件不存在,創建該文件

ab

二進位追寫文件。 從文件頂部讀取內容 從文件底部添加內容 不存在則創建

rt

以文本讀方式打開,只能讀文件 , 如果文件不存在,會發生異常

wt

以文本寫方式打開,只能讀文件 , 如果文件不存在,創建該文件。如果文件存在。先清空,再打開文件

at

以文本讀寫方式打開,只能讀文件 , 如果文件不存在,創建該文件。如果文件存在。先清空,再打開文件

rb+

以二進位讀方式打開,可以讀、寫文件 , 如果文件不存在,會發生異常  

wb+

以二進位寫方式打開,可以讀、寫文件, 如果文件不存在,創建該文件.如果文件存在。先清空,再打開文件

ab+

追讀寫二進位。從文件頂部讀取內容 從文件底部添加內容 不存在則創建

5.2,關閉文件

f.close()

  當文件讀寫完畢後,應關閉文件

六,清空文件內容

f.truncate()

  註意:僅當以 "r+"   "rb+"    "w"   "wb" "wb+"等以可寫模式打開的文件才可以執行該功能

七,文件的指針定位與查詢

7.1,文件指針:
      文件被打開後,其對象保存在 f 中, 它會記住文件的當前位置,以便於執行讀、寫操作,這個位置稱為文件的指針( 一個從文件頭部開始計算的位元組數 long 類型 )。

7.2,文件打開時的位置:

      以"r"   "r+"   "rb+" 讀方式, "w"   "w+"   "wb+"寫方式 打開的文件,
     一開始,文件指針均指向文件的頭部。

7.3,獲取文件指針的值:

 L = f.tell()

  
7.4,移動文件的指針

 f.seek(   偏移量, 選項 )


      選項 =0 時, 表示將文件指針指向從文件頭部到 "偏移量"位元組處。


      選項 =1 時, 表示將文件指針指向從文件的當前位置,向後移動 "偏移量"位元組。


      選項 =2 時, 表示將文件指針指向從文件的尾部,,向前移動 "偏移量"位元組。

八,從文件讀取內容

8.1,文本文件(以"rt"方式打開的文件)的讀取  

s = f.readline(     )


        返回值: s 是字元串,從文件中讀取的一行,含行結束符。


        說明: (1)  如果 len( s ) =0 表示已到文件尾


                    (2)   如果是文件的最後一行,有可能沒有行結束符

8.2,二進位文件(以"rb"、"rb+"、"wb+" 方式打開的文件)的讀取  

s = f.read(    n )


     說明: (1)  如果 len( s ) =0 表示已到文件尾


                  (2)   文件讀取後,文件的指針向後移動 len(s) 位元組。


                (3)如果磁軌已壞,會發生異常。

九,向文件寫入一個字元串

f.write(    s )


    參數:       s 要寫入的字元串


    說明: (1)文件寫入後,文件的指針向後移動 len(s) 位元組。


                 (2)如果磁軌已壞,或磁碟已滿會發生異常。


返回值: s 是字元串,從文件中讀取的內容

十,刪除文件

import os


os.remove(file)

import os
os.remove('s.txt')

3.3 python逐行讀取文件內容的兩種方法

方法一:

for line in open('f.txt'):
    print(line)

方法二:

f =open('f.txt','r')
lines =f.readlines()
for i in lines:
    print(i)

 3.4文件定位

  tell()方法告訴你文件內的當前位置, 換句話說,下一次的讀寫會發生在文件開頭這麼多位元組之後。

  seek(offset [,from])方法改變當前文件的位置。Offset變數表示要移動的位元組數。From變數指定開始移動位元組的參考位置。

  如果from被設為0,這意味著將文件的開頭作為移動位元組的參考位置。

  如果設為1,則使用當前的位置作為參考位置。

  如果它被設為2,那麼該文件的末尾將作為參考位置。

例子:

#打開一個文件
f =open('f.txt','r+')
str_read = f.read(10)
print("讀取的字元串是:%s" % str_read)

#查找當前位置
position = f.tell()
print("當前位置: %s" %position)

#把指針再次重新定位到文件開頭
position =f.seek(0,0)
str_read =f.read(10)
print("重新讀取讀取的字元串是:%s" % str_read)

#關閉文件
f.close()

結果:
讀取的字元串是:2204513940
當前位置: 10
重新讀取讀取的字元串是:2204513940

3.5 重命名和刪除文件

Python的os模塊提供了幫你執行文件處理操作的方法,比如重命名和刪除文件。

要使用這個模塊,你必須先導入它,然後才可以調用相關的各種功能。

rename()方法:

rename()方法需要兩個參數,當前的文件名和新文件名。

語法:

os.rename(current_file_name, new_file_name)

例子:

import os
#重命名文件f.txt問哦file.txt
os.rename('f.txt','file.txt')

remove方法

你可以用remove()方法刪除文件,需要提供要刪除的文件名作為參數。

語法:

os.remove(file_name)

例子:

import os
os.remove('stdout.txt')

3.6 文件修改

  硬碟的存儲原理就是,當你把文件存到硬碟上,就在硬碟上划了一塊空間,存數據,等你下次打開這個文件,會seek到一個位置,每改一個字,就是把原來的覆蓋掉,如果要插入,是不可能的,因為後面的數據在硬碟上不會整體向後移動,所以就會出現當前這個情況,你要插入,卻變成把舊內容覆蓋掉。

  所以修改文件,就不要在硬碟上修改,把內容全部讀到記憶體里,數據在記憶體里可以隨便增刪改查,修改之後,把內容全部寫回硬碟,把原來的數據全部覆蓋掉。

  當然了,如果有些文件特別大,比如5G,那麼一下吃掉這麼大記憶體,非常浪費資源,所以更好的方法就是,如果不像占記憶體,那麼就邊讀邊寫,也就是不修改源文件,但是可以打開丟文件的同時,生成一個新文件,邊從舊的裡面讀,邊往新的裡面寫,遇到需要修改的就改了再寫道新文件,這樣在記憶體裡面一直只存一行內容,就不占記憶體了,但是也有一個缺點就是,雖然不占記憶體,但是占硬碟,每次修改,都要生成一份新文件,雖然改完後,可以把舊的覆蓋掉,但是在改的過程中,還是有兩份數據

 

  3.6.1文件修改占硬碟

代碼:

f_name= 'file.txt'
f_new_name = 'file_new.txt'
old_str = '123'
new_str = '123123123'

f = open(f_name,'r',encoding='gbk')
f_new = open(f_new_name,'w',encoding='gbk')

for line in f:
    if old_str in line:
        line = line.replace(old_str,new_str)
    f_new.write(line)
f.close()
f_new.close()

  上面的代碼會生成一個修改後的新文件,源文件不動,若想覆蓋源文件

代碼如下:

 

 

 

 

四,補充內容

4.1 各種系統操作

  註意:雖然python中提供了各種拼接目錄的函數,但是,函數並不能保證字元編碼不出問題,很大可能導致程式錯誤。所以最好還是自己拼接。

   python中對文件、文件夾(文件操作函數)的操作需要涉及到os模塊和shutil模塊。

得到當前工作目錄,即當前Python腳本工作的目錄路徑: os.getcwd()

返回指定目錄下的所有文件和目錄名:os.listdir()

函數用來刪除一個文件:os.remove()

刪除多個目錄:os.removedirs(r“c:\python”)

檢驗給出的路徑是否是一個文件:os.path.isfile()

檢驗給出的路徑是否是一個目錄:os.path.isdir()

判斷是否是絕對路徑:os.path.isabs()

檢查是否快捷方式os.path.islink ( filename )

檢驗給出的路徑是否真地存:os.path.exists()

返回一個路徑的目錄名和文件名:os.path.split() eg os.path.split('/home/swaroop/byte/code/poem.txt') 結果:('/home/swaroop/byte/code', 'poem.txt')

分離擴展名:os.path.splitext()

獲取路徑名:os.path.dirname()

獲取文件名:os.path.basename()

運行shell命令: os.system()

讀取和設置環境變數:os.getenv() 與os.putenv()

給出當前平臺使用的行終止符:os.linesep Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'
指示你正在使用的平臺:os.name 對於Windows,它是'nt',而對於Linux/Unix用戶,它是'posix'
重命名:os.rename(old, new)

創建多級目錄:os.makedirs(r“c:\python\test”)

創建單個目錄:os.mkdir(“test”)

獲取文件屬性:os.stat(file)

修改文件許可權與時間戳:os.chmod(file)

終止當前進程:os.exit()

獲取文件大小:os.path.getsize(filename)

  

4.2 各種目錄操作

os.mkdir("file") 創建目錄

複製文件:
shutil.copyfile("oldfile","newfile") oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") oldfile只能是文件夾,newfile可以是文件,也可以是目標目錄

複製文件夾:
shutil.copytree("olddir","newdir") olddir和newdir都只能是目錄,且newdir必須不存在

重命名文件(目錄)
os.rename("oldname","newname") 文件或目錄都是使用這條命令

移動文件(目錄)
shutil.move("oldpos","newpos") 

刪除文件
os.remove("file")

刪除目錄
os.rmdir("dir")只能刪除空目錄
shutil.rmtree("dir") 空目錄、有內容的目錄都可以刪

轉換目錄
os.chdir("path") 換路徑
 
ps: 文件操作時,常常配合正則表達式:
img_dir = img_dir.replace('\\','/')

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【software construction】第一章 軟體構造的多維視角 - 描述軟體系統的三個維度 - 元素、關係和各種視角的模式 - 不同視角間的轉換 ...
  • 編寫一個類的方法,判斷某一年是否為閏年。閏年是西曆中的名詞,能被4整除但不能被100整除,或能被400整除的年份即為閏年。 import java.util.Scanner;public class isLeapYear { public static void main(String[] args ...
  • defaultdict函數將所有值初始化為指定類型 '' python按照引用傳遞 [1, 2, 3, 4] isinstance函數檢查對象是否為某個特定的類型 False is用來判斷兩份引用是否指向同一個對象與 == 不同 True 字元串左邊加上r表示字元應該按原本樣子解釋 e\\e str ...
  • 相信不少Springboot初學者和我一樣,都遇到上邊這個提示,明明路徑都是對的,但就是找不到對於的頁面而404了,這也困擾我很長一段時間,我也是不得其解,百度上也鮮有合理回答,因為以前使用的時候,明明一切都很正常,這也讓我疑神疑鬼了,一度懷疑是idea的問題,也重裝了,還建了很多次項目來實驗,這大 ...
  • Description 考慮正整數集合,現在有n組人依次來取數,假設第i組來了x人,他們每個取的數一定是x的倍數,並且是還剩下的最小的x個。正整數中有m個數被標成了幸運數,問有哪些人取到了幸運數。 考慮正整數集合,現在有n組人依次來取數,假設第i組來了x人,他們每個取的數一定是x的倍數,並且是還剩下 ...
  • 用戶模塊 要登陸後才能購買,因此我們先寫購買模塊. 設計實體 設計資料庫表 編寫DAO 測試DAO 抽取DAO 編寫Service 前臺樣式 head.jsp head.css 效果: 實現登陸註冊功能 當點擊登陸按鈕的時候,把數據帶過去給Servlet,讓Servlet調用BusinessServ ...
  • 介面的應用 介面是一種能力 關鍵字:interface 語法: 註:介面內,所有方法都沒有方法體 介面的特性: 介面不可以被實例化 常作為類型使用 實現類必須實現介面的所有方法 實現類可以實現多個介面 介面中的變數都是靜態常量 Java中的多繼承 生活中的介面: 電腦USB介面 引出: USB介面本 ...
  • Jewel Magic UVA - 11996 這是一道用splay/非旋treap做的題(這裡用的是非旋treap) 1/2/3是splay/非旋treap的常規操作。對於操作4,可以用哈希法求LCP。記hash(i,L)為子串[i,i+L-1](即第i個開始的L個)的hash值。記s[i]為序列 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...