国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中文件I/O高效操作處理的技巧分享

2019-11-25 16:22:35
字體:
來源:轉載
供稿:網友

如何讀寫文本文件?

實際案例

某文本文件編碼格式已直(如UTF-8,GBK,BIG5),在python2.x和python3.x中分別如何讀取這些文件?

解決方案

字符串的語義發生了變化:

python2 python3
str bytes
unicode str

python2.x 寫入文件前對 unicode 編碼,讀入文件后對二進制字符串解碼

>>> 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 函數指定 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'你好'

如何設置文件的緩沖

實際案例

將文件內容寫入到硬盤設備時,使用系統調用,這類I/O操作的時間很長,為了減少I/O操作的次數,文件通常使用緩沖區(有足夠多的數據才進行系統調用),文件的緩存行為,分為全緩沖、行緩存、無緩沖。

如何設置Python中文件對象的緩沖行文?

解決方案

全緩沖: open 函數的 buffering 設置為大于1的整數n,n為緩沖區大小

>>> f = open('demo2.txt', 'w', buffering=2048)>>> f.write('+' * 1024)>>> f.write('+' * 1023)# 大于2048的時候就寫入文件>>> f.write('-' * 2)>>> f.close()

行緩沖: open 函數的 buffering 設置為1

>>> f = open('demo3.txt', 'w', buffering=1)>>> f.write('abcd')>>> f.write('1234')# 只要加上/n就寫入文件中>>> f.write('/n')>>> f.close()

無緩沖: open 函數的 buffering 設置為0

>>> f = open('demo4.txt', 'w', buffering=0)>>> f.write('a')>>> f.write('b')>>> f.close()

如何將文件映射到內存?

實際案例

  1. 在訪問某些二進制文件時,希望能把文件映射到內存中,可以實現隨機訪問.(framebuffer設備文件)
  2. 某些嵌入式設備,寄存器唄編址到內存地址空間,我們可以映射 /dev/mem 某范圍,去訪問這些寄存器
  3. 如果多個進程映射到同一個文件,還能實現進程通信的目的

解決方案

使用標準庫中的 mmap 模塊的 mmap() 函數,它需要一個打開的文件描述符作為參數

創建如下文件

[root@iZ28i253je0Z ~]# dd if=/dev/zero of=demo.bin bs=1024 count=10241024+0 records in1024+0 records out1048576 bytes (1.0 MB) copied, 0.00380084 s, 276 MB/s# 以十六進制格式查看文件內容[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'># 可以通過索引獲取內容>>> m[0]'/x00'>>> m[10:20]'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'# 修改內容>>> m[0] = '/x88'

查看

[root@iZ28i253je0Z ~]# od -x demo.bin 0000000 0088 0000 0000 0000 0000 0000 0000 00000000020 0000 0000 0000 0000 0000 0000 0000 0000*4000000

修改切片

>>> m[4:8] = '/xff' * 4

查看

[root@iZ28i253je0Z ~]# od -x demo.bin 0000000 0088 0000 ffff ffff 0000 0000 0000 00000000020 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 00000000020 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

如何訪問文件的狀態?

實際案例

在某些項目中,我們需要獲得文件狀態,例如:

  • 文件的類型(普通文件、目錄、符號鏈接、設備文件…)
  • 文件的訪問權限
  • 文件的最后的訪問/修改/節點狀態更改時間
  • 普通文件的大小
  • …..

解決方案

當前目錄有如下文件

[root@iZ28i253je0Z 2016-09-16]# lltotal 4drwxr-xr-x 2 root root 4096 Sep 16 11:35 dirs-rw-r--r-- 1 root root 0 Sep 16 11:35 fileslrwxrwxrwx 1 root root 37 Sep 16 11:36 lockfile -> /tmp/qtsingleapp-aegisG-46d2-lockfile

系統調用

標準庫中的os模塊下的三個系統調用 stat 、 fstat 、 lstat 獲取文件狀態

>>> import os>>> s = os.stat('files')>>> sposix.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_mode33188>>> import stat# stat有很多S_IS..方法來判斷文件的類型>>> stat.S_ISDIR(s.st_mode)False# 普通文件>>> stat.S_ISREG(s.st_mode)True

獲取文件的訪問權限,只要大于0就為真

>>> s.st_mode & stat.S_IRUSR256>>> s.st_mode & stat.S_IXGRP0>>> s.st_mode & stat.S_IXOTH0

獲取文件的修改時間

# 訪問時間>>> s.st_atime1473996947.3384445# 修改時間>>> s.st_mtime1473996947.3384445# 狀態更新時間>>> s.st_ctime1473996947.3384445

將獲取到的時間戳進行轉換

>>> 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_size0

快捷函數

標準庫中 os.path 下的一些函數,使用起來更加簡潔

文件類型判斷

>>> os.path.isdir('dirs') True>>> os.path.islink('lockfile')True>>> os.path.isfile('files') True

文件三個時間

>>> os.path.getatime('files')1473996947.3384445>>> os.path.getmtime('files')1473996947.3384445>>> os.path.getctime('files')1473996947.3384445

獲取文件大小

>>> os.path.getsize('files') 0

如何使用臨時文件?

實際案例

某項目中,我們從傳感器采集數據,每收集到1G數據后,做數據分析,最終只保存分析結果,這樣很大的臨時數據如果常駐內存,將消耗大量內存資源,我們可以使用臨時文件存儲這些臨時數據(外部存儲)

臨時文件不用命名,且關閉后會自動被刪除

解決方案

使用標準庫中的 tempfile 下的 TemporaryFile, NamedTemporaryFile

>>> from tempfile import TemporaryFile, NamedTemporaryFile# 訪問的時候只能通過對象f來進行訪問>>> f = TemporaryFile()>>> f.write('abcdef' * 100000)# 訪問臨時數據>>> f.seek(0)>>> f.read(100)'abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd'
>>> ntf = NamedTemporaryFile()# 如果要讓每次創建NamedTemporaryFile()對象時不刪除文件,可以設置NamedTemporaryFile(delete=False)>>> ntf.name# 返回當前臨時文件在文件系統中的路徑'/tmp/tmppNvBu2'

總結

以上就是關于Python中文件I/O高效處理技巧的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 腾冲县| 鲁山县| 若尔盖县| 武义县| 买车| 筠连县| 都兰县| 来宾市| 宝鸡市| 弥渡县| 杭锦旗| 成安县| 商丘市| 天台县| 山丹县| 华阴市| 玉山县| 肥乡县| 泰安市| 绥阳县| 英德市| 浦江县| 双牌县| 邢台市| 长宁县| 兴宁市| 留坝县| 都匀市| 澄城县| 壤塘县| 剑河县| 镇雄县| 宜章县| 四会市| 英德市| 玛纳斯县| 寿阳县| 松潘县| 梁河县| 宜宾市| 堆龙德庆县|