路径操作&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.178linux.com/88166

(0)
Thunk_LeeThunk_Lee
上一篇 2017-10-30 20:00
下一篇 2017-10-30 20:16

相关推荐

  • iptables, sudo N28

    2018/2/25 17:14 第十二周

    2018-02-25
  • Linux Basics–part4

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限 ~]# cp -rf /etc/skel/ /home/tuser1 && chmod -R go=— /home/tuser1 [root@ronny1 ~]# ll -d /home/tuser…

    Linux干货 2017-08-07
  • DNS常用配置解析反向解析

    什么是域名解析库文件?     是指将我们访问的域名解析成IP返回给本主机,然后本机拿着解析后IP去访问服务器,而解析格式就放在域名解析库文件中。DNS解析分为正向解析和反向解析    正向解析就是将域或域名解析成对应的IP地址,反之则相反,通过IP解析成域名 &nbs…

    Linux干货 2017-05-31
  • Linux进程与计划任务

    Linux进程与计划任务 linux进程及作业管理 进程 内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等特权操作模式切换(理想状态):70%CPU时间用户模式+30%CPU时间内核模式进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的存在生命周期的基本单位,是操作系统结构的基础。在早期…

    Linux干货 2016-09-23
  • Redhat的Linux产品版本AS/ES/WS的联系与区别

    Redhat 有两大Linux产品系列,其一是免费的Fedora Core系列主要用于桌面版本,提供了较多新特性的支持。另外一个产品系列是收费的Enterprise系列,这个系列分成:AS/ES/WS等分支,他 们都是redhat企业级Linux,简称为 RHEL AS 是超级服务器版(Advanced Server),他在标准Linux内核的基础上,做了性…

    Linux干货 2015-03-20
  • web service之http协议

    一.概述 1.web应用的核心是http协议(HyperText Transfer Protocol),http协议的由两部分组成,客户端程序和服务器端程序,通过交换http报文进行会话。web页面则是由对象(也叫资源)组成的,对象直白的说就是一个个的文件,而这些对象可以通过URL引用,URL由两部分组成,存放对象的主机名和对象的文件路径,而这些对象都存储在…

    Linux干货 2016-11-03