日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python文件的读写操作

發布時間:2025/3/21 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python文件的读写操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Python編程時,經常會遇到讀寫文件的操作。對于讀寫文件的各種模式(如閱讀、寫入、追加等)有時真的會迷惑人,以及搞不清open、read、readline、readlines、write、writelines等方法的使用也會把你繞的云里霧里。

期望這篇文章能夠幫你更好的了解應該如何讀寫文件,并在最恰當的地方用最合適的方法。

什么是文件?

在我們開始研究如何使用Python中的文件之前,了解文件究竟是什么以及現代操作系統如何處理它們的某些方面是非常重要的。

從本質上講,文件是用于存儲數據的連續字節集。這些數據以特定格式組織,可以是任何像文本文件一樣簡單的數據,也可以像程序可執行文件一樣復雜。最后,這些字節文件被翻譯成二進制文件1,0以便計算機更容易處理。

大多數現代文件系統上的文件由三個主要部分組成:

  • 標題(Header):有關文件內容的元數據(文件名,大小,類型等)

  • 數據(Data):由創建者或編輯者編寫的文件內容

  • 文件結束(EOF):表示文件結尾的特殊字符

數據表示的內容取決于所使用的格式規范,通常由擴展名表示。例如,擴展名為.gif的文件最可能符合圖形交換格式規范。有數百個(如果不是數千個)文件擴展名。

文件路徑

在操作系統上訪問文件時,需要文件路徑。文件路徑是表示文件位置的字符串。它分為三個主要部分:

  • 文件夾路徑:文件系統上的文件夾位置,后續文件夾由正斜杠/(Unix)或反斜杠\(Windows)分隔

  • 文件名:文件的實際名稱

  • 擴展名:文件路徑的末尾預先設置了句號(.),用于表示文件類型

Python文件路徑相關操作:

  • 使用getcwd()可獲得當前工作目錄,即當前Python腳本工作的目錄路徑,類似Linux中pwd命令

    • 如果想打印Windows中包含中文的文件名或路徑,需要使用“GBK”進行decode

  • 合并路徑使用path.join()

    • Windows中的反斜杠與Linux中的正斜杠使用sep(反斜杠需要使用\\轉義)

  • 相對路徑

    • (.)點表示當前文件夾

    • (.. )點點表示父文件夾

  • 相對路徑、絕對路徑轉換

    • path.abspath(path):返回絕對路徑

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

    • path.relpath(path,start):返回相對路徑

  • 路徑分割:

  • path.dirname(path):返回文件所在目錄,os.path.basename(path):返回文件名

  • path.split(path) == (os.path.dirname(path), os.path.basename(path)).silit(os.sep)是將路徑按分隔符分割

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

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

  • 查看文件大小:path.getsize(filename),只能統計文件,不同統計文件夾,如需統計文件夾需要自行遍歷。

  • 獲取文件屬性:stat(file)

  • 檢查路徑有效性

    • path.exists:路徑是否存在

    • path.isdir:是否為目錄

    • path.isfile:是否是文件

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

其他方法:

  • 刪除文件:os.remove()

  • 刪除目錄:removedirs(r”c:\python “)

  • 重命名:rename(old, new) #文件或目錄都是使用這條命令

  • 創建多級目錄:makedirs(r”c:\python\test”),其會創建中間文件夾,類似Linux命令 mkdir -p

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

  • 修改文件權限與時間戳:chmod(file)

目錄操作:

  • 復制文件:

    • copyfile(“oldfile”, “newfile”) #oldfile和newfile都只能是文件

    • copy(“oldfile”, “newfile”) #oldfile只能是文件夾,newfile可以是文件,也可以是目標目錄

  • 復制文件夾:copytree(“olddir”, “newdir”) #olddir和newdir都只能是目錄,且newdir必須不存在

  • 移動文件(目錄):move(“oldpos”,”newpos”)

  • 刪除目錄

    • rmdir(“dir”) #只能刪除空目錄

    • rmtree(“dir”) #空目錄、有內容的目錄都可以刪

