python文件操作,笔记总结

这篇博客总结了Python中文件操作的方法,包括使用f=open('path', 'r')打开文件,使用f.close()关闭文件,以及try...finally语句确保文件安全关闭。详细介绍了read(), readline(), readlines()等读取文件内容的函数,以及linecache模块的使用。同时讲解了二进制文件、字符编码和写文件的操作,强调了使用with语句进行文件操作的重要性。" 133759284,10940365,Android 14正式发布:提升性能、隐私与定制化功能,"['Android开发', '系统更新', '性能优化', '隐私安全', '无障碍']
摘要由CSDN通过智能技术生成

声明:自己测试的网上的代码,存在自己的为知笔记中,方便以后使用,搬运过来,方便以后 查找,也希望有人和我一样喜欢这样整理的人能看到


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是个好习惯。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值