python 使用 with open() as 读写文件
读文件:
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:
>>> f = open('E:\python\python\test.txt', 'r')
标示符'r'表示读,这样,我们就成功地打开了一个文件。
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:
- f=open('E:\python\python\notfound.txt', 'r')
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- FileNotFoundError: [Errno 2] No such file or directory: 'E:\python\python\notfound.txt'
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:
- >>> f.read()
- 'Hello, python!'
最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
>>> f.close()
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
- try:
- f = open('/path/', 'r')
- print(f.read())
- finally:
- if f:
- f.close()
每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
- with open('/path/to/file', 'r') as f:
- print(f.read())
这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
调用read()会一次性读取文件的全部内容,如果文件有20G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
- for line in f.readlines():
- print(line.strip()) # 把末尾的'\n'删掉
写文件
写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:
- >>> f = open('E:\python\python\test.txt', 'w')
- >>> f.write('Hello, python!')
- >>> f.close()
可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:
- with open('E:\python\python\test.txt', 'w') as f:
- f.write('Hello, python!')
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码
字符编码
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
- >>> f = open('E:\python\python\gbk.txt', 'r', encoding='gbk')
- >>> f.read()
- '测试'
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('E:\python\python\gbk.txt', 'r', encoding='gbk', errors='ignore')
二进制文件
前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:
- >>> f = open('E:\python\python\test.jpg', 'rb')
- >>> f.read()
- b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
总结:以后读写文件尽量使用with open语句,少使用f = open()语句
对于多个文件的读写,可以写成以下两种方式:
1、
- with open('C:\Desktop\text.txt','r') as f:
- with open('C:\Desktop\text1.txt','r') as f1:
- with open('C:\Desktop\text2.txt','r') as f2
- ........
- ........
- ........
2、
- with open(''C:\Desktop\text.txt','r') as f:
- ........
- with open(''C:\Desktop\text1.txt','r') as f1:
- ........
- with open('C:\Desktop\text2.txt','r') as f2:
- ........
文件的读写方式列表:
File 对象属性:
python 使用 with open() as 读写文件的更多相关文章
- 笨办法学Python记录--习题15-17 开始读写文件啦
习题15 - 17 打开并读流程: from sys import argv script,filename = argv txt = open(filename) print "Here' ...
- [python 学习] IO操作之读写文件
一.读取全部文件: # -*- coding: utf-8 -*- f = open('qq_url.txt','r'); print f.read(); f.close(); 二.读取规定长度文件 ...
- python读写文件字符集
操作I/O的能力是由操作系统的提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来供开发者使用,Python也不例外. 读写文件是需要请求操作系统去操作磁盘的 所以默认的编码就是你平台的编 ...
- Python读写文件
Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('t ...
- Python读写文件乱码问题
对开发者来说,最恼人的问题之一莫过于读写文件的时候,由于编码千差万别,出现乱码问题.好难快速解决啊... 最近我也遇到了这样的问题,经研究,把大致的解决思路拿出来共享. 1. python中习惯首先声 ...
- [Python]读写文件方法
http://www.cnblogs.com/lovebread/archive/2009/12/24/1631108.html [Python]读写文件方法 http://www.cnblogs.c ...
- 从用python自动生成.h的头文件集合和类声明集合到用python读写文件
最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...
- Python 3 读写文件的简单方法!
Python 3 读写文件的简单方法! a = open('test.txt','w') 这行代码创建了一个名为test的文本文档,模式是写入(模式分为三种,w代表写入,r代表阅读,a代表在尾行添加) ...
- 笨方法学python之读写文件、open函数的用法
一.python读写文件相关知识点 close:关闭文件 read:读取文件的内容//你可以把结果赋给一个变量 readline:只读取文件中的一行 truncate 美 /trʌŋ'ket/ :清空 ...
- Python中的文件IO操作(读写文件、追加文件)
Python中文件的读写包含三个步骤:打开文件,读/写文件,关闭文件. 文件打开之后必须关闭,因为在磁盘上读写文件的功能是由操作系统提供的,文件作为对象,被打开后会占用操作系统的资源,而操作系统在同一 ...
随机推荐
- 【学习】027 Dubbo
Dubbo概述 Dubbo的背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 ...
- crontab误删操作的恢复与防范
1.crontab -r 误删操作的恢复 语句解析:crontab -e 编辑 与 crontab -r 删除,由于e, r在键盘上是紧邻的,一旦误操作 crontab -r 将会删除每个用户的定时任 ...
- python3 + Tensorflow + Faster R-CNN训练自己的数据
之前实现过faster rcnn, 但是因为各种原因,有需要实现一次,而且发现许多博客都不全面.现在发现了一个比较全面的博客.自己根据这篇博客实现的也比较顺利.在此记录一下(照搬). 原博客:http ...
- python内存相关以及深浅拷贝讲解
3.9 内存相关 3.9.1 id,查看内存地址 >>> v1 = [11,22,33] >>> v2 = [11,22,33] >>> prin ...
- 常见状态码StatusCode
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求. ...
- requests 模块例题示范
requests 模块 re模块和requests模块结合示范实例 .*? 不加圆括号表示在要匹配里面的内容不要: (.*?)表示在要匹配的两者之间的内容都要: import requests imp ...
- select编程[回调+事件循环]
感觉比java写起来还要忧伤..... """ select , poll,epoll 注意: epoll并不一定比select的性能好,这需要看场景 1. 在高并发场景 ...
- linux登陆客户端自动执行命令
登陆客户端的时候,检查一下磁盘空间,内存,或是谁在线,每次都要手动去敲命令. 小技巧: cd ~ vi .bashrc 添加: echo "####Check Disk Use####&qu ...
- JS常用正则表达式验证
一.电话+手机 重点是正则表达式: var myreg=/^[1][3,4,5,7,8][0-9]{9}$/; 表达式的意思是: 1--以1为开头: 2--第二位可为3,4,5,7,8,中的任意一位: ...
- 序列式容器————dequeue
#include <deque> 双端队列,可以在队头队尾进行入队出队操作 deque<int> q; q.empty(); q.push_front(s);//将s插入到队头 ...