路徑操作&StringIO/BytesIO

路徑操作&StringIO/BytesIO

路徑操作
  • 路徑操作模塊:
  • 3.4版本以前os.path模塊
In [1]: from os import path
In [2]: p = path.join(‘/etc’,’sysconfig’,’network’)#將字符串連接成路徑
In [3]: print(type(p),p)
<class ‘str’> /etc/sysconfig/network#字符串類
In [4]: print(path.exists(p))#判斷路徑是否存在
True
In [5]: print(path.split(p))#head,tail
(‘/etc/sysconfig’, ‘network’)
In [7]: print(path.abspath(‘.’))#當前路徑
/home/python/project/Thunk
In [8]: p = path.join(‘o:/’,p,’test.txt’)#如果出現兩個/根則后面生效
In [9]: p
Out[9]: ‘/etc/sysconfig/network/test.txt’
In [10]: print(path.dirname(p))#顯示路徑名
/etc/sysconfig/network
In [11]: print(path.basename(p))#顯示文件名
test.txt
In [12]: print(path.splitdrive(p))#驅動器
(”, ‘/etc/sysconfig/network/test.txt’)
  • 3.4版本開始,建議使用pathlib模塊,提供Path對象來操作。包括目錄和文件
  • pathlib模塊:
In [13]: from pathlib import Path
In [14]: p = Path()#當前目錄
In [15]: p
Out[15]: PosixPath(‘.’)
In [16]: print(p)
.
In [17]: p = Path(‘a’,’b’,’c/d’)#當前目錄下的a/b/c/d
In [18]: p
Out[18]: PosixPath(‘a/b/c/d’)
In [19]: p = Path(‘/etc’)#根下的etc目錄
In [20]: p
Out[20]: PosixPath(‘/etc’)
  • 路徑拼接和分解
  • 操作符/
    • Path對象/Path對象
    • Path對象/字符串或者字符串/Path對象?
  • 分解:
    • parts屬性,可以返回路徑中的每一個部分
  • joinpath:
    • joinpath(*other)連接多個字符串到Path對象中
#舉例
In [21]: p = Path()
In [22]: p = p / ‘a’#當前路勁下的a
In [23]: p
Out[23]: PosixPath(‘a’)
In [24]: p1 = ‘b’ / p#當前路徑下的b下的a
In [25]: p1
Out[25]: PosixPath(‘b/a’)
In [26]: p2 = Path(‘c’)
In [27]: p3 = p2 / p1
In [28]: print(p3.parts)#返回路徑中的每一個部分
(‘c’, ‘b’, ‘a’)
In [29]: p3
Out[29]: PosixPath(‘c/b/a’)
In [30]: p3.joinpath(‘etc’,’init.d’,Path(‘httpd’))#拼接路徑
Out[30]: PosixPath(‘c/b/a/etc/init.d/httpd’)
  • 獲取路徑
  • str獲取路徑字符串
  • bytes獲取路徑字符串的bytes
In [31]: p = Path(‘/etc’)
In [32]: print(str(p),bytes(p))
/etc b’/etc’
  • 父目錄
  • parent目錄的邏輯父目錄
  • parents父目錄序列,索引0是直接父目錄
In [33]: p = Path(‘a/b/c/d’)
In [34]: print(p.parent.parent)#一個parent代表a/b/c
a/b
In [35]: for x in p.parents:
…: print(x)
…:
a/b/c
a/b
a
.
  • name目錄的最后一個部分
  • suffix目錄中最后一個部分的擴展名
  • stem目錄最后一個部分,沒有后綴
  • suffixes返回多個擴展名列表
  • with_suffix(suffix)補充擴展名到路徑尾部,返回新的路徑,擴展名存在則無效
  • with_name(name)替換目錄后最后一個部分并返回一個新的路徑
#舉例:
In [38]: p = Path(‘/magedu/mysqlinstall/mysql.tar.gz’)
In [39]: print(p.name)
mysql.tar.gz
In [40]: print(p.suffix)
.gz
In [41]: print(p.suffixes)
[‘.tar’, ‘.gz’]
In [42]: print(p.stem)
mysql.tar
In [43]: print(p.with_name(‘mysql-5.tgz’))#替換目錄最后一部分,返回新路徑
/magedu/mysqlinstall/mysql-5.tgz
In [44]: print(p.with_suffix(‘.txt’))#補充擴展名到路徑尾部,如果相同則不操作,返回新路徑
/magedu/mysqlinstall/mysql.tar.txt
  • cwd()返回當前工作目錄
  • home()返回當前家目錄
  • is_dir()是否是目錄
  • is_file()是否是普通文件
  • is_symlink()是否是軟連接
  • is_socket()是否是socket文件
  • is_block_device()是否是塊設備
  • is_char_device()是否是字符設備
  • is_absolute()是否是絕對路徑
  • resolve()返回一個新路徑,這個新路徑就是當前Path對象的絕對路徑,如果軟鏈接直接被解析
  • absolute()也可以獲取絕對路徑,但是推薦使用resolve()
  • exists()目錄或文件是否存在
  • rmdir()刪除空目錄,沒有提供判斷目錄為空的方法
  • touch(mode=0o666,exist_ok=Ture)創建一個文件
  • as_uri()將路徑返回成URI,例如‘file:///etc/passwd’
  • mkdir(mode=0o777,parents=False,exist_ok=False)#parents是否創建父目錄,True等同于mkdir -p;父目錄不存在,則拋出FileNotFoundError。exist_ok在3.5加入,False時路徑存在拋出FileExistsError;True時,FileExistsError被忽略
  • iterdir()迭代當前目錄
