python——IO编程——文件读写

  • IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。
  • 同步和异步的区别就在于是否等待IO执行的结果。好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。
  • 很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步IO的复杂度远远高于同步IO。

1:读文件。

  • 读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的.
  • 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符;
  • 如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在;
  • 如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:
  • 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
# !usr/bin/env python3
# -*- coding: utf-8 -*-
# for IO testing in 2017-05-30StrFilePath = "H:\\PycharmProjects\\2017\\test\\zht-test.txt"
FileHandle = open(StrFilePath, 'r')StrFileContent = FileHandle.read()
print('>>:filepath[%s] fileconten[%s]' % (StrFilePath, StrFileContent))FileHandle.close()
结果:
>>:filepath[H:\PycharmProjects\2017\test\zht-test.txt] fileconten[1:nihao;
2:what;
3:hello;
4:world;]
  • 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
  • 但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法,这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
# !usr/bin/env python3
# -*- coding: utf-8 -*-
# for IO testing in 2017-05-30StrFilePath = "H:\\PycharmProjects\\2017\\test\\zht-test.txt"def FuncFilePint(StrFilePath, FileHanle):StrFileContent = FileHandle.read()print('>>:filepath[%s] fileconten[%s]' % (StrFilePath, StrFileContent))try:FileHandle = open(StrFilePath, 'r')FuncFilePint(StrFilePath, FileHandle)
finally:if (FileHandle):FileHandle.close()with open(StrFilePath, 'r') as FileHandle:FuncFilePint(StrFilePath, FileHandle)
  • 调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list
# !usr/bin/env python3
# -*- coding: utf-8 -*-
# for IO testing in 2017-05-30FileSize = 10
StrFilePath = "H:\\PycharmProjects\\2017\\test\\zht-test.txt"def FuncFilePint(StrFilePath, FileHanle, FileSize):print('>>:filepath[%s]' % (StrFilePath))ListFileContent = []while (True):StrTmp = FileHandle.read(FileSize)if (0 >= len(StrTmp)):print("--- read all ---")breakelse:ListFileContent.append(StrTmp)print(ListFileContent)try:FileHandle = open(StrFilePath, 'r')FuncFilePint(StrFilePath, FileHandle, FileSize)
finally:if (FileHandle):FileHandle.close()
结果:
>>:filepath[H:\PycharmProjects\2017\test\zht-test.txt]
--- read all ---
['1:nihao;\n2', ':what;\n3:h', 'ello;\n4:wo', 'rld;']
# !usr/bin/env python3
# -*- coding: utf-8 -*-
# for IO testing in 2017-05-30StrFilePath = "H:\\PycharmProjects\\2017\\test\\zht-test.txt"def FuncFilePint(StrFilePath, FileHanle):print('>>:filepath[%s]' % (StrFilePath))ListFileContent = []for StrTmp in FileHandle.readlines():ListFileContent.append(StrTmp.strip()) # 把末尾的‘\n’去掉print(ListFileContent)try:FileHandle = open(StrFilePath, 'r')FuncFilePint(StrFilePath, FileHandle)
finally:if (FileHandle):FileHandle.close()
结果:
>>:filepath[H:\PycharmProjects\2017\test\zht-test.txt]
['1:nihao;', '2:what;', '3:hello;', '4:world;']

  • open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。
  • file-like Object 不要求从特定类继承,只要写个read()方法就行。StringIO就是在内存中创建的file-like Object,常用作临时缓冲。
  • 前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:
f = open('/Users/michael/test.jpg', 'rb')
  • 要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
  • 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

2:写文件;

  • 写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:
  • 当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。
  • 要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。
# !usr/bin/env python3
# -*- coding: utf-8 -*-
# for IO testing in 2017-05-30StrFilePath = "H:\\PycharmProjects\\2017\\test\\zht-test.txt"with open(StrFilePath, 'w', encoding = 'utf8') as FileHanle:FileHanle.write('从你的全世界路过')with open(StrFilePath, 'r', encoding = 'utf8') as FileHanle:print('filepath[%s] filecontent[%s]' % (StrFilePath, FileHanle.read()))
结果:
filepath[H:\PycharmProjects\2017\test\zht-test.txt] filecontent[从你的全世界路过]
----------------------------------------------------------------------------------------------------------------------------
参考网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
----------------------------------------------------------------------------------------------------------------------------

python学习——IO编程——文件读写相关推荐

  1. Python中IO编程-文件读写

    # (1)读文件f = open('/Users/zhoujian/Desktop/zhoujian.txt', 'r') print(f.read()) f.close()print('------ ...

  2. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    BytesIO StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO.BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes: 写 ...

  3. Python IO编程——文件读写

    1.1   文件读写 1.1.1   读文件 >>> f = open('/root/python/hello.py','r')    #标识符r表示读 >>> f ...

  4. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...

    IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...

  5. python学习笔记-36 文件读写

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  6. Python学习笔记_文件读写,目录遍历类封装

    文件读写和目录遍历类的封装. mylib.py 1 # -*- coding:utf-8 -*- 2 3 __author__ = 'huanghuan' 4 5 import os 6 from o ...

  7. python中IO编程中关于StringIO的读写问题

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...

  8. Python之IO编程

    前言:由于程序和运行数据是在内存中驻留的,由CPU这个超快的计算核心来执行.当涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.由于CPU和内存的速度远远高于外设的速度,那么在IO编程中就存在 ...

  9. Python(十三)IO编程

    IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口. 比如你打开 ...

最新文章

  1. 现在可以插入MSN表情了
  2. Asp.net MVC调试-使用IP监听
  3. 开源如此火热,但研究表明该领域已不再增长
  4. Python批量下载电子邮件附件并汇总合并Excel文件_如何让繁琐工作自动化:聊聊Python与RPA...
  5. 1012.log4cplus项目应用
  6. 实际项目开发管理流程图
  7. Git -- 分支管理简介
  8. 一起谈.NET技术,在ASP.NET中自动合并小图片并使用CSS Sprite显示出来
  9. 全站仪 经纬仪 水准仪 操作演示视频教程 建筑工程测量放线7日通
  10. Spark数据分析及处理(实战分析)
  11. 【听说隔壁老王开始学编程了?】
  12. android 智能手环应用,时硕智能手环软件
  13. windows11 git 安装SSH密钥
  14. 计算机在摄影应用,计算机X线摄影在临床中的应用
  15. 数据外连接 LEFT OUT JOIN 的用法
  16. 习语言(c语言)轻松入门教程
  17. 贪心算法之加勒比海盗船最优装载问题
  18. 自己写一个PRISMA 让两张图片融合起来
  19. Web前端面试指导(八):iframe有那些缺点
  20. 递归神经网络(RNN)

热门文章

  1. Unity实战——牧师与魔鬼
  2. Python量化交易学习笔记(2)——A股数据下载
  3. CSS3 box-shadow 效果大全(内阴影,外阴影,三边阴影,双边阴影,单边阴影,细线描边…)...
  4. 软件测试面试题:缺陷等级应如何划分?
  5. c语言程序设计函数题,C语言程序设计函数练习题及参考答案
  6. 嵌入式开发人才的未来发展方向
  7. 修改网站标题对排名有什么影响?
  8. c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
  9. 堡塔负载均衡使用教程
  10. 你的系统时间未与ntp服务器同步6,国家授时中心ntp(系统时间未与ntp服务器同步)...