1. 程式人生 > 程式設計 >詳解Python IO程式設計

詳解Python IO程式設計

檔案讀寫

讀檔案

try:
 # windows下utf8
 f = open('./README.md','r',encoding='utf8',errors='ignore')
 print(f.read())
finally:
 f and f.close()


# 用with簡化
with open('./README.md',encoding='utf8') as f:
 print(f.read())

# 迭代讀取大檔案
with open('./README.md',encoding='utf8') as f:
 # readline()可以每次讀取一行內容
 for line in f.readlines():
  # 把末尾的'\n'刪掉
  print(line.strip())
  
# 讀取二進位制檔案
f = open('/Users/michael/test.jpg','rb')
f.read() # b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六進位制表示的位元組

寫檔案

寫檔案和讀檔案是一樣的,唯一區別是呼叫open()函式時,傳入識別符號'w'或者'wb'表示寫文字檔案或寫二進位制檔案

可以反覆呼叫write()來寫入檔案,但是務必要呼叫f.close()來關閉檔案。當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。所以,還是用with語句來得保險

with open('./test2.md','a',encoding='utf8') as f:
 f.write('Hello,python!')
 
# 檔案內字元替換,把你好替換為hi,然後讀取內容到記憶體中
with open('test.txt','r') as f:
 s = f.readlines()
# 接著開啟檔案,用replace替換掉你記憶體中的內容,然後寫入檔案
with open('test.txt','w') as w:
 for i in s:
  w.write(i.replace('你好','hi'))

StringIO和BytesIO

StringIO

在記憶體中讀寫str。

from io import StringIO
f = StringIO()
f.write('hello')
f.write(' ')
f.write('world!')
print(f.getvalue()) # 方法用於獲得寫入後的str。

f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
 s = f.readline()
 if(s == ''):
  break
 print(s.strip())

BytesIO

記憶體中讀寫bytes

from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8')) # 寫入的不是str,而是經過UTF-8編碼的bytes。
print(f.getvalue())

f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read() # b'\xe4\xb8\xad\xe6\x96\x87'

操作檔案和目錄

import os
os.name # 如果是posix,說明系統是Linux、Unix或Mac OS X,如果是nt,就是Windows系統。
os.uname() # 注意uname()函式在Windows上不提供

環境變數

在作業系統中定義的環境變數,全部儲存在os.environ這個變數中

import os
os.name
'nt'
os.environ # 獲取環境變數
os.environ.get('PATH')
os.environ.get('x','default')

操作檔案和目錄

操作檔案和目錄的函式一部分放在os模組中,一部分放在os.path模組中

# 檢視當前目錄的絕對路徑:
os.path.abspath('.')


# 當前的目錄名
os.path.dirname(os.path.abspath(__file__))

# 在某個目錄下建立一個新目錄,首先把新目錄的完整路徑表示出來:
os.path.join('/Users/michael','testdir') # '/Users/michael/testdir'

# 然後建立一個目錄:
os.mkdir('/Users/michael/testdir')

# 刪掉一個目錄:
os.rmdir('/Users/michael/testdir')

# 路徑拆分
os.path.split('/Users/michael/testdir/file.txt')

# 獲得副檔名
os.path.splitext('/path/to/file.txt')

# 對檔案重新命名
os.rename('test.txt','test.py')

# 刪掉檔案
os.remove('test.py')


#OS模組

#os模組就是對作業系統進行操作,使用該模組必須先匯入模組:
import os

#getcwd() 獲取當前工作目錄(當前工作目錄預設都是當前檔案所在的資料夾)
result = os.getcwd()
print(result)

#chdir()改變當前工作目錄
os.chdir('/home/sy')
result = os.getcwd()
print(result)

open('02.txt','w')

#操作時如果書寫完整的路徑則不需要考慮預設工作目錄的問題,按照實際書寫路徑操作
open('/home/sy/下載/02.txt','w')

#listdir() 獲取指定資料夾中所有內容的名稱列表
result = os.listdir('/home/sy')
print(result)

#mkdir() 建立資料夾
#os.mkdir('girls')
#os.mkdir('boys',0o777)

#makedirs() 遞迴建立資料夾
#os.makedirs('/home/sy/a/b/c/d')

#rmdir() 刪除空目錄
#os.rmdir('girls')

#removedirs 遞迴刪除資料夾 必須都是空目錄
#os.removedirs('/home/sy/a/b/c/d')

#rename() 檔案或資料夾重新命名
#os.rename('/home/sy/a','/home/sy/alibaba'
#os.rename('02.txt','002.txt')

