python IO程式設計

2022-07-03 18:12:15 字數 4438 閱讀 8031

目錄stringio和bytesio

操作檔案和目錄

序列化在磁碟上讀寫檔案的功能都是由作業系統提供的,現代作業系統不允許普通的程式直接操作磁碟,所以,讀寫檔案就是請求作業系統開啟乙個檔案物件(通常稱為檔案描述符),然後,通過作業系統提供的介面從這個檔案物件中讀取資料(讀檔案),或者把資料寫入這個檔案物件(寫檔案)。

要以讀檔案的模式開啟乙個檔案物件,使用python內建的open()函式,傳入檔名和標示符:

>>> f = open('./test.txt', 'r')

標示符'r'表示讀,這樣,我們就成功地開啟了乙個檔案。

如果檔案不存在,open()函式就會丟擲乙個ioerror的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在:

ps g:\phpstudy\phptutorial\www> python -u "g:\phpstudy\phptutorial\www\test.py"

traceback (most recent call last):

file "g:\phpstudy\phptutorial\www\test.py", line 2, in f = open('./test1.txt','r')

filenotfounderror: [errno 2] no such file or directory: './test1.txt'

如果檔案開啟成功,接下來,呼叫read()方法可以一次讀取檔案的全部內容,python把內容讀到記憶體,用乙個str物件表示:

>>> print(f.read())

'test111'

最後一步是呼叫close()方法關閉檔案。檔案使用完畢後必須關閉,因為檔案物件會占用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的:

>>> f.close()

python引入了with語句來自動幫我們呼叫close()方法:

with open('./test.txt', 'r') as f:

print(f.read())

呼叫read()會一次性讀取檔案的全部內容,如果檔案有10g,記憶體就爆了,所以,要保險起見,可以反覆呼叫read(size)方法,每次最多讀取size個位元組的內容。

另外,呼叫readline()可以每次讀取一行內容,呼叫readlines()一次讀取所有內容並按行返回list。因此,要根據需要決定怎麼呼叫。

讀取一行行的網域名稱,字典可以用readline()readlines()

b'\xff\xd8\xff\xe1\x00\x18exif\x00\x00...' # 十六進製制表示的位元組

>>> f = open('/users/michael/gbk.txt', 'r', encoding='gbk')

>>> f.read()

'測試'

遇到有些編碼不規範的檔案,你可能會遇到unicodedecodeerror,因為在文字檔案中可能夾雜了一些非法編碼的字元。遇到這種情況,open()函式還接收乙個errors引數,表示如果遇到編碼錯誤後如何處理。最簡單的方式是直接忽略:

>>> f = open('/users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

with open('./test.txt','w') as f:

f.write('oh!!!!')

如果我們要操作檔案、目錄,可以在命令列下面輸入作業系統提供的各種命令來完成。比如dir、cp等命令。

作業系統提供的命令只是簡單地呼叫了作業系統提供的介面函式,python內建的os模組也可以直接呼叫作業系統提供的介面函式。

如何使用os模組的基本功能:

>>> import os

>>> os.name # 作業系統型別

'nt'

如果是posix,說明系統是linux、unix或mac os x,如果是nt,就是windows系統。

要獲取詳細的系統資訊,可以呼叫uname()函式:

>>> os.uname()

posix.uname_result(sysname='darwin', nodename='michaelmacpro.local', release='14.3.0', version='darwin kernel version 14.3.0: mon mar 23 11:59:05 pdt 2015; root:xnu-2782.20.48~5/release_x86_64', machine='x86_64')

注意uname()函式在windows上不提供,也就是說,os模組的某些函式是跟作業系統相關的。

在作業系統中定義的環境變數,全部儲存在os.environ這個變數中,可以直接檢視:

import os

print(os.environ)

要獲取某個環境變數的值,可以呼叫os.environ.get('key'):

import os

print(os.environ.get('path'))

操作檔案和目錄的函式一部分放在os模組中,一部分放在os.path模組中,這一點要注意一下。檢視、建立和刪除目錄可以這麼呼叫:

import os

# 檢視當前目錄的絕對路徑:

print(os.path.abspath('.'))

#g:\phpstudy\phptutorial\www

## 在某個目錄下建立乙個新目錄,首先把新目錄的完整路徑表示出來:

r = os.path.join(r'g:\phpstudy\phptutorial\www\test', 'testdir')

#g:\phpstudy\phptutorial\www\test\testdir

# 然後建立乙個目錄:

os.mkdir(r'g:\phpstudy\phptutorial\www\test')

# 刪掉乙個目錄:

os.rmdir(r'g:\phpstudy\phptutorial\www\test')

把兩個路徑合成乙個時,不要直接拼字串,而要通過os.path.join()函式,這樣可以正確處理不同作業系統的路徑分隔符。在linux/unix/mac下,os.path.join()返回這樣的字串:

part-1/part-2

而windows下會返回這樣的字串:

part-1\part-2

同樣的道理,要拆分路徑時,也不要直接去拆字串,而要通過os.path.split()函式,這樣可以把乙個路徑拆分為兩部分,後一部分總是最後級別的目錄或檔名:

r = os.path.split(r'g:\phpstudy\phptutorial\www\test')

#('g:\\phpstudy\\phptutorial\\www', 'test')

os.path.splitext()可以直接讓你得到副檔名,很多時候非常方便:

r = os.path.splitext('/path/to/file.txt')

#('/path/to/file', '.txt')

檔案操作使用下面的函式。假定當前目錄下有乙個test.txt檔案:

# 對檔案重新命名:

>>> os.rename('test.txt', 'test.py')

# 刪掉檔案:

>>> os.remove('test.py')

但是複製檔案的函式居然在os模組中不存在!原因是複製檔案並非由作業系統提供的系統呼叫。理論上講,我們通過上一節的讀寫檔案可以完成檔案複製,只不過要多寫很多**。

幸運的是shutil模組提供了copyfile()的函式,你還可以在shutil模組中找到很多實用函式,它們可以看做是os模組的補充。

最後看看如何利用python的特性來過濾檔案。比如我們要列出當前目錄下的所有目錄,只需要一行**:

>>> [x for x in os.listdir('.') if os.path.isdir(x)]
要列出所有的.py檔案,也只需一行**:

>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

python IO程式設計

io程式設計 檔案讀寫 f open text.txt r 標示符 r 表示讀 str f.read print str f.close 如果檔案不存在,open 函式就會丟擲乙個ioerror的錯誤,並且給出錯誤碼和詳細的資訊告訴你檔案不存在。最後一步是呼叫close 方法關閉檔案。檔案使用完畢後...

Python IO程式設計

io在計算機中指input output,也就是輸入和輸出。由於程式和執行時資料是在記憶體中駐留,由cpu這個超快的計算核心來執行,涉及到資料交換的地方,通常是磁碟 網路等,就需要io介面。只要進行資料交換,網路傳輸等行為都會產生io操作。同步io cpu等著,也就是程式暫停執行後續 等100m的資...

PythonIO程式設計

1.檔案讀寫 python內建了讀寫檔案的函式,用法和c是相容的。讀寫檔案前,我們先必須了解一下,在磁碟上讀寫檔案的功能都是由作業系統提供的,現代作業系統不允許普通的程式直接操作磁碟,所以,讀寫檔案就是請求作業系統開啟乙個檔案物件 通常稱為檔案描述符 然後,通過作業系統提供的介面從這個檔案物件中讀取...