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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python文件的读写操作

發(fā)布時(shí)間:2025/3/21 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python文件的读写操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

期望這篇文章能夠幫你更好的了解應(yīng)該如何讀寫文件,并在最恰當(dāng)?shù)牡胤接米詈线m的方法。

什么是文件?

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

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

大多數(shù)現(xiàn)代文件系統(tǒng)上的文件由三個(gè)主要部分組成:

  • 標(biāo)題(Header):有關(guān)文件內(nèi)容的元數(shù)據(jù)(文件名,大小,類型等)

  • 數(shù)據(jù)(Data):由創(chuàng)建者或編輯者編寫的文件內(nèi)容

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

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

文件路徑

在操作系統(tǒng)上訪問文件時(shí),需要文件路徑。文件路徑是表示文件位置的字符串。它分為三個(gè)主要部分:

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

  • 文件名:文件的實(shí)際名稱

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

Python文件路徑相關(guān)操作:

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

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

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

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

  • 相對路徑

    • (.)點(diǎn)表示當(dāng)前文件夾

    • (.. )點(diǎn)點(diǎn)表示父文件夾

  • 相對路徑、絕對路徑轉(zhuǎn)換

    • 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():分離擴(kuò)展名

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

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

  • 檢查路徑有效性

    • path.exists:路徑是否存在

    • path.isdir:是否為目錄

    • path.isfile:是否是文件

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

其他方法:

  • 刪除文件:os.remove()

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

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

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

  • 創(chuàng)建單個(gè)目錄:mkdir(“test”)

  • 修改文件權(quán)限與時(shí)間戳:chmod(file)

目錄操作:

  • 復(fù)制文件:

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

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

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

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

  • 刪除目錄

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

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

行結(jié)尾

處理文件數(shù)據(jù)時(shí)經(jīng)常遇到的一個(gè)問題是新行或行結(jié)尾的表示。行結(jié)尾起源于莫爾斯電碼時(shí)代,使用一個(gè)特定的符號被用來表示傳輸?shù)慕Y(jié)束或一行的結(jié)尾。

后來,國際標(biāo)準(zhǔn)化組織(ISO)和美國標(biāo)準(zhǔn)協(xié)會(huì)(ASA)對電傳打字機(jī)進(jìn)行了標(biāo)準(zhǔn)化。ASA標(biāo)準(zhǔn)規(guī)定行尾應(yīng)使用回車(序列CR或\r)和換行(LF或\n)字符(CR+LF或\r\n)。然而,ISO標(biāo)準(zhǔn)允許CR+LF字符或僅LF字符。

Windows使用CR+LF字符表示新行,而Unix和較新的Mac版本僅使用LF字符。當(dāng)你處理來源于不同操作系統(tǒng)上的文件時(shí),這可能會(huì)導(dǎo)致一些復(fù)雜情況。這是一個(gè)簡單的例子。假設(shè)我們檢查在Windows系統(tǒng)上創(chuàng)建的文件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設(shè)備上以不同方式解釋:

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

按照目錄樹結(jié)構(gòu)以及按照首字母排序進(jìn)行輸出的。

# -*- 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模塊是最簡單的模塊之一,內(nèi)容非常少。用它可以查找符合特定規(guī)則的文件路徑名。

glob.glob

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

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

glob.iglob

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

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

Python讀寫文件內(nèi)容

使用with語句打開文件

在Python中讀寫文件需要3個(gè)步驟:

  • 調(diào)用open函數(shù),返回一個(gè)File對象

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

  • 調(diào)用File對象的close() 方法,關(guān)閉該文件

文件常用打開模式:

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

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

  • ‘a(chǎn)’:附加到文件末尾

  • ‘r+’:讀寫

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

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

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

這里有兩個(gè)問題:

  • 可能忘記關(guān)閉文件句柄;

  • 文件讀取數(shù)據(jù)發(fā)生異常,沒有進(jìn)行任何處理。

加強(qiáng)版代碼:

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

雖然這段代碼運(yùn)行良好,但是太冗長了。with除了有更優(yōu)雅的語法,還可以很好的處理上下文環(huán)境產(chǎn)生的異常。

with版本的代碼:

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

with的工作流程:

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

  • 當(dāng)with后面的代碼塊全部被執(zhí)行完之后,將調(diào)用前面返回對象的 __exit__()方法。

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

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()的區(qū)別

read()

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

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

read()的優(yōu)點(diǎn):

  • 方便、簡單

  • 一次性獨(dú)讀出文件放在一個(gè)大字符串中,速度最快

read()的缺點(diǎn):

  • 文件過大的時(shí)候,占用內(nèi)存會(huì)過大

readline()

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

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

readline()的優(yōu)點(diǎn):

  • 占用內(nèi)存小,逐行讀取

readline()的缺點(diǎn):

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

readlines()

readlines()一次性讀取文本的所有內(nèi)容,結(jié)果是一個(gè)list

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

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

readlines()的優(yōu)點(diǎn):

  • 一次性讀取文本內(nèi)容,速度比較快

readlines()的缺點(diǎn):

  • 隨著文本的增大,占用內(nèi)存會(huì)越來越多

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

  • write()傳入的是字符串

  • writelines()傳入的數(shù)一個(gè)數(shù)組

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)

不要重復(fù)造輪子

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

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

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

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

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

  • zipfile:使用ZIP存檔

  • configparser:輕松創(chuàng)建和解析配置文件

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

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

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

  • PyPDF2:一個(gè)可以分割,合并和轉(zhuǎn)換 PDF 頁面的庫。

  • Pillow:圖像閱讀和操作

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

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

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

參考鏈接:

  • Reading and Writing Files in Python (Guide)

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。