IO编程

一、IO编程

IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。(引自:廖雪峰 python3,具体可看考文末的链接)

二、异步IO与同步IO

1. 同步IO

cpu写数据到磁盘等外设时,实时等待磁盘返回结果,当磁盘返回结果后,在往下执行。

2. 异步IO

cpu写数据到磁盘等外设时,并不实时等待磁盘返回结果,而是立马往下执行。

三、标准输入输出

一般情况下标准输入即是来自键盘的输入,而标准输出时输出到终端,一般来说即是展现到屏幕上。(linux相关的标准输入和输出可以参考文章末尾的链接。)
python中的标准输入和输出即是input和print,这两个函数实现的。

1. 输入

input(“请输入内容”)

2. 输出

print(“输出内容”)

示例程序:  
#!/usr/bin/env python3  

a=input("请输入一个字符:")  
print("输入的自复式:%s"%(a))  

运行程序后,屏幕会出现:
请输入一个字符:
输入字符A,则会返回以下结果:
输入的字符是:A
以上即是最简单标准输入输出

四、文件读写

很多程序在运行完后,需要把数据保存起来,这个时候就需要通过文件保存。python内置了读写文件的函数。

1. open()函数

格式

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明

file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 编码格式
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener:

1.1 mode参数

模式描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(不推荐)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

2. file对象的常用操作函数

方法描述
file.close() 关闭文件。关闭后文件不能再进行读写操作。
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。
file.next() 返回文件下一行。
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size]) 读取整行,包括 “\n” 字符。
file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
file.seek(offset[, whence]) 设置文件当前位置
file.tell() 返回文件当前位置。
file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
file.write(str) 将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

3. 读文件

使用open读取一个名为test.txt的文件

示例程序:  
#!/usr/bin/env python3  

f = open('test.txt','r')        #以只读的方式打开一个文件,r这里代表只读。  
print(f.read())                  #输出从文件中读取到的内容,file对象的更多用法,参考上面的表格。  
f.close()                          #关闭文件  

4. 写文件

使用open把”hello,world”写入test.txt此文件

示例程序:  
#!/usr/bin/env python3  

f = open('test.txt','w‘')          #以只读的方式打开一个文件  
f.write(“hello,world”)            #把“hello,world”写入到test.txt文件中。  
f.close()                               #关闭文件  

5. 异常处理

在读写文件时,可会产生IOError。比如读文件的时候,如果没有文件,则会报错:

Traceback (most recent call last):  
  File "file.py", line 5, in <module>  
    f = open('test.txt','r')  

FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'  
为了解决报错不论是否出错都可以关闭文件,需要加上错误异常处理。使用try........finally来实现。  
try:  
    f = open('test.txt', 'r')  
    print(f.read())  
finally:  
    if f:  
        f.close()  

6. 其它操作

除了简单的读写文文件,还可以对文件进行追加,以及操作二进制文件等,这些操作可以看mode参数表。

7. with…as

python自带了另一种操作文件的方式,即with…as… 此方式可以自动调用关闭文件的方法。

操作方式:  
with open('test.txt', 'r') as f:  
    connect = f.read()  
print(connect)  

示例程序:  
#/usr/bin/env python3  
with open('test.txt', 'r') as f:  
    connect = f.read()  
print(connect)  

五、内存读写

除了往磁盘上写内容,也可以把数据写到内存中。不过要注意,如果服务重启,断点,则内存中的数据,将会被清空。
python也提供了写内存的相关模块 StringIO和BytesIO

1. 字符串读写StringIO

示例程序:  
#!/usr/bin/env python3  

from io import StringIO      #导读IO模块下的StringIO方法  
f = StringIO()                      #对象化  
f.write('hello')                      #往内存写hello  
f.write(' ')                             #往内存写 " "  
f.write('world!')                    #往内存写"world!"  

print(f.getvalue())              #使用getvalue方法获取数据。getvalue()用来获取写入的数据。  

输出结果:  
hello world!  

2. 二进制读写BytesIO

示例程序:  
#!/usr/bin/env python3  

from io import BytesIO                   #导读IO模块下的BytesIO方法  
f = BytesIO()                                  #对象化  
f.write('中文'.encode('utf-8'))          #写入内存,这里写入的不是字符串类型,而是经过UTF-8编码过的bytes格式内从。  

print(f.getvalue())                           #使用getvalue方法获取数据。getvalue()用来获取写入的数据。    


输出结果:  
b'\xe4\xb8\xad\xe6\x96\x87'            #这是一个内存地址,不同机器,返回的结果可能不同。  

六、序列化

把内存中的变量变成可存储或传输的过程,叫作序列化,python中叫picking。序列化之后,可以把序列化后的内容写入到磁盘或通过网络传输。
反过来,把序列化后的内容重新读到内存称为反序列化,即unpicking。

python提供pickle模块来实现序列化

1. 序列化

示例程序:  
#!/usr/bin/env python3  

import pickle                                                       #导入序列化模块  
d = dict(name='Bob', age=20, score=88)           #给变量d赋值  
f = open('dump.txt','wb')                                     #已二进制写的方式打开文件  
pickle.dump(d,f)                                                 #序列化内容到文件中  
f.close()                                                              #关闭文件  

2. 反序列化

1 2 3 4 5 6 7 8 9 10#!/usr/bin/env python3 import pickle #导入序列化模块 f = open(‘dump.txt’, ‘rb’) #已二进制的方式读取dump.txt文件 d = pickle.load(f) #反序列化,并把内容赋值给变量d f.close() #关闭文件 print(d) #输出变量d 输出结果: {‘name’: ‘Bob’, ‘score’: 88, ‘age’: 20}

七、操作文件和目录

python中操作目录的是os模块,这里列出一些常见的目录和文件操作。
os模块是调用的操作系统提供的接口,现在操作系统是不允许程序直接操作磁盘。

1. 显示环境变量

os.environ  
示例程序:  
#!/usr/bin/env python3  
import os  
print(os.environ)  


获取某个环境变量的值  
#!/usr/bin/env python3  
import os  
print(os.environ.get('PWD'))  


查看当前目录的绝对路径  
#!/usr/bin/env python3  
import os  
os.path.abspath('.')  


创建目录  
#!/usr/bin/env python3  
import os  
os.mkdir('/tmp/test')  


删除目录  
#!/usr/bin/env python3  
import os  
os.rmdir('/tmp/test')  


文件重命名  
#!/usr/bin/env python3  
import os  
os.rename('test.txt', 'test.py')  


删除文件  
#!/usr/bin/env python3  
import os  
os.remove('test.py')  

八、参考博文

python3 廖雪峰
python3 菜鸟课程
linux标准输入和输出

Previous Post

python模块

Next Post

异常处理

Related Posts