
Python中文件I/O高效操作處理的技巧分享
文件I/O是Python中最重要的技術(shù)之一,在Python中對(duì)文件進(jìn)行I/O操作是非常簡(jiǎn)單的。但如何高效的操作處理是需要技巧的,下面這篇文章就主要介紹了Python中文件I/O高效操作處理的技巧,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
如何讀寫(xiě)文本文件?
實(shí)際案例
某文本文件編碼格式已直(如UTF-8,GBK,BIG5),在python2.x和python3.x中分別如何讀取這些文件?
解決方案
字符串的語(yǔ)義發(fā)生了變化:
python2.x 寫(xiě)入文件前對(duì) unicode 編碼,讀入文件后對(duì)二進(jìn)制字符串解碼
>>> f = open('py2.txt', 'w')
>>> s = u'你好'
>>> f.write(s.encode('gbk'))
>>> f.close()
>>> f = open('py2.txt', 'r')
>>> t = f.read()
>>> print t.decode('gbk')
你好
python3.x 中 open 函數(shù)指定 t 的文本模式, encoding 指定編碼格式
>>> f = open('py3.txt', 'wt', encoding='utf-8')
>>> f.write('你好')
2
>>> f.close()
>>> f = open('py3.txt', 'rt', encoding='utf-8')
>>> s = f.read()
>>> s
'你好'
如何設(shè)置文件的緩沖
實(shí)際案例
將文件內(nèi)容寫(xiě)入到硬盤(pán)設(shè)備時(shí),使用系統(tǒng)調(diào)用,這類I/O操作的時(shí)間很長(zhǎng),為了減少I/O操作的次數(shù),文件通常使用緩沖區(qū)(有足夠多的數(shù)據(jù)才進(jìn)行系統(tǒng)調(diào)用),文件的緩存行為,分為全緩沖、行緩存、無(wú)緩沖。
如何設(shè)置Python中文件對(duì)象的緩沖行文?
解決方案
全緩沖: open 函數(shù)的 buffering 設(shè)置為大于1的整數(shù)n,n為緩沖區(qū)大小
>>> f = open('demo2.txt', 'w', buffering=2048)
>>> f.write('+' * 1024)
>>> f.write('+' * 1023)
# 大于2048的時(shí)候就寫(xiě)入文件
>>> f.write('-' * 2)
>>> f.close()
行緩沖: open 函數(shù)的 buffering 設(shè)置為1
>>> f = open('demo3.txt', 'w', buffering=1)
>>> f.write('abcd')
>>> f.write('1234')
# 只要加上\n就寫(xiě)入文件中
>>> f.write('\n')
>>> f.close()
無(wú)緩沖: open 函數(shù)的 buffering 設(shè)置為0
>>> f = open('demo4.txt', 'w', buffering=0)
>>> f.write('a')
>>> f.write('b')
>>> f.close()
如何將文件映射到內(nèi)存?
實(shí)際案例
在訪問(wèn)某些二進(jìn)制文件時(shí),希望能把文件映射到內(nèi)存中,可以實(shí)現(xiàn)隨機(jī)訪問(wèn).(framebuffer設(shè)備文件)
某些嵌入式設(shè)備,寄存器唄編址到內(nèi)存地址空間,我們可以映射 /dev/mem 某范圍,去訪問(wèn)這些寄存器
如果多個(gè)進(jìn)程映射到同一個(gè)文件,還能實(shí)現(xiàn)進(jìn)程通信的目的
解決方案
使用標(biāo)準(zhǔn)庫(kù)中的 mmap 模塊的 mmap() 函數(shù),它需要一個(gè)打開(kāi)的文件描述符作為參數(shù)
創(chuàng)建如下文件
[root@iZ28i253je0Z ~]# dd if=/dev/zero of=demo.bin bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.00380084 s, 276 MB/s
# 以十六進(jìn)制格式查看文件內(nèi)容
[root@iZ28i253je0Z ~]# od -x demo.bin
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000
>>> import mmap
>>> import os
>>> f = open('demo.bin','r+b')
# 獲取文件描述符
>>> f.fileno()
3
>>> m = mmap.mmap(f.fileno(),0,access=mmap.ACCESS_WRITE)
>>> type(m)
<type 'mmap.mmap'>
# 可以通過(guò)索引獲取內(nèi)容
>>> m[0]
'\x00'
>>> m[10:20]
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
# 修改內(nèi)容
>>> m[0] = '\x88'
查看
[root@iZ28i253je0Z ~]# od -x demo.bin
0000000 0088 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000
修改切片
?
1
>>> m[4:8] = '\xff' * 4
查看
[root@iZ28i253je0Z ~]# od -x demo.bin
0000000 0088 0000 ffff ffff 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000
>>> m = mmap.mmap(f.fileno(),mmap.PAGESIZE * 8,access=mmap.ACCESS_WRITE,offset=mmap.PAGESIZE * 4)
>>> m[:0x1000] = '\xaa' * 0x1000
查看
[root@iZ28i253je0Z ~]# od -x demo.bin
0000000 0088 0000 ffff ffff 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
0040000 aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
*
0050000 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000
如何訪問(wèn)文件的狀態(tài)?
實(shí)際案例
在某些項(xiàng)目中,我們需要獲得文件狀態(tài),例如:
文件的類型(普通文件、目錄、符號(hào)鏈接、設(shè)備文件…)
文件的訪問(wèn)權(quán)限
文件的最后的訪問(wèn)/修改/節(jié)點(diǎn)狀態(tài)更改時(shí)間
普通文件的大小
…..
解決方案
當(dāng)前目錄有如下文件
[root@iZ28i253je0Z 2016-09-16]# ll
total 4
drwxr-xr-x 2 root root 4096 Sep 16 11:35 dirs
-rw-r--r-- 1 root root 0 Sep 16 11:35 files
lrwxrwxrwx 1 root root 37 Sep 16 11:36 lockfile -> /tmp/qtsingleapp-aegisG-46d2-lockfile
系統(tǒng)調(diào)用
標(biāo)準(zhǔn)庫(kù)中的os模塊下的三個(gè)系統(tǒng)調(diào)用 stat 、 fstat 、 lstat 獲取文件狀態(tài)
>>> import os
>>> s = os.stat('files')
>>> s
posix.stat_result(st_mode=33188, st_ino=267646, st_dev=51713L, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1473996947, st_mtime=1473996947, st_ctime=1473996947)
>>> s.st_mode
33188
>>> import stat
# stat有很多S_IS..方法來(lái)判斷文件的類型
>>> stat.S_ISDIR(s.st_mode)
False
# 普通文件
>>> stat.S_ISREG(s.st_mode)
True
獲取文件的訪問(wèn)權(quán)限,只要大于0就為真
>>> s.st_mode & stat.S_IRUSR
256
>>> s.st_mode & stat.S_IXGRP
0
>>> s.st_mode & stat.S_IXOTH
0
獲取文件的修改時(shí)間
# 訪問(wèn)時(shí)間
>>> s.st_atime
1473996947.3384445
# 修改時(shí)間
>>> s.st_mtime
1473996947.3384445
# 狀態(tài)更新時(shí)間
>>> s.st_ctime
1473996947.3384445
將獲取到的時(shí)間戳進(jìn)行轉(zhuǎn)換
>>> import time
>>> time.localtime(s.st_atime)
time.struct_time(tm_year=2016, tm_mon=9, tm_mday=16, tm_hour=11, tm_min=35, tm_sec=47, tm_wday=4, tm_yday=260, tm_isdst=0)
獲取普通文件的大小
>>> s.st_size
0
快捷函數(shù)
標(biāo)準(zhǔn)庫(kù)中 os.path 下的一些函數(shù),使用起來(lái)更加簡(jiǎn)潔
文件類型判斷
>>> os.path.isdir('dirs')
True
>>> os.path.islink('lockfile')
True
>>> os.path.isfile('files')
True
文件三個(gè)時(shí)間
>>> os.path.getatime('files')
1473996947.3384445
>>> os.path.getmtime('files')
1473996947.3384445
>>> os.path.getctime('files')
1473996947.3384445
獲取文件大小
>>> os.path.getsize('files')
0
如何使用臨時(shí)文件?
實(shí)際案例
某項(xiàng)目中,我們從傳感器采集數(shù)據(jù),每收集到1G數(shù)據(jù)后,做數(shù)據(jù)分析,最終只保存分析結(jié)果,這樣很大的臨時(shí)數(shù)據(jù)如果常駐內(nèi)存,將消耗大量?jī)?nèi)存資源,我們可以使用臨時(shí)文件存儲(chǔ)這些臨時(shí)數(shù)據(jù)(外部存儲(chǔ))
臨時(shí)文件不用命名,且關(guān)閉后會(huì)自動(dòng)被刪除
解決方案
使用標(biāo)準(zhǔn)庫(kù)中的 tempfile 下的 TemporaryFile, NamedTemporaryFile
>>> from tempfile import TemporaryFile, NamedTemporaryFile
# 訪問(wèn)的時(shí)候只能通過(guò)對(duì)象f來(lái)進(jìn)行訪問(wèn)
>>> f = TemporaryFile()
>>> f.write('abcdef' * 100000)
# 訪問(wèn)臨時(shí)數(shù)據(jù)
>>> f.seek(0)
>>> f.read(100)
'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd'
>>> ntf = NamedTemporaryFile()
# 如果要讓每次創(chuàng)建NamedTemporaryFile()對(duì)象時(shí)不刪除文件,可以設(shè)置NamedTemporaryFile(delete=False)
>>> ntf.name
# 返回當(dāng)前臨時(shí)文件在文件系統(tǒng)中的路徑
'/tmp/tmppNvBu2'
總結(jié)
以上就是關(guān)于Python中文件I/O高效處理技巧的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03