行結尾

處理文件數據時經常遇到的一個問題是新行或行結尾的表示。行結尾起源于莫爾斯電碼時代,使用一個特定的符號被用來表示傳輸的結束或一行的結尾。

后來,國際標準化組織(ISO)和美國標準協會(ASA)對電傳打字機進行了標準化。ASA標準規定行尾應使用回車(序列CR或\r)和換行(LF或\n)字符(CR+LF或\r\n)。然而,ISO標準允許CR+LF字符或僅LF字符。

Windows使用CR+LF字符表示新行,而Unix和較新的Mac版本僅使用LF字符。當你處理來源于不同操作系統上的文件時,這可能會導致一些復雜情況。這是一個簡單的例子。假設我們檢查在Windows系統上創建的文件dog_breeds.txt:

Pug\r\nJack Russel Terrier\r\nEnglish Springer Spaniel\r\nGerman Shepherd\r\nStaffordshire Bull Terrier\r\nCavalier King Charles Spaniel\r\nGolden Retriever\r\nWest Highland White Terrier\r\nBoxer\r\nBorder Terrier\r\n

同樣的輸出將在Unix設備上以不同方式解釋:

Pug\r\nJack Russel Terrier\r\nEnglish Springer Spaniel\r\nGerman Shepherd\r\nStaffordshire Bull Terrier\r\nCavalier King Charles Spaniel\r\nGolden Retriever\r\nWest Highland White Terrier\r\nBoxer\r\nBorder Terrier\r\n

解決方案:

with open('test.txt', 'r') as f: for line in f.readlines(): line = line.strip('\n')

Python遍歷文件夾方法

使用walk()

輸出總是先文件夾后文件名

# -*- coding: utf-8 -*-import osdef echo_path(root_dir): list_dirs = os.walk(root_dir) for root, dirs, files in list_dirs: for d in dirs: print os.path.join(root, d) for f in files: print os.path.join(root, f)

使用listdir

按照目錄樹結構以及按照首字母排序進行輸出的。

# -*- coding: utf-8 -*-import os def echo_path(root_dir): for dir_list in os.listdir(root_dir): path = os.path.join(root_dir, dir_list) print(path) if os.path.isdir(path): echo_path(path)

glob模塊

glob模塊是最簡單的模塊之一,內容非常少。用它可以查找符合特定規則的文件路徑名。

glob.glob

返回所有匹配的文件路徑列表。它只有一個參數pathname,定義了文件路徑匹配規則,這里可以是絕對路徑,也可以是相對路徑。示例:

import glob #獲取指定目錄下的所有圖片 print(glob.glob(r"E:\Picture\*\*.jpg") ) #獲取上級目錄的所有.py文件 print(glob.glob(r'../*.py') #相對路徑)

glob.iglob

獲取一個可編歷對象,使用它可以逐個獲取匹配的文件路徑名。與glob.glob()的區別是:glob.glob同時獲取所有的匹配路徑,而 glob.iglob一次只獲取一個匹配路徑,即生成器。

import glob file = glob.iglob(r'../*.py')print(file) #<generator object iglob at 0x00B9FF80> for py in f: print(py)

Python讀寫文件內容

使用with語句打開文件

在Python中讀寫文件需要3個步驟:

  • 調用open函數,返回一個File對象

  • 調用File對象的read()或write()方法

  • 調用File對象的close() 方法,關閉該文件

文件常用打開模式:

  • ‘r’:只讀(缺省。如果文件不存在,則拋出錯誤)

  • ‘w’:只寫(如果文件不存在,則自動創建文件)

  • ‘a’:附加到文件末尾

  • ‘r+’:讀寫

如果需要以二進制方式打開文件,需要在mode后面加上字符”b”,比如”rb””wb”等

如果不用with語句,代碼如下:

file = open("/tmp/foo.txt")data = file.read()file.close()

