python open 相对路径_Python入门三部曲 | 第二节课:操作文件

28dbdd666102b12027700e0ffcab05b4.gif

学习目标      掌握 python 操作文件 b59612dcd0f87dff7d3cb9c7ba079630.gif

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

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

ad36006cefe6122f37271def68fc62e8.png

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 的文本文件,(注意编码方式)文件中写入下面的内容:

静夜思

床前明月光,疑是地上霜。 

举头望明月,低头思故乡。

操作基本步骤
# 打开文件 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 语句执行完毕会自动关闭文件句柄。

相对路径与绝对路径

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

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

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

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

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

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

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

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

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

逐行读取

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

  • 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 的二进制内容。

# mode=rb,不需要encoding参数

with open('test.txt', 'rb') as fb:

   content = fb.read()

   print(content)#

 也可以逐行读取,以\n换行符标志

with open('test.txt', 'rb') as fb:

   for line in fb:   

        print(line)

写文本文件 清除写 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模式会清除原文件内容,所以小心使用。

追加写 a

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

# mode=a 追加到文件的最后

with open('test.txt', 'a', encoding='utf-8') as fb:

   fb.write('静夜思\n床前明月光,疑是地上霜;\n举头望明月,低头思故乡。\n')

排他写 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')

锄禾
锄禾日当午,汗滴禾下土;
谁知盘中餐,粒粒皆辛苦。
静夜思
床前明月光,疑是地上霜;
举头望明月,低头思故乡。

案例:python 处理解析 CSV 文件

# 读取csv文件并解析为嵌套列表

data = []

with open('鸢尾.csv', 'r', encoding='gbk') as f:

   for line in f:

        # 去掉换行符

        line = line.strip()

       data.append(line.split(','))

data

