Python-13-文件读写

文件读写

一、文件读写简介

文件的操作可以叫做文件的I/O流操作

  • I/O
  • I表示 InputO表示 Output
  • 相对内存而言,读写磁盘的数据,读取数据到内存叫做Input,将数据写入到磁盘叫做Output

文件操作的作用:将文件数据保存到磁盘,方便后续的对数据的使用。

二、文件的基本操作

文件操作的步骤:

  1. 打开文件;
  2. 对文件进行读写;
  3. 关闭文件。

注意:其中第1和3步是必须的,第2步可选。

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

2.1 打开文件

在Python中,使用open()函数来打开磁盘文件,可以进行文件的读写,实质是在内存创建一个文件对象,文件对象是磁盘文件的在内存中的映射。

  • open的语法
open(file, mode='r', encoding=None)

参数的解释:

file:文件的路径(绝对路径或者相对路径),类型为str

mode='r':文件的打开模式(上面表格中的12种模式其中之一),默认为只读模式,类型为str

encoding=None:文件内容的编码格式,使用操作系统默认的编码格式。简体中文Windows的默认格式为GBK

  • 三种主模式(rwa
# r:只读模式。打开文件后,指定在文件的开关,如果文件不存在则报错,如果文件存在则创建文件对象
f = open('test.txt')
f.read()
f.close()

# w:只写模式。如果文件不存在,则创建文件。如果文件存在,会删除文件中所有的内容,再写入新内容。
f = open('test_02.txt', 'w')
f.write('abc')				# 文件内容为 abc
f.close()

# a:追加模式。在文件的末尾追加内容。如果文件不存在,则创建文件。
f = open('test_03.txt', 'a')
f.write('xyz')				# 文件内容为  原内容后追加 xyz
f.close()

2.2 文件对象的方法

2.2.1 读
  • read()
"""语法:
read(n: int = -1) -> AnyStr
参数解释:
n=-1:表示从指针处读取文件的字符个数,默认读取所有内容
"""

""" 文件内容:
汉字abcdefg
"""

f = open('test.txt')

content = f.read(1)
print(content)              # 汉
content = f.read(1)
print(content)              # 字

f.close()
  • readline()
""" 语法:
readline(limit: int = -1) -> AnyStr
参数解释:
limit:表示是字符个数。
"""

""" test.txt
abcdefg
hijklmn
0123456
"""

f = open('test.txt')


content = f.readline(2)		# 当参数limit小于一行的字符个数,则只读取指定的字符个数。
print(content)				# ab

content = f.readline(10)	# 。当参数limit大于一行字符个数,只读取到行尾。
print(content)				# cdefg

content = f.readline()
print(content)				# hijklmn


f.close()
  • readlines()
""" 语法:
readlines(hint: int = -1) -> List[AnyStr]
返回文件内容的列表,第一行作为列表中的一个元素,元素包括换行符\n

readlines必须读取到行尾,如果指定参数未读取到行尾,则会向后继续寻找行尾。
"""

""" test.txt
abcdefg
hijklmn
0123456
"""

f = open('test.txt')


content = f.readlines(2)	# 如果参数hint小于一行的字符数,则读取一行,并将这行作为列表返回
print(content)				# ['abcdefg\n']

content = f.readlines(10)	# 如果hint大于一行的字符数,则读取下一行的行尾
print(content)				# ['hijklmn\n', '0123456']


f.close()
  • list(文件对象)
""" test.txt
abcdefg
hijklmn
0123456
"""

f = open('test.txt')

lst = list(f)
print(lst)			# ['abcdefg\n', 'hijklmn\n', '0123456']

f.close()
  • 遍历文件对象
""" test.txt
abcdefg
hijklmn
0123456
"""

f = open('test.txt')
for i in f:
    print(i, end='')

f.close()

""" 输出结果:
abcdefg
hijklmn
0123456
"""
2.2.2 写
  • write()
""" 语法:
write(s: AnyStr) -> int
返回写入字符的个数。
"""

f = open('test_02.txt', mode='w')

n = f.write('200学')
print(n)			# 4

f.close()
2.2.3 二进制模式

打开文件的模式分为两种:文本模式t和二进制模式b,默认为文本模式

  • 二进制读写模式
""" test_03.txt
xyz
"""


# 1. 二进制模式读取
f = open('test_03.txt', 'rb')       # 二进制读写不能指定编码
# 读取
content = f.read()
print(content, type(content))           # b'xyz' <class 'bytes'>
f.close()


# 2. 二进制写入模式
f = open('test_03.txt', mode='wb')

f.write('\u4e2d'.encode())			# 文件中写入内容为:中

f.close()
2.2.4 指针操作
  • tell():返回文件当前的指针的位置
# 1.1 r模式,指针位置在文件开头
f = open('test.txt')
print(f.tell())             # 0
f.read(2)
print(f.tell())             # 2

f.close()


# 1.2 w模式,指针位置在文件开头
f = open('test.txt', 'w+')
print(f.tell())             # 0
f.write('abc')
print(f.tell())             # 3
print(f.read())             # ''
f.close()

# 1.3 a模式,指针位置在文件末尾
f = open('test.txt', 'a')
print(f.tell())             # 3
f.close()
  • seek():修改指针位置
""" 语法:
seek(offset, whence=0)
参数解释:
offset:从指定的whence位置偏移的字符(或者字节)个数,正整数表示向后偏移,负数表示向前偏移
whence=0:含义为指定指针的位置
0:表示文件开头,默认值
1:表示当前位置
2:表示文件末尾
"""


# 1. 文本模式下,偏移的单位为字符
f = open('test.txt')

print(f.tell())             # 0
f.read(1)
f.seek(0, 1)
f.seek(1, 1)			# 报错。在文本模式下,只允许相对于文件开头搜索(seek(0,2),seek(0, 1)是两个例外)
print(f.tell())             # 1

f.close()


# 2.2 二进制模式下,偏移的单位为字节
f = open('test.txt', 'rb')

f.seek(2, 1)
print(f.tell())                 # 2
f.seek(-1, 2)
print(f.read().decode())        # 6

f.close()

2.3 文件的高级模式

  • r+:以读写模式打开文件,文件对象的特性跟随主模式r
f = open('test.txt', 'r+')

print(f.tell())             # 0
f.write('012345678')        # 在r+模式下,调用write方法会众指针处置向后覆盖字符.包括空白字符

f.close()
  • w+:以读写模式打开文件,文件对象的特性跟随主模式w
f = open('test_02.txt', 'w+')

f.write('abcdefg')
f.seek(0)
print(f.read())             # ''

f.close()
  • a+:以读写模式打开文件,文件对象的特性跟随主模式a
f = open('test_03.txt', 'a+')

f.write('abcdefg')
print(f.tell())             # 7
f.seek(2, 0)
print(f.tell())             # 2
f.write('123')              # a模式下,调用write()方法,会忽略指针的位置,直接文件末尾追加

f.close()

三、文件备份

  • 案例:将一张图片复制到当前目录下
# 1. 需要两个文件对象
# 1.1 需要读取已有文件
f1 = open('png_01.png', 'rb')
# 1.2 需要实例化一个写入文件对象
f2 = open('png_03.png', 'wb')

# 2. 文件的复制
f2.write(f1.read())

# 3. 关闭文件对象
f2.close()
f1.close()

四、文件和目录操作

需要导入os模块,官方已经封装了关于系统操作的API

  • 语法
import os

os.函数名(参数)

4.1 文件或目录重命名

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)

4.2 删除文件

os.remove(path, *, dir_fd=None)

4.3 创建目录

os.mkdir(path, mode=511, *, dir_fd=None)

4.4 删除目录

os.rmdir(path, *, dir_fd=None)

4.5 获取当前的目录路径

os.getcwd()

4.6 切换目录

os.chdir(path)

4.7 获取指定目录下的所有文件和目录

os.listdir(path=None)

以上方法中的path形参可以为绝对路径或者相对路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值