路径操作&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)
上一篇 2017-10-30 20:00
下一篇 2017-10-30 20:16

相关推荐

  • Linux下vim编辑器的使用

    vim编辑器 概括 vim,是vi的升级版本,它不仅兼容vi的所有指令,还有一些新的特性在里面。 使用vi和vim的三种主要模式 vim在工作过程当中有三种模式,编辑模式(命令模式)、输入模式、末行模式     1、编辑模式:也叫命令模式,键盘操作常被理解为编辑命令;     2…

    Linux干货 2016-08-10
  • N22-妙手-第五周博客作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost grub]# grep "^[[:space:]]\+" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,…

    Linux干货 2016-09-19
  • sed工具 介绍

    sed工具 地址定界 不给地址:对全文进行处理 单地址: #:指定行 /pattern/:被此处模式所能够匹配到的每一行 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/ ~:步进 1~2 奇树行 2~2 偶数行 cat -n passwd >passwd2 新建文件 sep -n ‘/^h//^s/’…

    Linux干货 2017-05-31
  • DNS 笔记

    Ø DNS查询。工作流程如下图         n  客户端的DNS:8.8.8.8 /etc/hosts  14.215.177.38 www.baidu.com n  客户端访问www.baidu.com 不用向DSN服务器发生查询,只需要查询本地的 /e…

    Linux干货 2016-08-15
  • 马哥教育网络21期+第一周练习博客

    一、描述计算机的组成及其功能。   计算机设备是由运算器、控制器、存储器、输入设备和输出设备组成。它们的功能和对应设备分别如下: 运算器(arithmetic unit):在计算机中执行各种算术和逻辑运算操作的部件。运算器包括寄存器、执行部件和控制电路3个部      &nbsp…

    Linux干货 2016-07-12
  • Linux磁盘管理(一)之分区、格式化、挂载使用

    磁盘管理(一)   本章节内容: 磁盘结构 分区类型   管理分区   管理文件系统   挂载设备   一、磁盘结构: 1、设备号码:  主设备号:major number, 标识设备类型 次设备号:minor number, 标识同一类型下的不同设备  &n…

    Linux干货 2016-08-26