路径操作&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
下一篇 2017-10-30

相关推荐

  • 虚拟化技术介绍、Xen的简单实现

    虚拟化是什么? 虚拟化是一种资源管理技术, 是将计算机的各实体资源, 如服务、网络、内存及存储等, 予以抽象、转换后呈现出来, 打破实体之间的不可切割的障碍, 使用户可以比原本的配置更好的方式来应用这些资源。这些资源的新虚拟部分是不受现有资源的架设方式, 地域或物理配置所限制。一般情况下, 虚拟化资源包括计算能力和数据存储 —<转自维基百科&…

    2016-05-31
  • 条件选择if 条件判断case 文件查找 find locate 以及压缩和解压缩工具

    1 shell脚本编程之 条件选择if 条件判断case  2 文件查找 find locate 以及压缩和解压缩工具 过程式编程语言:  顺序执行  选择执行  循环执行 条件选择之 if语句 选择执行:   注意:if语句可嵌套    单分支 if 判断条件:then 条件为真的分…

    Linux干货 2016-08-15
  • day5总结笔记

    本文内容: 索引节点 硬链接与软链接 重定向 用户组 useradd命令 索引节点: 索引节点包含了一个表,包含了有关文件的元数据,包含:     文件类型,权限,UID,GID 链接数(指向这个文件名路径名称个数)      该文件的大小和不同的时间戳。&n…

    系统运维 2016-08-08
  • 搭建SSH服务器

    Linux 远程登录服务:sshSSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全性。SSH提供了口令和密钥两种用户验证方式,这两者都是通过密文传输数据的。不同的是,口令用户验证方式传输的是用户的账户名和密码,这要求输入的…

    Linux干货 2017-07-24
  • 实现基于MYSQL验证的vsftpd虚拟用户

    马哥教育面授21期 运维 vsftpd MySQL 说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器 一、安装所需要包和包组: 在数据库服务器上安装包: yum –y install mariadb-server mariadb-devel systemctl start mariad…

    Linux干货 2016-12-21
  • N25-第15周博客作业

    1、总结sed和awk的详细用法; sed [OPTION]…  ‘script’  [input-file] … script: 地址定界编辑命令 常用选项: -n:不输出模式空间中的内容至屏幕; -e script, –expression=script:多点编辑;…

    Linux干货 2017-05-21