最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年02月04日 10:57:05   投稿:daisy  
文件I/O是Python中最重要的技術(shù)之一,在Python中對文件進(jìn)行I/O操作是非常簡單的。但如何高效的操作處理是需要技巧的,下面這篇文章就主要介紹了Python中文件I/O高效操作處理的技巧,需要的朋友可以參考借鑒,下面來一起看看吧。

如何讀寫文本文件?

實(shí)際案例

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

解決方案

字符串的語義發(fā)生了變化:

python2 python3
str bytes
unicode str

python2.x 寫入文件前對 unicode 編碼,讀入文件后對二進(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)容寫入到硬盤設(shè)備時(shí),使用系統(tǒng)調(diào)用,這類I/O操作的時(shí)間很長,為了減少I/O操作的次數(shù),文件通常使用緩沖區(qū)(有足夠多的數(shù)據(jù)才進(jìn)行系統(tǒng)調(diào)用),文件的緩存行為,分為全緩沖、行緩存、無緩沖。

如何設(shè)置Python中文件對象的緩沖行文?

解決方案

全緩沖: open 函數(shù)的 buffering 設(shè)置為大于1的整數(shù)n,n為緩沖區(qū)大小

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

行緩沖: open 函數(shù)的 buffering 設(shè)置為1

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

無緩沖: open 函數(shù)的 buffering 設(shè)置為0

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

如何將文件映射到內(nèi)存?

實(shí)際案例

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

解決方案

使用標(biāo)準(zhǔn)庫中的 mmap 模塊的 mmap() 函數(shù),它需要一個(gè)打開的文件描述符作為參數(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'>
# 可以通過索引獲取內(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

修改切片

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

如何訪問文件的狀態(tài)?

實(shí)際案例

在某些項(xiàng)目中,我們需要獲得文件狀態(tài),例如:

  • 文件的類型(普通文件、目錄、符號鏈接、設(shè)備文件…)
  • 文件的訪問權(quá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)庫中的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..方法來判斷文件的類型
>>> stat.S_ISDIR(s.st_mode)
False
# 普通文件
>>> stat.S_ISREG(s.st_mode)
True

獲取文件的訪問權(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í)間

# 訪問時(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)庫中 os.path 下的一些函數(shù),使用起來更加簡潔

文件類型判斷

>>> 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)存,將消耗大量內(nèi)存資源,我們可以使用臨時(shí)文件存儲這些臨時(shí)數(shù)據(jù)(外部存儲)

臨時(shí)文件不用命名,且關(guān)閉后會自動被刪除

解決方案

使用標(biāo)準(zhǔn)庫中的 tempfile 下的 TemporaryFile, NamedTemporaryFile

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

總結(jié)

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

相關(guān)文章

  • 淺談一下Python究竟屬不屬于嵌入式語言

    淺談一下Python究竟屬不屬于嵌入式語言

    這篇文章主要介紹了淺談一下Python究竟屬不屬于嵌入式語言,大家普遍的認(rèn)為C與C++才是標(biāo)準(zhǔn)的嵌入式語言,那么現(xiàn)在大火的Python算是一種嵌入式語言嗎,需要的朋友可以參考下
    2023-04-04
  • Python 實(shí)現(xiàn)局域網(wǎng)遠(yuǎn)程屏幕截圖案例

    Python 實(shí)現(xiàn)局域網(wǎng)遠(yuǎn)程屏幕截圖案例

    這篇文章主要介紹了Python 實(shí)現(xiàn)局域網(wǎng)遠(yuǎn)程屏幕截圖案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python numpy 一維數(shù)組轉(zhuǎn)變?yōu)槎嗑S數(shù)組的實(shí)例

    python numpy 一維數(shù)組轉(zhuǎn)變?yōu)槎嗑S數(shù)組的實(shí)例

    今天小編就為大家分享一篇python numpy 一維數(shù)組轉(zhuǎn)變?yōu)槎嗑S數(shù)組的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python爬蟲之爬取最新更新的小說網(wǎng)站

    Python爬蟲之爬取最新更新的小說網(wǎng)站

    這篇文章主要介紹了Python爬蟲之爬取最新更新的小說網(wǎng)站,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python爬蟲的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例

    python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例

    本文將會使用Python實(shí)現(xiàn)一個(gè)最簡單的RPC框架,不具有實(shí)用意義,但可以讓你清醒地理解RPC框架的幾個(gè)組成部分,只是比看Python自帶的xmlrpc清晰。
    2020-10-10
  • Python使用SciPy庫的插值方法及示例詳解

    Python使用SciPy庫的插值方法及示例詳解

    SciPy是一個(gè)基于NumPy構(gòu)建的Python模塊,它集成了多種數(shù)學(xué)算法和函數(shù),這篇文章主要為大家詳細(xì)介紹了如何使用SciPy庫實(shí)現(xiàn)插值,需要的可以了解下
    2024-03-03
  • python數(shù)據(jù)可視化Seaborn繪制山脊圖

    python數(shù)據(jù)可視化Seaborn繪制山脊圖

    這篇文章主要介紹了利用python數(shù)據(jù)可視化Seaborn繪制山脊圖,山脊圖一般由垂直堆疊的折線圖組成,這些折線圖中的折線區(qū)域間彼此重疊,此外它們還共享相同的x軸.下面來看看具體的繪制過程吧,需要的小伙伴可以參考一下
    2022-01-01
  • Python區(qū)塊鏈塊的添加教程

    Python區(qū)塊鏈塊的添加教程

    這篇文章主要為大家介紹了Python區(qū)塊鏈塊的添加教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python 如何利用pandas 和 matplotlib繪制柱狀圖

    Python 如何利用pandas 和 matplotlib繪制柱狀圖

    Python 中的 pandas 和 matplotlib 庫提供了豐富的功能,可以幫助你輕松地繪制各種類型的圖表,本文將介紹如何使用這兩個(gè)庫,繪制一個(gè)店鋪銷售數(shù)量的柱狀圖,并添加各種元素,如數(shù)據(jù)標(biāo)簽、圖例、網(wǎng)格線等,感興趣的朋友一起看看吧
    2023-10-10
  • python中查看變量內(nèi)存地址的方法

    python中查看變量內(nèi)存地址的方法

    這篇文章主要介紹了python中查看變量內(nèi)存地址的方法,涉及Python中id使用技巧,需要的朋友可以參考下
    2015-05-05

最新評論

威宁| 浠水县| 得荣县| 辽源市| 原平市| 甘孜县| 达孜县| 炉霍县| 神农架林区| 大安市| 天长市| 婺源县| 红桥区| 潜江市| 温州市| 镇坪县| 海南省| 灵丘县| 南宁市| 邹平县| 嘉峪关市| 呼图壁县| 碌曲县| 永泰县| 夹江县| 泰州市| 绥江县| 江永县| 山丹县| 莱芜市| 犍为县| 雷波县| 白沙| 宝坻区| 荣成市| 惠州市| 长海县| 义乌市| 泉州市| 漳州市| 马鞍山市|