這里有兩個問題:

  • 可能忘記關閉文件句柄;

  • 文件讀取數據發生異常,沒有進行任何處理。

加強版代碼:

try: f = open('xxx')except: print 'fail to open' exit(-1)try: do somethingexcept: do somethingfinally: f.close()

雖然這段代碼運行良好,但是太冗長了。with除了有更優雅的語法,還可以很好的處理上下文環境產生的異常。

with版本的代碼:

with open("/tmp/foo.txt") as file: data = file.read()

with的工作流程:

  • 緊跟with后面的語句被求值后,返回對象的 __enter__() 方法被調用,這個方法的返回值將被賦值給as后面的變量。

  • 當with后面的代碼塊全部被執行完之后,將調用前面返回對象的 __exit__()方法。

有時你可能想要讀取文件并同時寫入另一個文件。如果你使用在學習如何寫入文件時顯示的示例,它實際上可以合并到以下內容中:

d_path = 'dog_breeds.txt'd_r_path = 'dog_breeds_reversed.txt'with open(d_path, 'r') as reader, open(d_r_path, 'w') as writer: dog_breeds = reader.readlines() writer.writelines(reversed(dog_breeds))

文本讀取:read()、readline()、readlines()的區別

read()

read()是最簡單的一種方法,一次性讀取文件的所有內容放在一個大字符串中,即存在內存中。

f = open('test.txt') try: file_context = file_object.read() file_context = open(file).read().splitlines() // file_context是一個list,每行文本內容是list中的一個元素finally: file_object.close()

read()的優點:

  • 方便、簡單

  • 一次性獨讀出文件放在一個大字符串中,速度最快

read()的缺點:

  • 文件過大的時候,占用內存會過大

readline()

readline()是逐行讀取文本,結果是一個list

with open(file) as f: line = f.readline() while line:????????print(line)

readline()的優點:

  • 占用內存小,逐行讀取

readline()的缺點:

  • 由于是逐行讀取,速度比較慢

readlines()

readlines()一次性讀取文本的所有內容,結果是一個list

with open(file) as f: for line in f.readlines(): print(line)

這種方法讀取的文本內容,每行文本末尾都會帶一個’\n’換行符 (可以使用L.rstrip(‘\n’)去掉換行符)

readlines()的優點:

  • 一次性讀取文本內容,速度比較快

readlines()的缺點:

  • 隨著文本的增大,占用內存會越來越多

文本寫入:write()與writelines()

  • write()傳入的是字符串

  • writelines()傳入的數一個數組

lines = ['line1', 'line2']with open('filename.txt', 'w') as f: f.write('\n'.join(lines)) lines = ['line1', 'line2']with open('filename.txt', 'w') as f: f.writelines("%s\n" % l for l in lines)

不要重復造輪子

在處理文件時可能會遇到常見情況。大多數情況可以使用其他模塊處理。此外,還有內置庫,可以使用它們來幫助你:

  • wave:讀寫WAV文件(音頻)

  • aifc:讀寫AIFF和AIFC文件(音頻)

  • sunau:讀取和寫入Sun AU文件

  • tarfile:讀取和寫入tar歸檔文件

  • zipfile:使用ZIP存檔

  • configparser:輕松創建和解析配置文件

  • msilib:讀取和寫入Microsoft Installer文件

  • plistlib:生成并解析Mac OS X .plist文件

還有更多的東西。此外,PyPI還有更多第三方工具可用。以下是一些流行的包:

  • PyPDF2:一個可以分割,合并和轉換 PDF 頁面的庫。

  • Pillow:圖像閱讀和操作

  • python-docx:讀取,查詢以及修改 Microsoft Word 2007+ docx 文件

  • python-pptx:讀取,查詢以及修改 Microsoft PowerPoint 2007+ pptx 文件

  • unp:一個用來方便解包歸檔文件的命令行工具

參考鏈接:

  • Reading and Writing Files in Python (Guide)

總結

以上是生活随笔為你收集整理的Python文件的读写操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。