11. Python基础学习笔记——IO编程

IO编程

  • 操作IO编程都是由操作系统提供的,每一种编程语言会把操作系统提供的低级的C接口封装起来,方便使用。
  • 当前学习的IO都是同步IO操作。

文件读写

  • 向操作系统发送读写文件请求
  • 操作系统会提供相应的接口完成读写操作。

读文件

  • 使用open()读模式打开一个文件对象,传入文件名和标识符即可
  • read()方法可以一次读取全部的文件内容到内存中。
  • 文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。close()关闭。
  • with语句可以自动调用close()方法。
  • 读取方法:
  • 文件较小:read()一次性读完
  • 文件较大或者未知大小:read(size)反复调用
  • 配置文件等:for line in f.readlines()更加方便

二进制文件

  • 默认读取文本文件,并且UTF-8编码的文本文件。
  • 二进制文件:如图片、视频等,可以使用rb模式打开。

字符编码

  • 读取非utf-8编码的文件,需要给open()传入encoding参数。
  • 如果遇到编码错误的情况而无法打开时,可以传入一个errors参数,设定其值为:ignore,忽略错误的编码。

写文件

  • 传入mode='w'或者mode='wb'参数即可
  • 调用write或者writeline()即可写入
  • 指定编码后,字符串会转换为指定的编码后存入。

String IO和Bytes IO

  • 除了读取文件,也可以在内存中读写
  • from io import StringIO
  • getvalue()可以获得写入的字符串
  • StringIO只能操作str,但是可以使用BytesIO操作二进制数据等。
  • StringIOBytesIO是在内存中操作str和bytes的方法,与读写文件有一致的接口

操作文件和目录

  • os.name获取操作系统的类型
  • os.uname()获取详细信息
  • os.environ获取全部环境变量,os.environ.get('PATH')获取环境变量PATH信息
  • 操作文件和目录的函数,一部分在os模块下,一部分在os.path模块下。
  • 文件和目录操作:
  • 获取当前目录名称:os.path.abspath('.')
  • 在某个目录下创建新的目录,需要连接字符串:os.path.join(cur_path, 'Hello_Dir')
  • 获取文件的文件目录以及文件名:os.path.split()
  • 获取文件名和扩展名: os.path.splittext()
  • 创建目录:os.mkdir()
  • 删除目录:os.rmdir()
  • 重命名文件:os.rename()
  • 删除文件:os.remove()
  • shutil中提供了os的扩展方法,如copyfile()

  • 过滤文件

# 获取所有的目录
 [x for x in os.listdir('.') if os.path.isdir(x)]

# 获取所有文件
[x for x in os.listdir('.') if os.path.isfile(x)]

# 获取符合条件的文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py']

序列化

  • 把变量从内存变成可存储或者传输的过程称为序列化,在Python中叫做pickling.
  • 可以把序列化后的内容写入磁盘保存或者通过网络传输到其他地方
  • 把变量内容重新读取到内存称为反序列化:unpickling

使用pickle模块序列化

  • picle.dumps()会序列化变量
  • pickle.dump(d, f)存储到文件
  • pickle.load(f)读取
  • 不同版本的pickle可能不太兼容,所以只能存储一些不是很重要的内容。

JSON

JSON类型 Python类型
{} dict
[] list
'string' str
123.33 int/float
true/false True/False
null None
  • json不仅是标准格式,而且比xml更快,可以直接在web页面中读取,非常方便
  • dumpsloads|dumpload
  • 自定义类的序列化:
  • default参数:lambda obj: obj.__dict__

  • 自定义类的反序列化:
  • object_hook=translate_method即可

你可能感兴趣的:(11. Python基础学习笔记——IO编程)