1. 程式人生 > >python一些 檔案操作

python一些 檔案操作

如何讀寫文字檔案

python2中文字檔案讀寫

f = open("py2.txt","w")
s = u"你好"
f.write(s.encode('gbk'))
f.close()


f = open('py2.txt','r')
t = f.read()

print(t)
print(t.decode('gbk'))

python3中文字檔案讀寫

f = open("py3.txt","wt",encoding='utf8')
f.write("你好")
f.close()


f = open("py3.txt","rt",encoding='utf8')
s = f.read()
print(s)

#自動幫助我們完成了編解碼,其實讀取寫入的還是位元組

如何處理二進位制檔案?

以WAV格式為例子

wav是一種音訊檔案的格式,為二進位制

前44位元組為頭部資訊

包括 聲道數 取樣頻率 PCM位寬等等

後面是音訊取樣資料

使用 vlc demo.wav播放

f = open('demo.wav','rb')

#頭部資訊
info =  f.read(44)
import struct
shengdaoshu = struck.unpack('h',info[22:24])
# h 小段位元組序
caiyangpinlv = struck.unpack('i',info[24:28])
# int
bianmakuandu = struck.unpack('h',info[34:36])


import array
f.seek(0,2)
f.tell()
n=(f.tell()-44)/2
buf = array.array('h',(0 for _ in xrange(n)))
f.seek(44)
f.readinto(buf) # 把資料讀入buf中


for i in xrange(n):buf[i] /=8
f2 = open('demo2.wav','wb')
f2.write(info)
buf.tofile(f2)
f2.close()

如何設定檔案的緩衝

IO操作

磁碟是屬於塊裝置

寫入一個位元組 和 寫入4096個位元組 耗時是一樣的

檔案的緩衝分為

全緩衝 ,緩衝區有一定大小,滿足條件

行緩衝,終端換行符

無緩衝,串列埠裝置,時時的。

f = open("",buffering=2048) 全緩衝

f = open("",buffering=1)   行緩衝

f = open("",buffering=0)   無緩衝

如何將文字對映到記憶體

應用場景

1.將整個檔案 對映到記憶體中,像訪問陣列一樣訪問檔案

當修改陣列的時候,檔案也同時被修改

2.某些嵌入式裝置,我們對映 /dev/mem某範圍

3.多個程序對映同一個檔案,還能實現程序通訊的目的

#建立一個二進位制檔案
dd if=/dev/zero of=demo.bin bs=1024 count=1024

#16進位制檢視這個檔案
od -x demo.bin

import mmap
f = open('demo.bin','r+b')
#檔案描述符,0是整個檔案。access 寫許可權
m = mapp.mapp(f.fileno(),0,access=mmap.ACCESS_WRITE)

m[0] = '\x88'
m[4:8] = '\xff' * 4 

offset = 記憶體頁的整數倍

如何訪問檔案的狀態

1 檔案型別

2 檔案的訪問許可權

3 檔案的最後訪問 修改 節點狀態

4 檔案的大小…等等

使用os 系統呼叫  stat fstat lstat
import os
import stat
s = os.stat('a.txt')
stat.S_ISDIR(s.st_mode) #判斷是否為資料夾
stat.S_ISREG(s.st_mode)


快捷函式
os.path.isdir('x.txt')

os.path.islink('x.txt')

os.path.isfile('x.txt')

三個時間
getatime  getctime  getmtime
普通檔案大小
getsize

如何使用臨時檔案

感測器每收集1G資料,進行資料分析

如果常駐記憶體,消耗大量的記憶體資源

使用臨時檔案,不需要命名,且關閉後會被刪除掉

from tempfile import TemporaryFile,NamedTemporaryFile

f = TemporaryFile()

f.write('abcde'*1000)

只能由物件f來訪問,不能由系統路徑來訪問

ntf = NamedTemporaryFile()
ntf.name
# /tmp/tmp8Zs8Rc 臨時檔案建立在這個下面

臨時檔案關閉後,會被刪除

不刪除的話, ntf = NamedTemporaryFile(delete=False)