文件2:文件读写方法

本文详细介绍了Python中文件的读写操作,包括f.writable()、f.write(text)、f.writelines(lines)用于写入文件,以及f.readable()、f.read(size)、f.readline(size)、f.readlines(sizehint)用于读取文件的方法。讨论了不同模式下文件指针的位置变化和各种情况下的注意事项,例如中文字符的处理和换行符的影响。

目录

1. 写入文件

1.1 f.writable()

1.2 f.write(text, /)

1.3 f.writelines(lines, /)

2. 读取文件

2.1 f.readable()

2.2 f.read(size=-1, /)

2.3 f.readline(size=-1, /)

2.4 f.readlines(sizehint=-1, /)


1. 写入文件

1.1 f.writable()

判断该文件对象是否支持写入(如果返回的值为 False,则调用 write() 方法会导致 OSError 异常);

通过 'w'、'x'、'a'、'r+' 模式打开文件,对文件做 .writable() 函数判断,返回True;

通过 'r' 模式打开文件,对文件做 .writable() 函数判断,返回False。

# 'r' 模式打开文件test.txt,文件不可读
f = open(r'E:\David\Code\python\文件\test.txt','r')
f.writable()
False

1.2 f.write(text, /)

将字符串写入到文件对象中,并返回写入的字符数量(字符串的长度);

从已有数据中间开始写入时,注意中文及中文符号占据2字节,如输入数据覆盖中文及中文符号一半字节,则数据出现乱码;

写入的中文及中文符号,在返回字符串长度中只占据1个长度,但文件指针判断中,中文及中文符号占据2个长度;

f = open(r'D:\PycharmProject\测试文件\test.txt','w+')

#写入的中文及中文符号,在返回字符串长度中占据1个长度
f.write('中文测试中01234abcde @#$%')
20

#写入的中文及中文符号,在文件指针判断中占据2个长度
f.tell()
25

写入的转义字符整体算作一个字符,文件指针判断中,'\t' 占据1个位置、'\n' 占据两个位置;

f = open(r'D:\PycharmProject\测试文件\test.txt','w+')
f.write('\t123\n')
5

#读取 '\t' 后,文件指针移动位置 1-0 = 1
f.seek(0)
0
f.read(1)
'\t'
f.tell()
1
f.read(3)
'123'

#读取 '\n' 后,文件指针移动位置 6-3 = 2
f.tell()
4
f.read()
'\n'
f.tell()
6

'w' 模式打开文件:

写入操作为从当前文件指针开始用待写入字符串做覆盖/新增;

写入完成后,指针移动到新写入字符串后1位;

f = open(r'D:\PycharmProject\测试文件\test.txt','w+')

#'w' 模式打开文件后,从当前文件指针(位置0)开始用待写入字符串做新增
f.tell()
0
f.write('0123456789')
10

#写入完成后,指针移动到新写入字符串后1位(位置10)
f.tell()
10

#从写入位置0,读取返回数据与写入数据一致
f.seek(0)
0
f.read()
'0123456789'

#'w' 模式打开文件后,从当前文件指针(位置0)开始用待写入字符串做覆盖
f.write('abcde')
5

#写入完成后,指针移动到新写入字符串后1位(位置5)
f.tell()
5

#从写入位置0,读取返回数据,位置0-位置4数据被覆盖
f.seek(0)
0
f.read()
'abcde56789'

'x'、'r+' 模式打开文件:

写入操作与 'w' 模式一致,为从当前文件指针开始用待写入字符串做覆盖/新增;

写入完成后,指针移动到新写入字符串后1位;

#'x' 模式打开文件,做写入操作测试
f = open(r'D:\PycharmProject\测试文件\test.txt','x+')
f.write('0123456789')
10
f.seek(3)
3
f.write('abcde')
5
f.seek(0)
0
f.read()
'012abcde89'
f.close()

#'r+' 模式打开文件,做写入操作测试
f = open(r'D:\PycharmProject\测试文件\test.txt','r+')
f.tell()
0
f.write('!@#$%')
5
f.tell()
5
f.seek(0)
0
f.read()
'!@#$%cde89'

'a'模式打开文件:

写入操作与上述几种模式不一样,为从当前文件末尾指针eof(end of file)开始用待写入字符串做新增;

用 seek() 方法修改文件指针后,再做写入,仍从 eof 新增;

#'a' 模式打开文件,做写入操作测试
f = open(r'D:\PycharmProject\测试文件\test.txt','a+')