#判斷目錄或文件是否存在
In [11]: p /= “a/b/c/d”
In [13]: p
Out[13]: PosixPath(‘a/b/c/d’)
In [14]: p.exists()
Out[14]: False
#創建目錄并判斷,無法創建父目錄。
In [15]: p.mkdir()
In [16]: p.exists()
Out[16]: True
#創建父目錄及子目錄,類似于mkdir -p
In [19]: p.mkdir(parents=True)
#exist_ok False時,路徑存在拋出FileExistsErros,True錯誤被忽略
In [20]: p.mkdir(parents=True,exist_ok=True)
In [21]: p.mkdir(parents=True,exist_ok=False)
—————————————————————————
FileExistsError Traceback (most recent call last)
<ipython-input-21-381fb58ad25b> in <module>()
—-> 1 p.mkdir(parents=True,exist_ok=False)
~/.pyenv/versions/3.5.3/lib/python3.5/pathlib.py in mkdir(self, mode, parents, exist_ok)
1218 else:
1219 try:
-> 1220 self._accessor.mkdir(self, mode)
1221 except FileExistsError:
1222 if not exist_ok or not self.is_dir():
~/.pyenv/versions/3.5.3/lib/python3.5/pathlib.py in wrapped(pathobj, *args)
369 @functools.wraps(strfunc)
370 def wrapped(pathobj, *args):
–> 371 return strfunc(str(pathobj), *args)
372 return staticmethod(wrapped)
373
FileExistsError: [Errno 17] File exists: ‘a/b/c/d’
#rmdir()刪除空目錄
In [33]: p3 = Path(‘d’)
In [34]: p3.mkdir()#創建空目錄
In [35]: p3.exists()#存在性判斷
Out[35]: True
In [36]: p3.rmdir()#刪除空目錄
In [37]: p3.exists()
Out[37]: False
#迭代目錄
In [38]: p
Out[38]: PosixPath(‘a/b/c/d/readme.txt’)
In [39]: for x in p.parents[len(p.parents)-1].iterdir():#中括號為索引
…: print(x,end=’\t’)
…: if x.is_dir():
…: flag = False
…: for _ in x.iterdir():
…: flag = True
…: break
…: print(‘dir’,’Not Empty’ if flag else ‘Empyt’,sep=’\t’)
…: elif x.is_file():
…: print(‘file’)
…: else:
…: print(‘other file’)
通配符
  • glob(pattern)通配符給定模式
  • rglob(pattern)通配符給定模式,遞歸目錄
In [77]: p
Out[77]: PosixPath(‘.’)
In [78]: list(p.glob(‘*.py’))#只匹配當前路徑
[PosixPath(‘test.py’),
PosixPath(‘sushu.py’),
PosixPath(‘lx2.py’),
PosixPath(‘lx.py’),
PosixPath(‘fang.py’),
PosixPath(‘123.py’)]
In [80]: list(p.rglob(‘*.py’))#匹配下層所有目錄
[PosixPath(‘test.py’),
PosixPath(‘sushu.py’),
PosixPath(‘lx2.py’),
PosixPath(‘lx.py’),
PosixPath(‘fang.py’),
PosixPath(‘123.py’),
PosixPath(‘a/a.py’),
PosixPath(‘a/b.py’),
PosixPath(‘a/b/b.py’),
PosixPath(‘a/b/c/c.py’)]
匹配
  • match(pattern)匹配模式,成功返回True