[['id', '品种编号', '花瓣长', '花瓣宽', '花萼长', '花萼宽'],
['0', '0', '5.1', '3.5', '1.4', '0.2'],
['1', '0', '4.9', '3', '1.4', '0.2'],
['2', '0', '4.7', '3.2', '1.3', '0.2'],
['3', '0', '4.6', '3.1', '1.5', '0.2'],
['4', '0', '5', '3.6', '1.4', '0.2'],
['5', '0', '5.4', '3.9', '1.7', '0.4'],
['6', '0', '4.6', '3.4', '1.4', '0.3'],
['7', '0', '5', '3.4', '1.5', '0.2'],
['8', '0', '4.4', '2.9', '1.4', '0.2'],
['9', '0', '4.9', '3.1', '1.5', '0.1'],
['10', '0', '5.4', '3.7', '1.5', '0.2'],
['11', '0', '4.8', '3.4', '1.6', '0.2'],
['12', '0', '4.8', '3', '1.4', '0.1'],
['13', '0', '4.3', '3', '1.1', '0.1'],
['14', '0', '5.8', '4', '1.2', '0.2'],
['15', '0', '5.7', '4.4', '1.5', '0.4'],
['16', '0', '5.4', '3.9', '1.3', '0.4'],
['17', '0', '5.1', '3.5', '1.4', '0.3'],
['18', '0', '5.7', '3.8', '1.7', '0.3'],
['19', '0', '5.1', '3.8', '1.5', '0.3'],
['20', '0', '5.4', '3.4', '1.7', '0.2'],
['21', '0', '5.1', '3.7', '1.5', '0.4'],
['22', '0', '4.6', '3.6', '1', '0.2'],
['23', '0', '5.1', '3.3', '1.7', '0.5'],
['24', '0', '4.8', '3.4', '1.9', '0.2'],
['25', '0', '5', '3', '1.6', '0.2'],
['26', '0', '5', '3.4', '1.6', '0.4'],
['27', '0', '5.2', '3.5', '1.5', '0.2'],
['28', '0', '5.2', '3.4', '1.4', '0.2'],
['29', '0', '4.7', '3.2', '1.6', '0.2'],
['30', '0', '4.8', '3.1', '1.6', '0.2'],
['31', '0', '5.4', '3.4', '1.5', '0.4'],
['32', '0', '5.2', '4.1', '1.5', '0.1'],
['33', '0', '5.5', '4.2', '1.4', '0.2'],
['34', '0', '4.9', '3.1', '1.5', '0.1'],
['35', '0', '5', '3.2', '1.2', '0.2'],
['36', '0', '5.5', '3.5', '1.3', '0.2'],
['37', '0', '4.9', '3.1', '1.5', '0.1'],
['38', '0', '4.4', '3', '1.3', '0.2'],
['39', '0', '5.1', '3.4', '1.5', '0.2'],
['40', '0', '5', '3.5', '1.3', '0.3'],
['41', '0', '4.5', '2.3', '1.3', '0.3'],
['42', '0', '4.4', '3.2', '1.3', '0.2'],
['43', '0', '5', '3.5', '1.6', '0.6'],
['44', '0', '5.1', '3.8', '1.9', '0.4'],
['45', '0', '4.8', '3', '1.4', '0.3'],
['46', '0', '5.1', '3.8', '1.6', '0.2'],
['47', '0', '4.6', '3.2', '1.4', '0.2'],
['48', '0', '5.3', '3.7', '1.5', '0.2'],
['49', '0', '5', '3.3', '1.4', '0.2'],
['50', '1', '7', '3.2', '4.7', '1.4'],
['51', '1', '6.4', '3.2', '4.5', '1.5'],
['52', '1', '6.9', '3.1', '4.9', '1.5'],
['53', '1', '5.5', '2.3', '4', '1.3'],
['54', '1', '6.5', '2.8', '4.6', '1.5'],
['55', '1', '5.7', '2.8', '4.5', '1.3'],
['56', '1', '6.3', '3.3', '4.7', '1.6'],
['57', '1', '4.9', '2.4', '3.3', '1'],
['58', '1', '6.6', '2.9', '4.6', '1.3'],
['59', '1', '5.2', '2.7', '3.9', '1.4'],
['60', '1', '5', '2', '3.5', '1'],
['61', '1', '5.9', '3', '4.2', '1.5'],
['62', '1', '6', '2.2', '4', '1'],
['63', '1', '6.1', '2.9', '4.7', '1.4'],
['64', '1', '5.6', '2.9', '3.6', '1.3'],
['65', '1', '6.7', '3.1', '4.4', '1.4'],
['66', '1', '5.6', '3', '4.5', '1.5'],
['67', '1', '5.8', '2.7', '4.1', '1'],
['68', '1', '6.2', '2.2', '4.5', '1.5'],
['69', '1', '5.6', '2.5', '3.9', '1.1'],
['70', '1', '5.9', '3.2', '4.8', '1.8'],
['71', '1', '6.1', '2.8', '4', '1.3'],
['72', '1', '6.3', '2.5', '4.9', '1.5'],
['73', '1', '6.1', '2.8', '4.7', '1.2'],
['74', '1', '6.4', '2.9', '4.3', '1.3'],
['75', '1', '6.6', '3', '4.4', '1.4'],
['76', '1', '6.8', '2.8', '4.8', '1.4'],
['77', '1', '6.7', '3', '5', '1.7'],
['78', '1', '6', '2.9', '4.5', '1.5'],
['79', '1', '5.7', '2.6', '3.5', '1'],
['80', '1', '5.5', '2.4', '3.8', '1.1'],
['81', '1', '5.5', '2.4', '3.7', '1'],
['82', '1', '5.8', '2.7', '3.9', '1.2'],
['83', '1', '6', '2.7', '5.1', '1.6'],
['84', '1', '5.4', '3', '4.5', '1.5'],
['85', '1', '6', '3.4', '4.5', '1.6'],
['86', '1', '6.7', '3.1', '4.7', '1.5'],
['87', '1', '6.3', '2.3', '4.4', '1.3'],
['88', '1', '5.6', '3', '4.1', '1.3'],
['89', '1', '5.5', '2.5', '4', '1.3'],
['90', '1', '5.5', '2.6', '4.4', '1.2'],
['91', '1', '6.1', '3', '4.6', '1.4'],
['92', '1', '5.8', '2.6', '4', '1.2'],
['93', '1', '5', '2.3', '3.3', '1'],
['94', '1', '5.6', '2.7', '4.2', '1.3'],
['95', '1', '5.7', '3', '4.2', '1.2'],
['96', '1', '5.7', '2.9', '4.2', '1.3'],
['97', '1', '6.2', '2.9', '4.3', '1.3'],
['98', '1', '5.1', '2.5', '3', '1.1'],
['99', '1', '5.7', '2.8', '4.1', '1.3'],
['100', '2', '6.3', '3.3', '6', '2.5'],
['101', '2', '5.8', '2.7', '5.1', '1.9'],
['102', '2', '7.1', '3', '5.9', '2.1'],
['103', '2', '6.3', '2.9', '5.6', '1.8'],
['104', '2', '6.5', '3', '5.8', '2.2'],
['105', '2', '7.6', '3', '6.6', '2.1'],
['106', '2', '4.9', '2.5', '4.5', '1.7'],
['107', '2', '7.3', '2.9', '6.3', '1.8'],
['108', '2', '6.7', '2.5', '5.8', '1.8'],
['109', '2', '7.2', '3.6', '6.1', '2.5'],
['110', '2', '6.5', '3.2', '5.1', '2'],
['111', '2', '6.4', '2.7', '5.3', '1.9'],
['112', '2', '6.8', '3', '5.5', '2.1'],
['113', '2', '5.7', '2.5', '5', '2'],
['114', '2', '5.8', '2.8', '5.1', '2.4'],
['115', '2', '6.4', '3.2', '5.3', '2.3'],
['116', '2', '6.5', '3', '5.5', '1.8'],
['117', '2', '7.7', '3.8', '6.7', '2.2'],
['118', '2', '7.7', '2.6', '6.9', '2.3'],
['119', '2', '6', '2.2', '5', '1.5'],
['120', '2', '6.9', '3.2', '5.7', '2.3'],
['121', '2', '5.6', '2.8', '4.9', '2'],
['122', '2', '7.7', '2.8', '6.7', '2'],
['123', '2', '6.3', '2.7', '4.9', '1.8'],
['124', '2', '6.7', '3.3', '5.7', '2.1'],
['125', '2', '7.2', '3.2', '6', '1.8'],
['126', '2', '6.2', '2.8', '4.8', '1.8'],
['127', '2', '6.1', '3', '4.9', '1.8'],
['128', '2', '6.4', '2.8', '5.6', '2.1'],
['129', '2', '7.2', '3', '5.8', '1.6'],
['130', '2', '7.4', '2.8', '6.1', '1.9'],
['131', '2', '7.9', '3.8', '6.4', '2'],
['132', '2', '6.4', '2.8', '5.6', '2.2'],
['133', '2', '6.3', '2.8', '5.1', '1.5'],
['134', '2', '6.1', '2.6', '5.6', '1.4'],
['135', '2', '7.7', '3', '6.1', '2.3'],
['136', '2', '6.3', '3.4', '5.6', '2.4'],
['137', '2', '6.4', '3.1', '5.5', '1.8'],
['138', '2', '6', '3', '4.8', '1.8'],
['139', '2', '6.9', '3.1', '5.4', '2.1'],
['140', '2', '6.7', '3.1', '5.6', '2.4'],
['141', '2', '6.9', '3.1', '5.1', '2.3'],
['142', '2', '5.8', '2.7', '5.1', '1.9'],
['143', '2', '6.8', '3.2', '5.9', '2.3'],
['144', '2', '6.7', '3.3', '5.7', '2.5'],
['145', '2', '6.7', '3', '5.2', '2.3'],
['146', '2', '6.3', '2.5', '5', '1.9'],
['147', '2', '6.5', '3', '5.2', '2'],
['148', '2', '6.2', '3.4', '5.4', '2.3'],
['149', '2', '5.9', '3', '5.1', '1.8']]

# 将数据写为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)

content # '锄禾\n' 三个字符

with open('test.txt', 'rb') as f: 

    content = f.read(3) 

    print(content)

'锄'.encode('utf-8') # 三个字节

当以读的方式打开文件后文件指针指向文件开头,执行 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())

content.encode('utf-8')

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())

说明:本文为柠檬班心蓝老师原创,转载需注明出处

1476701af9fa4eb409b98d52f6a5f7b0.png 获取Python 相关视频资料

49cc0bccc8a820e0fbc854d9b3a12314.png

2da4dedeabb37c8b66e8d99627e4bbe9.png

可加多多老师微信 13327216354 或者扫描下方二维码 8d01f998e92f4c16ac418e9b3ca67ed9.png 048f8558bd43a80d911952b7f2b1f5bb.png 787ba5ed24bc9775fd76bfc96f8f8ed8.gif 242d2f4ec68dafcc4d6a31c95dcc5785.png 1a8ee6948defed98c480535856e219e3.png 62c618fb8c3ecbd28715195ce9013af9.png 960629c070122c85015f4dbe157c36e8.png 8ecb1009d56ef21936d1011aa534814a.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值