#初始位置即在文件末尾,读取初始文件内容
f.tell()
10
f.seek(0)
0
f.read()
'!@#$%cde89'

#做写入操作,从eof开始新增
f.write('中国')
2
f.seek(0)
0
f.read()
'!@#$%cde89中国'

#将文件指针移动到文件中部,做写入操作,仍从eof开始新增
f.seek(5)
5
f.read()
'cde89中国'
f.seek(5)
5
f.write('12345')
5
f.seek(0)
0
f.read()
'!@#$%cde89中国12345'

1.3 f.writelines(lines, /)

将一系列字符串写入到文件对象中,支持写入字符串,和只有字符串元素的列表、元组、集合,只有字符串键的字典;

从已有数据中间开始写入时,注意中文及中文符号占据2字节,如输入数据覆盖中文及中文符号一半字节,则数据出现乱码;

列表、元组元素和字典的键,按顺序添加到文件中,集合则以乱序添加;

通过列表、元组、集合、字典等形式写入多条字符串时,不会自动给每跳字符串添加换行符,如需换行,则添加 '\n' ;

写入操作与 f.wirte() 一致,通过 'w'、'x'、'r+' 模式打开文件,从当前文件指针开始用待写入字符串做覆盖/新增,写入完成后,指针移动到新写入字符串后1位;通过 'a' 模式打开文件,从当前文件末尾指针eof(end of file)开始用待写入字符串做新增。

#'x+' 模式打开文件
f = open(r'D:\PycharmProject\测试文件\test.txt','x+')

#写入列表,指针移动到新写入字符串后1位
f.writelines(['123','abc','中文','@$ ^'])
f.tell()
14
f.seek(0)
0
f.read()
'123abc中文@$ ^'
#移动指针到位置5,写入字符串,覆盖原有数据
f.seek(5)
5
f.writelines('XYZ')
f.seek(0)
0
f.read()
'123abXYZ文@$ ^'
f.close()

#'w+' 模式打开文件
f = open(r'D:\PycharmProject\测试文件\test.txt','w+')

#写入集合,多条字符串以乱序写入文件
f.writelines({'531','*( )','aSwF','天地万物'})
f.tell()
19
f.seek(0)
0
f.read()
'aSwF*( )531天地万物'

#'r+' 模式打开文件
f = open(r'D:\PycharmProject\测试文件\test.txt','r+')

#移动指针到位置7,写入字典,字典键覆盖原有数据
f.seek(7)
7
f.writelines({'Y4#':1,'1 %中':2})
f.seek(0)
0
f.read()
'aSwF*( Y4#1 %中万物'

#'a+' 模式打开文件
f = open(r'D:\PycharmProject\测试文件\test.txt','a+')

