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

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1706 0

如何讀寫文本文件?

實際案例

某文本文件編碼格式已直(如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=1024
1024+0 records in
1024+0 records out
1048576 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)

            
              
# 可以通過索引獲取內容
>>> 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 0000
0000020 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 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
          

如何訪問文件的狀態?

實際案例

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

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

解決方案

當前目錄有如下文件

            
[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
          

系統調用

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

            
>>> 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..方法來判斷文件的類型
>>> stat.S_ISDIR(s.st_mode)
False
# 普通文件
>>> stat.S_ISREG(s.st_mode)
True
          

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

            
>>> s.st_mode & stat.S_IRUSR
256
>>> s.st_mode & stat.S_IXGRP
0
>>> s.st_mode & stat.S_IXOTH
0
          

獲取文件的修改時間

            
# 訪問時間
>>> s.st_atime
1473996947.3384445
# 修改時間
>>> s.st_mtime
1473996947.3384445
# 狀態更新時間
>>> s.st_ctime
1473996947.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_size
0
          

快捷函數

標準庫中 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高效處理技巧的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美成人xx免费视频 | 欧美成人久久久免费播放 | 鲁丝丝国产一区二区 | 99久热| 久久免费精品视频 | 婷婷综合国产激情在线 | 久久国产乱子伦免费精品 | 日韩一二区 | 99er热久久精品中文字幕 | 中文字幕久久综合伊人 | 九九自拍视频 | 九九精品免费观看在线 | 色多网站免费视频 | 亚洲欧美亚洲 | 天天cao在线 | 中国一级特黄aa毛片大片 | 欧美激情社区 | 欧美日韩亚洲精品国产色 | 91精品国产高清久久久久 | 成年女人毛片免费播放人 | 欧美jizzhd精品欧美另类 | 日韩欧美亚洲综合一区二区 | 久久综合噜噜激激的五月天 | 日韩亚洲欧美在线观看 | 日韩免费视频一区二区 | 欧做爰xxxⅹ性欧美图片 | 成人爽a毛片在线视频网站 成人爽视频 | 国产香蕉98碰碰久久人人 | 久久亚洲国产最新网站 | 国产精品一 | 九九视频在线播放 | 91精品国产91久久久久久青草 | www.天天操| 久久夜色精品国产欧美 | 九九久久久久久久爱 | 国产精品免费久久久免费 | www日日日 | 欧美成人老熟妇暴潮毛片 | 国产嘿咻 | 国产精品18久久久久久小说 | 日本不卡高清免费v |