Python: IO编程
的有关信息介绍如下:IO = Input/Output =输入和输出。这是针对内存来说的。
Input = 写入内存
Output = 从内存读出
程序代码和运行时数据是存储在内存中的,由CPU来调用执行,涉及到数据交换的地方,通常有磁盘、网络等,这时就需要用到IO接口。
读写文件就是请求操作系统打开一个文件对象(通常称为边睡文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
读文件def read_1(): file_handle = open("c:/test.txt", 'r') file_handle.read() file_handle.close() # 文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同块泰扬一时间能打开的文件数量也是有限的def read_2(): try: file_handle = open("c:/test.txt", 'r') finally: file_handle.close() # 保证文件句柄能一定得到关闭def read_3(): # read_2方法的简化写法,会自动调用close方法 with open("c:/test.txt", 'r') as file_handle: file_handle.read()read()# 会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容
# 如果文件很小,read()一次性读取最方便
readline()# 每次读取一行内容
# 如果不能确定文件大小,反复调用read(size)比较保险readlines()# 一次读取所扬耕有内容并按行返回list
# 如果是配置文件,调用readlines()最方便
写文件
如读文件中的方法打开文件后,通过
file_handle.write('Hello, world!')
就可以把内容写入文件了。
写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
很多时候,数据读写不一定是文件,也可以在内存中读写。使用
StringIO和BytesIO
就可以读写内存。
StringIO
from io import StringIOdef test_1(): sIO = StringIO() sIO.write("hello") sIO.write(" ") sIO.write("world!") print(sIO.getvalue())def test_2(): sIO = StringIO("hello\nworld") # 要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取 while True: str = sIO.readline() if str == "": break print(str)
BytesIO
与StringIO操作一样,只是BytesIO操作的是二进制数据。
from io import BytesIO
bIO =BytesIO()
bIO.write('中文'.encode('utf-8'))
bIO = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
bIO.read()
操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中。
# 查看当前目录的绝对路径
os.path.abspath('.')
# 把test设置为当前路径的子目录
os.path.join(os.path.abspath("."), "test")
# 创建这个test目录
os.mkdir(os.path.join(os.path.abspath("."), "test"))
# 删除这个test目录
os.rmdir(os.path.join(os.path.abspath("."), "test"))
# 拆分文件路径和文件名返回一个元组
os.path.split("c:/a.txt") #('c:/', 'a.txt')
# 拆分文件路径和文件名返回一个元组
os.path.splitext("c:/a.txt") #('c:/a', '.txt')
# 文件重命名
os.rename('test.txt', 'test.py')
# 删除文件
os.remove('test.py')
# 拷贝文件
shutil.copyfile()
# 拷贝目录
shutil.copy()
# 列出当前文件夹下所有目录
[x for x in os.listdir('.') if os.path.isdir(x)]
# 列出当前文件夹下所有py文件
[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)=='.py']
把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling。例如把以下字典保存到磁盘上的过程:
d = dict(name='keynes', age=20, score=88)
保存对象
import pickledict = {"name": "keynes", "sex": "male"}pickle.dumps(dict) # 把dict转成字节码with open("c:/test.txt", "wb") as file_handle: pickle.dump(dict, file_handle) # 把dict转成字节码并写入到file_handle所指向的文件中
读入对象
import pickledict = {"name": "keynes", "sex": "male"}pickle.dumps(dict) # 把dict转成字节码pickle.loads(dict) # 把字节码转成dict
with open("c:/test.txt", "rb") as file_handle: pickle.load(file_handle) # file_handle所指向的文件中的字节码转成对象
Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。
关于序列化,更好的方式是使用JSON格式进行互换。