码迷,mamicode.com
首页 > 编程语言 > 详细

重新学习python系列(三)? WTF?

时间:2017-06-11 00:27:37      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:obj   接收   表示   网络流   缓冲   特定   users   erro   情况   

读取文件:

try:
    f = open(‘/path/to/file‘, ‘r‘)
    print(f.read())
finally:
    if f:
        f.close()

-------------------------------------

with open(‘/path/to/file‘, ‘r‘) as f:
    print(f.read())

-------------------------------------

调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list

f = open(‘/path/to/file‘, ‘r‘)
for line in f.readlines():
    print(line.strip()) # 把末尾的‘\n‘删掉

 

 

写文件

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

f = open(‘/Users/michael/test.txt‘, ‘w‘)
f.write(‘Hello, world!‘)
f.close()
---------------------------
with open(‘/Users/michael/test.txt‘, ‘w‘) as f:
    f.write(‘Hello, world!‘)

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

 

 

file-like Object

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‘)
>>> f.read()
b‘\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...‘ # 十六进制表示的字节

 

 

字符编码

要读取非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‘)

 

写入内存 StringIO 

getvalue()方法用于获得写入后的str。

from io import StringIO
f = StringIO()
f.write(u‘hello‘)
f.write(u‘ ‘)
f.write(u‘world‘)
print f.getvalue()

要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:
>>> from io import StringIO >>> f = StringIO(‘Hello!\nHi!\nGoodbye!‘) >>> while True: ... s = f.readline() ... if s == ‘‘: ... break ... print(s.strip()) ... Hello! Hi! Goodbye!

 

 

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

>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write(‘中文‘.encode(‘utf-8‘))
6
>>> print(f.getvalue())
b‘\xe4\xb8\xad\xe6\x96\x87‘

 可以用一个bytes初始化BytesIO,然后,像读文件一样读取

>>> from io import BytesIO
>>> f = BytesIO(b‘\xe4\xb8\xad\xe6\x96\x87‘)
>>> f.read()
b‘\xe4\xb8\xad\xe6\x96\x87‘

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

重新学习python系列(三)? WTF?

标签:obj   接收   表示   网络流   缓冲   特定   users   erro   情况   

原文地址:http://www.cnblogs.com/Bgod/p/6980247.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!