Python 操作文件

python提供内置函数open()实现对文件的操作。

python对文本文件和二进制文件采用统一的操作步骤,和把大象放冰箱里一样分三步,“打开-操作-关闭。”

在这里插入图片描述

open函数

open(file, mode='r', encoding=None)

打开文件并返回对应的file object。如果该文件不能打开,则触发OSError。

  • file 包含文件名的字符串,可以是绝对路径,可以是相对路径。
  • mode 一个可选字符串,用于指定打开文件的模式。默认值r表示文本读。
  • encoding 文本模式下指定文件的字符编码

mode的取值:

字符意义
‘r’文本读取(默认)
‘w’文本写入,并先清空文件(慎用),文件不存在则创建
‘x’文本写,排它性创建,如果文件已存在则失败
‘a’文本写,如果文件存在则在末尾追加,不存在则创建

和mode组合的字符

字符意义
‘b’二进制模式,例如:'rb’表示二进制读
‘t’文本模式(默认),例如:rt一般省略t
‘+’读取与写入,例如:‘r+’ 表示同时读写

一.读文本文件

在当前目录下创建一个名为test.txt的文本文件,(注意编码方式)文件中写入下面的内容:

静夜思
床前明月光,疑是地上霜。
举头望明月,低头思故乡。

1.1操作基本步骤

# 打开文件 mode=rt,t可以省略
fb = open('test.txt', 'r', encoding='utf-8')
# 读取
content = fb.read()
print(content)
# 关闭文件
fb.close()

上面这种操作经常会忘记关闭文件句柄,造成资源浪费,所以处理文件往往使用with语句进行上下文管理。

with open('test.txt', 'r', encoding='utf-8') as fb:
    content = fb.read()
    print(content)

with语句执行完毕会自动关闭文件句柄。

1.2相对路径与绝对路径

进行文件处理时经常会碰到相对路径和绝对路径的问题。

绝对路径好理解,它指定了文件在电脑中的具体目录,以windows电脑为例:

d:\lemon\课件\python入门.md

相对路径一般是指相对当前脚本的路径,比如上面的案例中的test.txt因为和当前脚本在同一个文件夹下,所以可以直接使用test.txt作为文件名来操作。

也可显式的表达当前路径./test.txt,./表示当前目录。

…/表示上级目录,同理…/…/表示上上级目录,依此类推。

那什么时候使用相对路径,什么时候使用绝对路径呢。

一般情况下项目本身的资源文件和脚本路径相对固定,为了不影响项目的移植性,必须使用相对路径。

如果需要读取操作系统中固定位置的系统文件一般使用绝对路径。

1.3逐行读取

在读取文本文件时,经常需要按行读取,文件对象提供了多种方法进行按行读取。

readline

从文件中读取一行;如果 f.readline() 返回一个空的字符串,则表示已经到达了文件末尾

with open('test.txt', 'r', encoding='utf-8') as fb:
    print(fb.readline())
    print(fb.readline())
    print(fb.readline())
    print(fb.readline())
readlines

以列表的形式返回文件中所有的行。

with open('test.txt', 'r', encoding='utf-8') as fb:
    content = fb.readlines()
    print(content)
迭代

要从文件中读取行,还可以循环遍历文件对象。这是内存高效,快速的,并简化代码:

# 5星推荐
with open('test.txt', 'r', encoding='utf-8') as fb:
    for line in fb:
        print(line)

二.读二进制文件

任何文件都可以以二进制读的方式打开,读取test.txt的二进制内容。

2.1全部读

# mode=rb,不需要encoding参数
with open('test.txt', 'rb') as fb:
    content = fb.read()
    print(content)

2.2逐行读取

# 也可以逐行读取,以\n换行符标志
with open('test.txt', 'rb') as fb:
    for line in fb:
        print(line)

三.写文本文件

3.1清除写w

案例:将锄禾这首诗写入test.txt文件中

