一、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')