Python全栈工程师

21.3-StringIO和BytesIO和os.path

2019-10-09  本文已影响0人  BeautifulSoulpy

自由从何而来?从自信来,而自信则是从自律来。

先学会克制自己,用严格的日程表控制生活,才能在这种自律中不断磨练出自信。都是成年人,连最基本的行为控制都做不到,还谈什么自信,又奢谈什么自由?

Python 中有着非常多“类文件对象”。比如 io 模块内的 StringIO 对象就是其中之一。它是一种基于内存的特殊对象,拥有和文件对象几乎一致的接口设计。

StringIO

很多时候,数据读写不一定是文件,也可以在内存中读写。
StringIO顾名思义就是在内存中读写str, 能缓存则缓存,分批操作可以大大提高程序运行效率;
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

from io import StringIO
from io import BytesIO

# 内存中的一段区域;
tio = StringIO()

#tio = BytesIO()

tio
#-----------------
<_io.StringIO at 0x1a2957e5678>

tio.write('abcde\nxyz')
tio.readable(),tio.writable(),tio.seekable()
#--------------------------------------------------------------
(True, True, True)

tio.seek(0)

tio.read()
print('-----------------')
tio.getvalue()
#-------------------------------------------------
-----------------
'abcde\nxyz'

tio.fileno()  # 存在内存中,在硬盘中没有存贮
UnsupportedOperation: fileno

tio.closed
#----------------------------
False

总结:

  1. 内存中,StringIO开辟的一个文本模式的buffer, 可以像文件对象一样操作它;
  2. 当close方法被调用的时候,这个buffer会被释放;
  3. getvalue()获取全部内容,跟文件指针没有关系;

BytesIO

总结:

  1. 内存中, BytesIO 开辟的一个二进制模式的buffer, 可以像文件对象一样操作它;
  2. 当close方法被调用的时候,这个buffer会被释放;
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from io import BytesIO
# BytesIO IO 写入
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())

# BytesIO IO 读取
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87',)
print(f.read())
#-----------------------------------------------------------------------------------------------
b'\xe4\xb8\xad\xe6\x96\x87'
b'\xe4\xb8\xad\xe6\x96\x87'

file-like Object

类文件对象,可以像文件对象一样操作;

file-like Object 是典型的鸭子类型,open方法返回的是包括read()函数的对象,我们将包括read()对象的类统称为file-like Object,所以除了file之外,内存的字节流,网络流,自定义流只要有read()函数都可以成为file-like Object,而不用遵循继承规则。

from sys import stdout,stderr

f = stdout
print(type(f))
f.write('magedu.com')
#----------------------------------------
<class 'ipykernel.iostream.OutStream'>
magedu.com

sys\os 标准输入、输出、错误输出

os 与sys模块的官方解释如下:

操作系统:
该模块提供了使用依赖于操作系统的功能的便携式方法。

这个模块提供了一种方便的使用操作系统函数的方法。
系统相关的信息模块 import sys
sys.stdout标准输出
sys.stdin标准输入
sys.stderr错误输出
sys.stdin.readline() 从标准输入读一行
sys.stdout.write("a") 屏幕输出a
sys.exit(exit_code) 退出程序
sys.modules 是一个dictionary,表示系统中所有可用的module
sys.platform 得到运行的操作系统环境
sys.path 是一个list,指明所有查找module,package的路径.

sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于替换python的运行时环境。

from sys import stdout,stderr,stdin

f = stdout
print(str(f))  # stdout.write(str(f)+ '\n')
f.write('abcde')
print()

print('123')
stderr.write('xyz')
print(stderr)

print(stdin.seekable())
#---------------------------------------------------------
<ipykernel.iostream.OutStream object at 0x000001A293EC22E8>
abcde
123
<ipykernel.iostream.OutStream object at 0x000001A293EC26A0>
True
xyz

os.path(3.4之前)

路径:Unix路径与Windows路径
将Unix路径转换成Windows路径:

os 操作
os.path.split(path) 将path分割成目录和文件名并以元组返回
os.path.splittext(path) 将path分割成目录+文件名和文件的后缀,并以元组返回
os.path.join(path) 用于路径拼接,将多个路径组合后返回
os.path.dirname(path) 获取当前的目录
os.path.realpath(_file_) 获取文件所在完整路径
os.path.abspath('.') 找linux根或盘符win
os.mkdir(path) 创建一个路径。

from os import path 
p = path.join('/etc','adv','mmn')
p
#------------------------------------
'/etc\\adv\\mmn'              # win和linux的路径分割符是不一样的;

# 逐级 打印目录名称 ;
from os import path
p1 = path.abspath('text.py')

print(p1,path.basename(p1))
while p1 != path.dirname(p1):
    p1 = path.dirname(p1)
    print(p1,path.basename(p1))
#--------------------------------------------------
C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作\text.py text.py
C:\Users\Administrator\Desktop\mage_edu\21 Python文件IO(二)文件操作 21 Python文件IO(二)文件操作
C:\Users\Administrator\Desktop\mage_edu mage_edu
C:\Users\Administrator\Desktop Desktop
C:\Users\Administrator Administrator
C:\Users Users
C:\ 

os模块的system方法

system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。

>>> import os
>>> os.system("echo \"Hello World\"")   # 直接使用os.system调用一个echo命令
Hello World         ——————> 打印命令结果
0                   ——————> What's this ? 返回值?
>>> val = os.system("ls -al | grep \"log\" ")   # 使用val接收返回值
-rw-r--r--  1 root       root       6030829 Dec 31 15:14 log    ——————> 此时只打印了命令结果
>>> print val           
0                   ——————> 注意,此时命令正常运行时,返回值是0
>>> val = os.system("ls -al | grep \"log1\" ")
>>> print val       
256                 ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~

笔记 | 如何在Python下调用Linux的Shell命令?

3.4版本开始

建议使用pathlib模块,提供Path对象来操作,包括目录和文件;

上一篇下一篇

猜你喜欢

热点阅读