声明:自己测试的网上的代码,存在自己的为知笔记中,方便以后使用,搬运过来,方便以后 查找,也希望有人和我一样喜欢这样整理的人能看到
f=open(‘path’,'r')
Python内置的open()
函数,传入文件名和标示符:
f = open('/Users/michael/test.txt', 'r')
f.close()方法
关闭文件。文件使用完毕后必须关闭,
因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:
>>> f.close() #不像c那样close(fp);
try......finally
由于文件读写时都有可能产生IOError
,一旦出错,后面的f.close()
就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally
来实现:
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()
但是太繁琐,Python引入了with
语句来自动帮我们调用close()
方法,码更佳简洁,并且不必调用f.close()
方法。
一、read([size])方法
从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象
read()如果文件很小,一次性读取最方便;
read(size)如果不能确定文件大小,反复调用比较保险;
f = open("a.txt")
lines = f.read() #一次读完文件
print (lines)
print(type(lines))
f.close()
二、readline()方法
从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
f = open("a.txt")
line = f.readline()
print(type(line))
while line: #一次读取一行,读不到为止,line作boolen型
print (line,)
line = f.readline() #一次读取一行
f.close()
三、readlines()
读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。
f = open("a.txt")
lines = f.readlines() #lines为一个列表,每一个元素为一行字符串
print(type(lines))
for line in lines: #循环输出列表元素
print (line,)
f.close()
四、linecache模块
有特殊需求还可以用linecache模块,比如你要输出某个文件的第n行
import linecache
text = linecache.getline('a.txt',2)
print (text,)
五、总结
"""
1、读取文件的三个方法:read()、readline()、readlines()
2、三个方法均可接受一个变量用以限制每次读取的数据量,通常不使用该变量。
"""
"""
关于read()方法:
1、读取整个文件,将文件内容放到一个字符串变量中
2、如果文件大于可用内存,不可能使用这种处理
"""
file_object = open("test.py",'r') #创建一个文件对象,也是一个可迭代对象
try:
all_the_text = file_object.read() #结果为str类型
print type(all_the_text)
print "all_the_text=",all_the_text
finally:
file_object.close()
"""
关于readline()方法:
1、readline()每次读取一行,比readlines()慢得多
2、readline()返回的是一个字符串对象,保存当前行的内容
"""
file_object1 = open("test.py",'r')
try:
while True:
line = file_object1.readline()
if line:
print "line=",line
else:
break
finally:
file_object1.close()
"""
关于readlines()方法:
1、一次性读取整个文件。
2、自动将文件内容分析成一个行的列表。
"""
file_object2 = open("test.py",'r')
try:
lines = file_object2.readlines()
print "type(lines)=",type(lines) #type(lines)= <type 'list'>
for line in lines:
print "line=",line
finally:
file_object2.close()
file-like Object
像open()
函数返回的这种有个read()
方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()
方法就行。
StringIO
就是在内存中创建的file-like Object,常用作临时缓冲。
二进制文件
前面讲的默认都是读取文本文件,并且是ASCII编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'
模式打开文件即可:
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
字符编码
要读取非ASCII编码的文本文件,就必须以二进制模式打开,再解码。比如GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'rb')
>>> u = f.read().decode('gbk')
>>> u
u'\u6d4b\u8bd5'
>>> print u
测试
如果每次都这么手动转换编码嫌麻烦(写程序怕麻烦是好事,不怕麻烦就会写出又长又难懂又没法维护的代码),Python还提供了一个codecs
模块帮我们在读文件时自动转换编码,直接读出unicode:
import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
f.read() # u'\u6d4b\u8bd5'
写文件
写文件和读文件是一样的,唯一区别是调用open()
函数时,传入标识符'w'
或者'wb'
表示写文本文件或写二进制文件:
>>> f = open('/Users/michael/test.txt', 'w')
>>> f.write('Hello, world!')
>>> f.close()
你可以反复调用write()
来写入文件,但是务必要调用f.close()
来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with
语句来得保险:
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
要写入特定编码的文本文件,请效仿codecs
的示例,写入unicode,由codecs
自动转换成指定编码。
小结
在Python中,文件读写是通过open()
函数打开的文件对象完成的。使用with
语句操作文件IO是个好习惯。