文档章节

python IO编程

陈小扁
 陈小扁
发布于 2016/03/14 13:40
字数 1434
阅读 194
收藏 2

1.IO编程

IO在计算机中指Input/Output,也就是输入和输出, 通常是指磁盘、网络等操作,就需要IO接口。

比如你打开浏览器,访问百度首页,浏览器这个程序就需要通过网络IO获取百度的网页。浏览器首先会发送数据给百度服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Output,随后百度服务器把网页发过来,这个动作是从外面接收数据,叫Input。所以程序完成IO操作会有Input和Output两个数据流

IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和百度服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据

2.同步IO和异步IO的区别

由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:

同步IO: 就是让CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行

异步IO: 就是CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行

同步和异步的区别就在于是否等待IO执行的结果,好比你去肯德基点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO

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

优缺点比较:很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步IO的复杂度远远高于同步IO

3.python文件读写

读文件

读写文件是最常见的IO操作, python内置了读写文件的函数,用法和C是兼容的

读文件:要以读文件的形式打开一个文件对象, 使用python内置的open函数,传入文件名和标识符:

with open('C:\\Users\\jchen19\\Desktop\\request.txt', 'r') as f:
    print(f.read())

标识符‘r’ 表示读, 这样我们就成功的打开了一个文件,这里我们引入了with语句了自动帮我们调用close()方法

二进制文件

读取二进制文件,比如图片, 视频等,用 'rb'模式打开文件即可

with open('C:\\Users\\jchen19\\Desktop\\Desert.jpg','rb') as f:
    print(f.read())

运行后的结果为:

aeg\xf5S\x10\xe3\xfa\x96na6\xfb\x9e\xd5-\xe4\x91\x16^\xa0T\x00P\xd0hkb#+NcP\xf3\xadi\xac\xf1\xeey\xa1\xbf\xc6\xb6\xba\x9eU\xf0\x04t\xf5\x92bJ\x9ayvT\xb6\\bV\xa3\x14\xb7\xa2\xb7gY\xb5\x9fWZ\xe6\xca\xa4D%G\x94K^\x91 \xf7o\\\xee\xe7\xb3\xee\x11\xeekq\xb3w\x13\x994\x05y\x00s&\xb3\x95\x05\t\n<t\x00\xc5}<)\x8d\xa6\xc7\xdc\xbbL\xdbK\xc3\xdc]\xaf\x19\x84\x17t\x81\xd6)

  

  字符编码: 

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

with open('C:\\Users\\jchen19\\Desktop\\ProductCrawler.java','r', encoding='utf-8') as f:
    print(f.read())

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

with open('C:\\Users\\jchen19\\Desktop\\ProductCrawler.java','r', encoding='utf-8'  errors='ignore') as f:
    print(f.read())


写文件

写文件和读文件是一样的,唯一区别是调用open()函数,传入标识符'w' 或者'wb' 表示写文本文件或写二进制文件

with open('C:\\Users\\jchen19\\Desktop\\test.txt','w') as f:
    f.write("测试")

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码


4.操作文件和目录

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

#查看当前目录的绝对路径
path = os.path.abspath('.')
print(path)

# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
dirpath = os.path.join('C:/Users/jchen19/Desktop','test')
os.mkdir(dirpath)


   遍历某文件夹下所有文件,并打印出相对路径:

# coding=utf-8

import os


def find(path):

    if os.path.isdir(path):
        for d in os.listdir(path):
            newdir = os.path.join(path, d)
            find(newdir)
    else:
        if os.path.splitext(path)[1] == '.py':
            print(path)


find('C:\\Users\\jchen19\\Desktop\\personal\\python3_webapp\\demo')


© 著作权归作者所有

共有 人打赏支持
陈小扁

陈小扁

粉丝 52
博文 87
码字总数 71202
作品 0
浦东
高级程序员
私信 提问
【Python Web学习路线】干货整理,不谈虚的,让你短时间高效学好它!

无论是大数据、人工智能还是机器学习,Python都是最热门的首选语言。 学好Python,可以从事Python Web工程师、Python数据分析、人工智能专家等岗位。本期专题,分享的主题是“如何成为一枚优...

Eddie_yang
2018/12/24
0
0
Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程 网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba 备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Pytho...

人气王子333
2018/04/23
0
0
Raspberry IO 开源 —— 树莓派创新集散地

在今年三月份的 PyCon 2013 大会中,PSF 为每个参会者提供了一个 Raspberry Pi,这是一个像信用卡一样大小的微型计算机,你可在上面使用 Python 编程语言。树莓派的强大功能和可移植性极大的...

oschina
2013/08/15
6K
17
python的多路复用实现聊天群

在我的《python高级编程和异步io编程》中我讲解了socket编程,这里贴一段用socket实现聊天室的功能的源码,因为最近工作比较忙,后期我会将这里的代码细节分析出来,目前先把代码贴上。大家自...

__bobby
2018/06/30
0
0
四大游戏编程网站,边玩游戏,边学Python,拒绝枯燥快乐编程

前言 学习编程虽然对有些人来说是件乐事,但是对大多数人来说仍然是一件比较枯燥困难的事情。当然,面临这样困惑的人,并不是只有你一个,所以,这世界上就出现了许多寓教于乐的通过游戏的形式来教...

浪里小白龙q
2018/12/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JS 调用Angularjs 的方法

// 1. 获取 Controllerlet appElement = document.querySelector('[data-ng-controller=MessagesCtrl]');let scope = angular.element(appElement).scope();// 2. 调用方法scope.l......

Moks角木
18分钟前
0
0
dubbo+zookeeper与 eureka的区别

CAP CAP 原则指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得 在分布式架构里, P必须有 Zookeeper保证C P 当...

群星纪元
27分钟前
0
0
云计算之边缘计算大势所趋

如果说边缘计算是公同认定的目标,那么我们看到,不同类型的厂商基于自身的特点,会从不同的起点、沿着不同的路径,向这个目标奔跑。上次参加阿里云的一次活动,看到他们将边缘计算的厂商分成...

linuxCool
32分钟前
0
0
前端通过后端传过来的'\n' ,''等字符串换行失败问题

后台推送换行符 '\n' 或 '<br/>' 等字符串到前台不会换行 详细描述 后台逻辑处理返回String字符串,其中包含\n或<br/>等换行符号,但是前端渲染时候却并没有真正的换行 也尝试了大佬的各种 ...

下次用oschina
39分钟前
2
0
volatile能保证有序性吗?

在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。   volatile关键字禁止指令重排序有两层意思:   1)当程序执行到volatile变量的读操作或者写操作时...

无精疯
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部