yhw-miracle

python之IO编程

痛点就是起点 writed in

本文为痛点就是起点原创文章,可以随意转载,但需注明出处。

IO 在计算机中指的是 Input/Output,也就是输入和输出。凡是用到数据交换的地方,都会涉及到 IO 编程。在 IO 编程中,Stream(流)是一种很重要的概念,分为输入流(Input Stream)和输出流(Output Stream)对于流的概念,我们可以这样理解,流相当于一个水管,数据相当于水管中的水,但是只能单向流动,所以数据传输过程中需要架设连个两个水管,一个负责输入,一个负责输出,这样读写就可以实现读写同步了。

文件读写

文件打开

Python 内置了读写文件的函数,方便了文件的 IO 操作。在读写文件前,需要打开文件,确定文件的读写模式。打开文件语法如下:

open(name[.mode[.buffering]])

其中, open 函数必须要给出文件名参数,模式(mode)和缓冲区(buffering)是可选的,默认模式是读模式,默认缓冲是无,若成功打开文件,会返回一个文件对象;若打开文件失败(文件不存在或文件路径错误等),会产生异常。

___

文件模式

open 函数中 mode 参数可以实现对文件不同的操作。其中,mode 参数具体值如下表所示。

功能
‘r’ 读模式
‘w’ 写模式
‘a’ 追加模式
‘b’ 二进制模式
‘+’ 读/写模式

这里,需要注意以下几点:

  1. 一般在处理一些二进制文件(如,音频,视频,图像文件),需要在模式参数上加上 ‘b’;
  2. 模式 ‘b’ 和 ‘+’ 可以和其他模式共同使用,如,’rb’ 表示读取一个二进制文件;
  3. ‘w’ 模式在写文件时,每运行一次程序,会从头开始写;而 ‘a’ 模式可以以追加的方式每次默认在文件末尾进行读或写文件。

文件缓冲区

open 函数中 buffering 参数控制着文件的缓冲。如果该参数为 0,IO 操作就是无缓冲,数据是直接写到硬盘上;若果该参数是 1,IO 操作是有缓冲的,数据先写到内存里(缓冲区里),只有使用 flush 函数或者 close 函数,数据才会更新到磁盘。

如果该参数是大于 1 的数字,代表缓冲区的大小(单位为字节),-1 (或者其他任何负数)代表使用默认缓冲区的大小。

文件读取

文件读取主要分为按字节读取和按行读取,先利用 f=open(‘’) 打开文件,如果成功打开文件;接下来利用 f.read() 就可以读取文件了,将文件内容以 str 类型返回;最后需要利用 f.close() 关闭文件。文件使用完毕必须关闭,因为文件对象会占用操作系统资源,影响系统的 IO 操作。

由于文件操作过程中可能会出现 IO 异常,一旦出现 IO 异常,后面的 close() 方法就不会调用。为了保证程序的健壮性,我们可以使用 try—except—finally 来实现。

try:
    f = open(r'./test.txt')
    print(f.read())
finally:
    if f:
        f.close()

上面的代码略长, python 提供了一种简单的写法,使用 with语句来代替 try—finally 代码块和 close() 方法,可以这样写。

with open(r'./test.txt','r') as fileReader:
    print(fileReader.read())

这里,需要注意几点:

  • 调用 read() 方法是一次将文件内容读到内存中,如果文件过大,将会出现内存不足的问题,一般对于大文件,我们可以对此调用 read(size) 方法来读取,每次读取 size 字节数;

  • 对于文本文件,可以调用 readline() 函数一次读取一行内容,调用 readlines() 函数一次读取所以内容并按行返回列表。

文件写入

写文件和读文件流程是一样的,区别是在调用 open() 方法时,传入标识符 ‘w’ 或者 ‘wb’ 表示写入文本文件或者写入二进制文件;接下来调用 write() 方法,制定写入内容;最后文件使用完毕后,需要关闭文件,释放文件对象。

f = open('./test.txt','w')
f.write('')
f.close()

在使用 write() 方法时,操作系统不会立即将数据写入到文件中,而是先将数据写入内存中的缓冲区里,等到空间时在写入到文件中,最后使用 close() 方法将数据完整地写入文件中,也可以使用 flush() 方法将数据立即写入到文件中。写文件过程可能会出现 IO 异常,我们可以采用 with 语句。

with open(r'./test.txt','w') as fileWriter:
    fileWriter.write('hello')

序列化操作

序列化,就是将内存中的变量变成可存储或可传输的过程。将内存中的变量序列化之后,可以把序列化的内容写入到磁盘,或者通过网络传输到别的机器上,实现程序状态的保存和共享。反过来,把变量内容从序列化的对象重新读取到内存,成为反序列化。

在 python 中提供了两个模块(cPickle 和 pickle)来实现序列化,前者是由 c 语言编写的,效率要比后者高很多,但是两个模块的功能是一样的。一般在编写程序时,采取的方案是先导入 cPickle 模块,如果此模块不存在,再导入 pickle 模块。

try:
    import cPickle as pickle
except ImportError:
    import pickle

序列化

pickle 实现序列化主要使用的是 dumps 方法或 dump 方法。dumps 方法可以将任意对象序列化成一个 str,然后可以将这个 str 写入到文件中保存(需额外操作)。

d = dict(url='index.html', tilte='firstPage', content='firstPage')
print pickle.dumps(d)

如果使用 dump 方法,可以将序列化后的对象直接写入到文件中。

d = dict(url='index.html', tilte='firstPage', content='firstPage')
f = open('./dump.txt', 'wb')
pickle.dump(d, f)

反序列化

python 实现反序列化使用的是 loads 方法或 load 方法。把序列化后的文件从磁盘上读取为一个 str,然后使用 loads 方法将这个 str 反序列化为对象,或者直接使用 load 方法将文件直接反序列化为对象。

with open('./dump.txt', 'rb') as f:
    print pickle.load(f)

python IO编程
知识总结

欢迎关注,我们一起进行认知迭代!


痛点就是起点

© 2016 - 2020 基于 jekyll | Github Pags | iconfont By yhw-miracle