#stat() 獲取檔案或者資料夾的資訊
#result = os.stat('/home/sy/PycharmProject/Python3/10.27/01.py)
#print(result)

#system() 執行系統命令(危險函式)
#result = os.system('ls -al') #獲取隱藏檔案
#print(result)

#環境變數
'''
環境變數就是一些命令的集合
作業系統的環境變數就是作業系統在執行系統命令時搜尋命令的目錄的集合
'''
#getenv() 獲取系統的環境變數
result = os.getenv('PATH')
print(result.split(':'))

#putenv() 將一個目錄新增到環境變數中(臨時增加僅對當前指令碼有效)
#os.putenv('PATH','/home/sy/下載')
#os.system('syls')

#exit() 退出終端的命令

#os模組中的常用值
#curdir 表示當前資料夾 .表示當前資料夾 一般情況下可以省略
print(os.curdir)

#pardir 表示上一層資料夾 ..表示上一層資料夾 不可省略!
print(os.pardir)

#os.mkdir('../../../man')#相對路徑 從當前目錄開始查詢
#os.mkdir('/home/sy/man1')#絕對路徑 從根目錄開始查詢

#name 獲取代表作業系統的名稱字串
print(os.name) #posix -> linux或者unix系統 nt -> window系統

#sep 獲取系統路徑間隔符號 window ->\ linux ->/
print(os.sep)

#extsep 獲取檔名稱和字尾之間的間隔符號 window & linux -> .
print(os.extsep)

#linesep 獲取作業系統的換行符號 window -> \r\n linux/unix -> \n
print(repr(os.linesep))

#匯入os模組
import os

#以下內容都是os.path子模組中的內容

#abspath() 將相對路徑轉化為絕對路徑
path = './boys'#相對
result = os.path.abspath(path)
print(result)

#dirname() 獲取完整路徑當中的目錄部分 & basename()獲取完整路徑當中的主體部分
path = '/home/sy/boys'
result = os.path.dirname(path)
print(result)

result = os.path.basename(path)
print(result)

#split() 將一個完整的路徑切割成目錄部分和主體部分
path = '/home/sy/boys'
result = os.path.split(path)
print(result)

#join() 將2個路徑合併成一個
var1 = '/home/sy'
var2 = '000.py'
result = os.path.join(var1,var2)
print(result)

#splitext() 將一個路徑切割成檔案字尾和其他兩個部分,主要用於獲取檔案的字尾
path = '/home/sy/000.py'
result = os.path.splitext(path)
print(result)

#getsize() 獲取檔案的大小
#path = '/home/sy/000.py'
#result = os.path.getsize(path)
#print(result)

#isfile() 檢測是否是檔案
path = '/home/sy/000.py'
result = os.path.isfile(path)
print(result)

#isdir() 檢測是否是資料夾
result = os.path.isdir(path)
print(result)

#islink() 檢測是否是連結
path = '/initrd.img.old'
result = os.path.islink(path)
print(result)

#getctime() 獲取檔案的建立時間 get create time
#getmtime() 獲取檔案的修改時間 get modify time
#getatime() 獲取檔案的訪問時間 get active time

import time

filepath = '/home/sy/下載/chls'

result = os.path.getctime(filepath)
print(time.ctime(result))

result = os.path.getmtime(filepath)
print(time.ctime(result))

result = os.path.getatime(filepath)
print(time.ctime(result))

#exists() 檢測某個路徑是否真實存在
filepath = '/home/sy/下載/chls'
result = os.path.exists(filepath)
print(result)

#isabs() 檢測一個路徑是否是絕對路徑
path = '/boys'
result = os.path.isabs(path)
print(result)

#samefile() 檢測2個路徑是否是同一個檔案
path1 = '/home/sy/下載/001'
path2 = '../../../下載/001'
result = os.path.samefile(path1,path2)
print(result)


#os.environ 用於獲取和設定系統環境變數的內建值
import os
#獲取系統環境變數 getenv() 效果
print(os.environ['PATH'])

#設定系統環境變數 putenv()
os.environ['PATH'] += ':/home/sy/下載'
os.system('chls')


# 列出當前目錄檔名
[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']


# walk返回:tupple(dirpath:路徑,dirnames:該路徑下面的目錄list,filenames: 該路徑下面的檔案list)
for fpathe,dirs,fs in os.walk(path): 
 for f in fs: 
  print(os.path.join(fpathe,f)) 

注意: 不用通過直接拼接字串的方式,來拆分路徑。這樣可以正確處理不同作業系統的路徑分隔符;

以上就是詳解Python IO程式設計的詳細內容,更多關於Python IO程式設計的資料請關注我們其它相關文章!