In [85]: Path(‘a/b.py’).match(‘*.py’)
Out[85]: True
In [86]: Path(‘a/b/c/c.py’).match(‘b/*.py’)
Out[86]: False
In [87]: Path(‘a/b/c/c.py’).match(‘a/b/c/*.py’)
Out[87]: True
文件操作
  • open(mode=’r’,buffering=-1,encoding=None,errors=None,newline=None)
    • 使用方法類似于內建函數open。返回一個文件對象
  • 3.5增加新函數:
  • read_bytes():以rb讀取路徑對應文件,并返回二進制流,看源碼
  • read_text(encoding=None,errors=None):以rt方式讀取路徑對應文件,返回文本
  • Path.write_bytes(data):以wb方式寫入數據到路徑對應文件
  • write_text(date,encoding=None,errors=None):以wt方式寫入字符串到路徑對應文件
In [88]: p = Path(‘my_binary_file’)
In [89]: p
Out[89]: PosixPath(‘my_binary_file’)
In [90]: p.write_bytes(b’abc’)
Out[90]: 3
In [91]: p.read_bytes()
Out[91]: b’abc’
In [92]: p = Path(‘my_text_file’)
In [93]: p.write_text(‘Text file contents’)
Out[93]: 18
In [94]: p.read_text()
Out[94]: ‘Text file contents’
StringIO
  • io模塊中的類:from io import StringIO
  • 內存中,開辟的一個文本模式buffer,可以像文件對象一樣操作它
  • 當close方法被調用的時候,這個buffer會被釋放
  • getvalue()獲取全部去內容,跟文件指針沒有關系
In [114]: from io import StringIO
In [115]: sio = StringIO()
In [117]: print(sio.readable(),sio.writable(),sio.seekable())
True True True
In [118]: sio.write(‘kanggedu\nPython’)
Out[118]: 15
In [120]: sio.seek(0)
Out[120]: 0
In [121]: print(sio.readline())
kanggedu
In [122]: print(sio.getvalue())#此時獲取全部數據,故不受指針影響
kanggedu
Python
In [123]: sio.close()#關閉即釋放內存
  • 好處:一般來說,磁盤的操作比內存操作要慢的多,內存足夠的時候一般的優化思路是少落地,減少磁盤IO的過程,可以大大提高程序的運行效率
  • io模塊中的類 from io import BytesIO
  • 內存中,開辟的一個二進制模式的buffer,可以像文件對象一樣操作它
  • 當close方法被調用的時候,這個buffer會被釋放。同上例
  • file-like對象:類文件對象,可以像文件對象一樣操作
  • socket對象,輸入輸出對象(stdin、stdout)都是類文件對象
In [124]: from sys import stdout
In [125]: f = stdout
In [126]: print(type(f))
<class ‘colorama.ansitowin32.StreamWrapper’>
In [127]: f.write(‘magedu.com’)
magedu.com
In [128]:

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88166

(0)
Thunk_LeeThunk_Lee
上一篇 2017-10-30
下一篇 2017-10-30

相關推薦

  • 網絡配置詳解(一)

    Linux網絡屬性配置      ifcfg命令家族:ifconfig, route, netstat      ifconfig命令:      ifconfig [INTERFACE]      # ifconfig -a 顯示所有接口…

    Linux干貨 2017-01-02
  • Linux系統啟動流程簡介

    centos系統啟動流程 本篇僅僅講解centos5和6 centos7并不適用 Linux系統的組成部分:內核+根文件系統 內核功能: 進程管理 內存管理 網絡管理 驅動程序 文件系統 安全功能 有以下目錄結構的文件系統可以被識別為根文件系統,但根文件系統本身不存在 rootfs:/bin/ /sbin /etc/ /sys/…

    Linux干貨 2016-09-10
  • Nginx/LVS/HAProxy負載均衡軟件優缺點總結

    Nginx/LVS/HAProxy簡單介紹:   Nginx:專為性能優化而開發,性能是其最重要的考量,實現上非常注重效率 。它支持內核Poll模型,能經受高負載的考驗,有報告表明能支持高達 50,000個并發連接數。 LVS:使用Linux內核集群實現一個高性能、高可用的負載均衡服務器,具有很好的可伸縮性(Scalability)、可靠性(Rel…

    2017-06-24
  • LVM——如何讓你的磁盤空間可大可小

    邏輯卷管理器(LVM) 允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小 允許在多個物理設備間重新組織文件系統          將設備指定為物理卷          用一個或者多個物理卷來創…

    Linux干貨 2016-08-29
  • python分支循環和列表

    if語句 if condition: 代碼塊 condition必須是一個bool類型,這個地方有一個隱式轉換bool(condition) if 1<2: print(‘1 less than 2’)   循環——while語句 while condition: block 當條件滿足即condition為True,…

    2018-03-27
  • LVM2詳解

    1、什么是lvm LVM是邏輯卷管理(Logical Volume Manager)的簡稱,它是建立在物理存儲設備之上的一個抽象層,允許你生成邏輯存儲卷,與直接使用物理存儲在管理上相比,提供了更好靈活性。LVM將存儲虛擬化,使用邏輯卷,你不會受限于物理磁盤的大小,另外,與硬件相關的存儲設置被其隱藏,你可以不用停止應用或卸載文件系統來調整卷大小或數據遷移.這樣…

    Linux干貨 2017-01-03
欧美性久久久久