Python的IO编程

Posted by Csming on 2017-04-21

今天本来想要看动漫的,结果辣鸡锐捷又断网;
呵,辣鸡锐捷
一个网站要让我们可以看视频,就要涉及到网络编程啦~
那么,我们怎么样通过Python来实现文件的读写,还有网络操作呢~


同步和异步的区别

同步就是一步一步进行的操作;
就是说,我们在进行网络操作或者文件读写(如:从网上下载东西),在这段时间里,我们就只做这个操作,等这个操作完成之后,才进行下一个步骤

那么异步呢,就是可以在进行网络操作的时候,进行其他步骤;


还记得大一的时候,学习unity开发,有人跟我说,加载场景用异步的话,可以优化很多

我的内心os:异步是啥……好高端的名词呀……

现在才发现,好像也没有很可怕……

IO编程

那么什么是IO编程;
IO编程指的一般就是通过流的形式,在我们的硬盘或者网络上读写东西;
嗯,就是酱紫

文件读写

Python内置了读写文件的函数,用法和C语言兼容

不愧是高级语言啊!!!

读写文件就是请求操作系统打开一个文件对象,然后通过操作系统提供的接口从这个文件对象中读取数据,或者把数据写入这个文件对象

读文件

  • 打开一个文件对象,使用open()函数,传入文件名和标示符
1
f = open('/User/michael/test.txt', 'r')

案例来自廖雪峰前辈的博客http://www.liaoxuefeng.com/

'r’表示读,这样就可以打开一个文件了;
若文件不存在,函数open()会抛出一个IOError错误;

  • 若文件打开成功;则可以调用read()方法,将文件中的内容一次性读取到内存中;并用一个str对象表示
1
2
f.read()
# f.read()是一个str对象
  • 读完后,关闭文件:close()方法
1
f.close()

因为,文件读写可能出现IOError错误,那么这时候f.close()就不能调用了;
所以一般使用try…finally:

1
2
3
4
5
6
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()

  • 如果担心文件内容太多;那么可以使用read(size)方法;**
    这个方法一次读取size字节的内容
    也可以调用readline(),每次读取一行内容

readlines()方法,一次性读取所有内容,并按行返回list

file-like Object

open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object

除了file外,还可以是内存的字节流,网络流,自定义流等;

file-like Object不要求从特定的类继承,只需要写一个read()方法;


StringIO 就是在内存中创建的file-like Object


  • 二进制文件
    要读取二进制文件,比如图片,视频等;
    就用**‘rb’**模式:
1
2
3
f = open('xxxxxx.jpg', 'rb')
print(f.read())
# b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
  • 字符编码
    非UTF-8的文本文件;
    需要给open()函数传入encoding参数;
1
2
f = open('xxxxxx.txt', 'r', encoding='gbk')
f.read()

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符


写文件

和写文件一样;
但是调用open()函数的时候,传入标识符为**‘w’‘wb’**表示写文本文件或写二进制文件;

1
2
3
f = open('./User/michael/test.txt', 'r')
f.write('Hello, world!!')
f.close()

StringIO和BytesIO

很多时候,数据在内存中读写;
StringIO就是在内存中读写的str;

1
2
3
4
5
6
7
from io import StringIO
f = StringIO()
f.wirte('hello')
f.wirte(' ') # 返回1
f.write('world!') # 返回6
print(f.getvalue())
# hello world!

getvalue()函数,用来获取写入后的str


由于StringIO只能读写str对象;
那么,要操作二进制数据,就需要使用BytesIO
BytesIO在内存中读写bytes
可以用一个bytes初始化BytesIO


操作文件和目录

操作文件和目录的函数一部分放在os模块中
还有一部分放在os.path模块中

os.path.abspath(’.’)查看当前目录的绝对路径

os.path.join(’/Users/michael’, ‘testdir’)在某个目录下创建一个新目录,首先把新目录的完整路径表示出来

os.mkdir(’/Users/michael/testdir’)然后创建一个目录

os.rmdir(’/Users/michael/testdir’)删掉一个目录

把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符

要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数

os.path.splitext()可以直接让你得到文件扩展名

os.rename()用于重命名文件
os.remove()删除文件


案例来自廖雪峰前辈的博客:http://www.liaoxuefeng.com/
参考资料:http://www.liaoxuefeng.com/