zoukankan      html  css  js  c++  java
  • Python笔记-IO编程

    IO在计算机中是指input和output(数据输入与输出),涉及到数据交换(磁盘、网络)的地方就需要IO接口。

    输入流input stream是指数据从外面(磁盘、网络服务器)流入内存;输出流output stream是指数据从内存流到外面去。

    由于cpu与内存的运算速度远高于外设速度,存在严重的速度不匹配问题,这时候有两种IO方式:同步IO、异步IO。

    同步IO是指cpu暂停将要执行的后续代码,等待IO执行的结果;异步IO是指cpu不需要IO执行的结果,可以执行其他代码。

    好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。

    你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。

    很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。

    想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步IO的复杂度远远高于同步IO。

    1、文件读写

     文本文件

    要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:

    try:
        f=open('E:/t.txt','r')
        print(f.read())
    finally:
        if f:
            f.close()
            print('文件读操作成功')

    但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

    with open('E:/t.txt','r') as f:
        print(f.read())
    read()#一次性读取所有内容(适合小文件)
    read(size)#每次读取指定字节文件
    readline()#每次读取一行文件
    readlines()# 一次性读取所有文件内容,并返回list 
    with open('E:/t.txt','r') as f:
        for line in f.readlines():
            print(line.strip())#把末尾的/n删掉

    二进制文件

    前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:

    with open('E:/t.png','rb') as f:
        print(f.read(50))

    字符编码

    要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

    >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
    >>> f.read()
    '测试'

    遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

    >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

    写文件

    利用python函数批量生成文件

    for x in range(5):
        with open('F:/'+str(x)+'.docx','w') as f:
            f.write('')

    如果在已存在的文件内容末尾追加内用,open()函数的第二个参数为'a',append

    with open('E:/测试文本.txt','a') as f:
        f.write('
    我是追加的内容,调用的是append()函数')

    2、StringIO、BytesIO

    StringIO

    很多时候,数据读写不一定是文件,也可以在内存中读写。

    StringIO顾名思义就是在内存中读写str。

    要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:

    >>> from io import StringIO
    >>> f = StringIO()
    >>> f.write('hello')
    5
    >>> f.write(' ')
    1
    >>> f.write('world!')
    6
    >>> print(f.getvalue())
    hello world!

    要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取

    from io import StringIO
    f=StringIO('Hello!
    Hi!
    Goodbye!')
    while True:
        s=f.readline()
        if s=='':
            break
        print(s)

    BytesIO

    StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。

    BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:

    StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。

    3、操作文件和目录

    操作文件和目录

    操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

    # 查看当前目录的绝对路径:
    >>> os.path.abspath('.')
    '/Users/michael'
    # 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
    >>> os.path.join('/Users/michael', 'testdir')
    '/Users/michael/testdir'
    # 然后创建一个目录:
    >>> os.mkdir('/Users/michael/testdir')
    # 删掉一个目录:
    >>> os.rmdir('/Users/michael/testdir')

    文件操作使用下面的函数。假定当前目录下有一个test.txt文件

    # 对文件重命名:
    >>> os.rename('test.txt', 'test.py')
    # 删掉文件:
    >>> os.remove('test.py')

    os模块不提供复制文件,但是shutil模块提供了copyfile()的函数

    4、序列化

  • 相关阅读:
    Windows Azure Cloud Service (14) 使用Windows Azure诊断收集日志记录数据
    Windows Azure Cloud Service (13) 用Visual Studio 2010 将应用程序部署到Windows Azure平台
    Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
    Windows Azure Storage (5) Windows Azure Drive
    Windows Azure Storage (7) 使用工具管理Windows Azure Storage
    SQL Azure(二) SQL Azure vs SQL Server
    webbrowser的自动提交
    提取视频的背景声音的软件
    Listview列排序的bug原因
    两个奇怪的问题
  • 原文地址:https://www.cnblogs.com/liberate20/p/10745146.html
Copyright © 2011-2022 走看看