#移动指针到位置0,写入元组,数据仍从指针eof开始添加
f.seek(0)
0
f.writelines(('xx\nxxx\txx'))
f.seek(0)
0
#转义字符'\n'、'\t'生效
print(f.read())
aSwF*( Y4#1 %中万物xx
xxx	xx

2. 读取文件

2.1 f.readable()

判断该文件对象是否支持读取(如果返回的值为 False,则调用 read() 方法会导致 OSError 异常);

通过'r' 模式,或者 'w'、'x'、'a' 与 '+' 组合为如 'w+' 这样的模式打开文件,对文件做 .readable() 函数判断,返回True;

通过 'w'、'x'、'a' 模式打开文件,对文件做 .readable() 函数判断,返回False。

#通过 'w'、'x'、'a' 模式打开文件,对文件做 .readable() 函数判断,返回False
f = open(r'D:\PycharmProject\测试文件\test.txt','w')
f.readable()
False
f = open(r'D:\PycharmProject\测试文件\test.txt','a')
f.readable()
False
f = open(r'D:\PycharmProject\测试文件\test2.txt','x')
f.readable()
False

#通过'r' 模式,或者 'w'、'x'、'a' 与 '+' 组合为如 'w+' 这样的模式打开文件,对文件做 .readable() 函数判断,返回True
f = open(r'D:\PycharmProject\测试文件\test.txt','w+')
f.readable()
True
f = open(r'D:\PycharmProject\测试文件\test.txt','r')
f.readable()
True

2.2 f.read(size=-1, /)

从文件对象中读取指定数量的字符(或者遇到 EOF 停止);

当参数 size 赋值 >= 0 时,从当前文件指针开始读取指定数量字符,超过剩余长度时则遇到EOF停止;

当参数 size 未指定,或该参数为负值的时候,从当前文件指针开始读取剩余的所有字符;

size 读取中文及中文符号时,每个中文及中文符号占据 size 的一个长度,但此时文件指针移动2个位置;

size 读取转义字符,转义字符占据 size 的一个长度,但此时文件指针 '\t' 移动1个位置、'\n' 移动2个位置;

通过 f.read() 读取文件,读取完成后,文件指针移动到读取数据后一位。

#清空打开文件,写入数据,并将文件位置置为0
f = open(r'D:\PycharmProject\测试文件\test.txt','w+')
f.write('中文测试中01234abcde @#$%')
20
f.seek(0)
0

#size为0,读取空数据,文件指针未移动
f.read(0)
''
f.tell()
0

#size为5,读取5个中文字符,此时文件指针移动10个位置
f.read(5)
'中文测试中'
f.tell()
10

#size为负数,读取所有剩余数据,文件指针移动到eof
f.read(-5)
'01234abcde @#$%'
f.tell()
25

#size超过剩余长度,读取数据,直到eof停止
f.seek(5)
5
f.read(100)
'01234abcde @#$%'
f.tell()
25

2.3 f.readline(size=-1, /)

从文件对象中读取指定一行字符串(包括换行符),遇到换行符 '\n' 或 EOF 停止;

当参数 size 赋值 >= 0 时,从当前文件指针开始读取指定数量字符,超过当前行剩余长度时则遇到换行符 '\n' 或 EOF停止;

当参数 size 未指定,或该参数为负值的时候,从当前文件指针开始读取当前行剩余的所有字符;

size 读取中文及中文符号时,每个中文及中文符号占据 size 的一个长度,但此时文件指针移动2个位置;

size 读取转义字符,转义字符占据 size 的一个长度,但此时文件指针 '\t' 移动1个位置、'\n' 移动2个位置;

通过 f.read() 读取文件,读取完成后,文件指针移动到读取数据后一位。

#'w+' 模式清空打开文件,写入多行字符串,并将位置置为0
f = open(r'D:\PycharmProject\测试文件\test.txt','w+')
f.write('中a文b一c二d三e\n0123456789\n*****\t*****\n-----')
39
f.tell()
47
f.seek(0)
0

#size为0,读取空数据,文件指针未移动
f.readline(0)
''
f.tell()
0

#size超过剩余长度,读取数据,直到换行符'\n'停止
f.readline(100)
'中a文b一c二d三e\n'
f.tell()
17

#size为5,读取5个字符
f.readline(5)
'01234'
f.tell()
22

#size为空,默认读取当前行所有剩余数据
f.readline()
'56789\n'
f.tell()
29

#size为负数,读取当前行所有剩余数据
f.readline(-5)
'*****\t*****\n'
f.tell()
42

2.4 f.readlines(sizehint=-1, /)

从文件对象中读取所有行并将其作为一个行列表返回,每一行作为列表中的一个元素,每行类容包括换行符,具体读取参见章节2.3;

当参数 sizehint 赋值 >= 0 时,从当前文件指针开始读取指定数量字符,并将每行内容作为元素添加到列表中,sizehint 范围内最后一行长度超出,则仍旧读取该行,直到下一个换行符 '\n' 或 EOF停止;

当参数 sizehint 未指定,或该参数为负值的时候,从当前文件指针开始读取所有字符;

size 读取中文及中文符号时,每个中文及中文符号占据 size 的一个长度,但此时文件指针移动2个位置;

size 读取转义字符,转义字符占据 size 的一个长度,但此时文件指针 '\t' 移动1个位置、'\n' 移动2个位置;

通过 f.readlines() 读取文件,读取完成后,文件指针移动到读取数据后一位。

#'w+' 模式清空打开文件,写入多行字符串,并将位置置为0
f = open(r'E:\\David\\Code\\python\\文件\\text.txt','w+')
f.write('中a文b一c二d三e\n0123456789\n*****\t*****\n-----')
f.seek(0)
0

#默认读取所有行并将其作为一个行列表返回,
f.readlines()
['中a文b一c二d三e\n', '0123456789\n', '*****\t*****\n', '-----']
f.seek(0)
0

#当参数 sizehint 赋值 >= 0 时,从当前文件指针开始读取指定数量字符
#sizehint 范围内最后一行长度超出,则仍旧读取该行
f.readlines(18)
['中a文b一c二d三e\n', '0123456789\n']

#当参数 sizehint 未指定,或该参数为负值的时候,从当前文件指针开始读取所有字符
f.readlines(-5)
['*****\t*****\n', '-----']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃烧的火鸟啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值