# mode=w 没有文件就创建,有就清除内容,小心使用
with open('test.txt', 'w', encoding='utf-8') as fb:
    fb.write('锄禾\n')
    fb.write('锄禾日当午,汗滴禾下土;\n')
    fb.write('谁知盘中餐,粒粒皆辛苦。\n')

运行后会发现之前写有静夜思的test.txt内容修改为锄禾,因为w模式会清除原文件内容,所以小心使用。

3.2追加写 a

案例:将静夜思这首诗追加到test.txt文件中

# mode=a 追加到文件的最后
with open('test.txt', 'a', encoding='utf-8') as fb:
    fb.write('静夜思\n床前明月光,疑是地上霜;\n举头望明月,低头思故乡。\n')

3.3排他写x

案例:在当前目录中创建文件test.txt,存在则不创建

# mode=x
try:
    with open('test.txt', 'x', encoding='utf-8') as fb:
        fb.write('')
except Exception as e:
    print(e)
[Errno 17] File exists: 'test.txt'

四.写二进制文件

在写模式后加b即是写二进制模式,这种模式下写入内容为字节数据。

# 例如:将爬到的图片二进制信息写入文件中。

import requests

url = 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1247698508,1430079989&fm=26&gp=0.jpg'

response = requests.get(url)

with open('校花.jpg', 'wb') as f:
    f.write(response.content)

五.读写文件

有时候需要能够同时读写文件,在模式后面加上+号即可给读模式添加写,给写模式添加读。

with open('test.txt', 'r+', encoding='utf-8') as f:
    # 读文件
    print(f.read())
    f.write('草\n离离原上草,一岁一枯荣;\n野火烧不尽,春风吹又生!\n')
锄禾
锄禾日当午,汗滴禾下土;
谁知盘中餐,粒粒皆辛苦。
静夜思
床前明月光,疑是地上霜;
举头望明月,低头思故乡。
# 将数据写为csv文件
with open('test.csv', 'w', encoding='utf-8') as f:
    for item in data:
        f.write(','.join(item) + '\n')

文件指针
open函数返回的文件对象使用文件指针来记录当前在文件中的位置。

read方法

在读模式下,使用文件对象的read方法可以读取文件的内容。它接收一个整数参数表示读取内容的大小,文本模式下表示字符数量,二进制模式下表示字节大小。

with open('test.txt', 'r', encoding='utf-8') as f:
    content = f.read(3)
    print(content)
with open('test.txt', 'rb') as f:
    content = f.read(3)
    print(content)

当以读的方式打开文件后文件指针指向文件开头,执行read操作之后,根据读取的数据大小指针移动到对应的位置。

tell方法

文件对象的tell方法返回整数,表示文件指针距离文件开头的字节数。

with open('test.txt', 'r', encoding='utf-8') as f:
    print(f.tell())
    content = f.read(3)
    print(content)
    print(f.tell())

r模式打开文件后文件指针指向文件开头,执行read操作之后,根据读取的数据大小指针移动到对应的位置。

with open('test.txt', 'a', encoding='utf-8') as f:
    print(f.tell())
a模式打开文件后文件指针指向文件末尾。

seek方法

通过文件对象的seek方法可以移动文件句柄

seek方法接收两个参数:

offset 表示偏移指针的字节数
whence 表示偏移参考,默认为0
0 表示偏移参考文件的开头,offset必须是>=0的整数
1 表示偏移参考当前位置,offset可以是负数
2 表示偏移参考文件的结尾,offset一般是负数

注意文本模式下只允许从文件的开头进行偏移,也即只支持whence=0

with open('test.txt', 'r', encoding='utf-8') as f:
    print(f.read(3))
    # 跳转到文件开头
    f.seek(0)
    # 再读取第一个字
    print(f.read(1))
with open('test.txt', 'rb') as f:
    # 读取文件最后的10字节
    f.seek(-10,2)
    print(f.read())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值