路径操作&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

相关推荐

  • 博客作业网络班22期+第4周(8.29-9.4)

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 #  ls /home/tuser1 || mkdir /home/tuser1 && cp -R /etc/skel/*  /home/tuser1 && ch…

    Linux干货 2016-09-07
  • ansible 入门与进阶

    ansible 入门与进阶 Configuration、Command and Control 是什么 ? SSH-based configuration management, deployment, and task execution system 运维工具的分类: agent:基于专用的agent程序完成管理功能,puppet, func, zabb…

    2016-11-09
  • wk_02 作业

    Linux 文件管理命令 cp命令 功能 Linux 系统中cp命令是用来复制目录/文件的。 概要 单源复制 cp [OPTION]… [-T] SOURCE DEST DEST不存在则事先创建此文件,并复制源文件的数据流至DEST中; DEST存在 DEST是非目录文件:则覆盖目标文件; DEST是目录文件:则先…

    Linux干货 2016-12-11
  • 权限管理

    权限 权限就是用户或者组对文件或者目录所拥有的能力,所能执行的操作。 权限的分配: 通过ls -l file这个命令可以查看文件或者目录的详细信息:     [root@localhost home]# ls -l /root/   &nb…

    Linux干货 2016-08-05
  • keepalived的初级使用

        1、双主模型的ipvs高可用   一、双主模型的ipvs高可用     1)网络结构图       2)、ipvs的类型是dr模型,调度算法是rr       RS1和RS2都是centos6.8 对RS1和RS2的配置:…

    Linux干货 2017-05-15
  • BASH编程基础之变量、条件判断

    一、前言 在linux中,通常我们所指的脚本编程,指的是bash的脚本编程。 bash作为一种过程式的编程语言来说,它应该具备编程语言所应该具备的基本元素,即:变量,流程,函数,数组。今天我们介绍变量以及流程之一的条件判断。 二、变量 1、初识变量 在编程语言中,编程语言有两大种,强类型语言和弱类型语言。强类型语言中,要求变量的使用要严格符合定义,所有变量都…

    Linux干货 2015-07-06