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