Python的IO编程一

一、重要概念流

1.从磁盘读取文件到内存就只有input操作,把数据写到文件里就只有output操作。
2.流只能单向流动,Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。所以两个程序之间的数据交换一定得有两条水管(流),而不同程序的处理速度不同(流速不同),应该不是流速,是处理速度不同。假设快递要从a运输到b,a的人多处理速度快,b的人少处理速度慢,a你就不能一直运输。有两种解决办法,一种是同步IO,一种是异步IO,同步就是a的员工先放假,等b处理的差不多了你们在上班,这就是同步,但是老板不同意,我雇你们来不是让你们来放假的,所以安排了a的员工去做其他事,等b处理好了再通知a的员工继续运输快递到b。通知的方式有多种,b的人跑过来a通知,发短信通知等,异比同步要复杂的多。

二、Python的文件读写

1.open()函数

读写文件前,要先用open()函数打开这个文件,函数可以传入四个参数。

  • 第一个是文件的路径,路径要注意转义
  • 第二个是标识符
    r表示读模式
    rb表示读取二进制文件
    w表示写模式,如果文件不存在则新创建,存在则重写内容
    wb是写二进制文件
  • 第三个是字符编码
  • 第四个是errors,可以忽略非法编码的字符
#注意这里加r是防止转义,如果没加r,\u啥的就会转义不加就不会。
fpath2 = r'c:\users\ljs\desktop\123.txt'
f = open(fpath2, 'r', encoding = 'utf8' , errors = 'ignore')
#当文件成功打开,我们可以调用read一次读取文件的全部内容,py把内容读到内存,用一个str对象表示
print(f.read())

输出

C:\Users\ljs\Desktop>python io.py
a
b
c
d
e

我们给文件里加入一行f

f.write('\nf')

这时候报错io.UnsupportedOperation: not writable
意思是只调用了r读模式,没有写的权限
我们在前面的open函数的第二个参数换成r+读写模式

f = open(fpath2, 'r+', encoding = 'utf8' , errors = 'ignore')

输出

#因为是先读然后再写,所以交互式里没有显示f,但是f已经写入文件里了
C:\Users\ljs\Desktop>python io.py
a
b
c
d
e

当文件本来有数据,然后要在后面继续添加,这时候是不能用w,因为w会覆盖文件里本来的内容重新写入,要用a(append)

fpath2 = r'c:\users\ljs\desktop\123.txt'
f = open(fpath2, 'w', encoding = 'utf8' , errors = 'ignore')
f.write('h')

你会发现txt里的abcdef全没了,只剩一个h,我们把w改成a就不会出现这样的问题。
最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的

f.close()
2.with语句

我们读写的文件可能不存在(路径写错啥的),所以最后的close()可能执行不了,这时候我们就得用try...finally语句块

try:
    f = open(r'c:\users\ljs\desktop\123.txt', 'a', encoding = 'utf8' , errors = 'ignore')
    f.write('h')
finally:
    if f:
        f.close()

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

with open(r'c:\users\ljs\desktop\123.txt', 'a', encoding = 'utf8' , errors = 'ignore')  as f:
    f.write('h')

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

3.read(size)

假如我们的文件有10g,read()是读取到内存,全部读取内存就会爆炸,所以我们可以多次使用read(size)来读取size个字节的内容。

f = open( r'c:\users\ljs\desktop\123.txt', 'r+', encoding = 'utf8' , errors = 'ignore')
print(f.read(1))

输出

C:\Users\ljs\Desktop>python io2.py
a

我们也可以调研readline()每次读取一行内容,readlines()读取全部内容并按行返回一个list

f = open( r'c:\users\ljs\desktop\123.txt', 'r+', encoding = 'utf8' , errors = 'ignore')
print(f.readline())
print(f.readlines())

输出

C:\Users\ljs\Desktop>python io2.py
a

['b\n', 'c\n', 'd\n', 'e\n', 'f']

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便

4.读取二进制文件和字符编码

要读取二进制文件,比如图片、视频等等,用'rb'模式

f = open( r'c:\users\ljs\desktop\timg.jpg', 'rb')
print(f.read(10))

输出:

C:\Users\ljs\Desktop>python io2.py
b'\xff\xd8\xff\xe0\x00\x10JFIF'

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

f = open( r'c:\users\ljs\desktop\123.txt', 'r+', encoding = 'gbk')
print(f.read())

输出

C:\Users\ljs\Desktop>python io2.py
a
b
c
d
e
f
你好

如果encoding是utf8就会报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 18: invalid continuation byte
这时候我们不想它报错,我们想让它忽略掉你好,输出前面的就行就可以用到第四个参数errors了

f = open( r'c:\users\ljs\desktop\123.txt', 'r+', encoding = 'utf8', errors = 'ignore')
print(f.read())

输出:

C:\Users\ljs\Desktop>python io2.py
a
b
c
d
e
f

三、总结

1、注意文件读写的顺序。先写再读,如果没有close再open你会读不到。
2、记得每次写操作后的close(),当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,所以最好还是用with语句。
3、温故而知新,每次都会有新发现,等有新发现再补充。
附上一首网易云昨天推荐的歌,Pillow talk。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序运行的过程中,可能需要对一些设备进...
    征程_Journey阅读 943评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 经历一天的休息调整后继续工作,做事情有些力不从心。但是在经历了他人认同后,开始有所转变了。自己也思考了一下,...
    会好好生活的婷婷阅读 188评论 0 0
  • 记得初中政治书上有句话叫做困难像弹簧你强它就弱,你弱它就强。不错这句话确实很好,不管是在平时复习考试时,碰到难题目...
    c5646c213098阅读 632评论 0 0