ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

文件读写、文件的相关知识点

2022-06-30 19:32:04  阅读:139  来源: 互联网

标签:知识点 读取 f1 read 读写 文件 print open


文件读写、文件的相关知识点

文件读写

模式 描述
r 只能读方式打开文本文件,不能写文件,文件路径必须存在
w 只能写方式打开文本文件,不能读文件,文件路径不存在则创建
a 打开文本文件在末尾追加内容,文件路径不存在则创建,文件路径存在清空原本内容
t 默认的文本模式
rb 以二进制格式打开文件只能读取内容,不能写内容。
wb 以二进制格式打开文件只能写内容,不能读取,文件路径不存在则创建
ab 以二进制格式打开文件在末尾追加内容,文件路径不存在则创建
x 写模式,新建一个文件,如果该文件已存在则会报错
r+ 打开文件用于读写
w+ 打开文件用于读写,文件路径不存在则会创建,文件路径存在清空原本内容,写入新的内容
a+ 打开文件用于在末尾追加内容,文件路径不存在则创建,文件路径存在则会在末尾追加内容

1、读:read()

一次性可全部读取文件内容并且光标会停留在文件末尾,继续则返回的值为空。且可在read()括号内加入要读取的字符的个数或字节的个数。当文件路径不存在时,会报错。

# 读取一次后不能再次读取,读取会将光标停留在内容末尾,因为第一次读取后光标移至末尾,光标后面没有内容了,所有读取不了
with open(r'a.txt', 'r', encoding='utf8') as f1:
    data = f1.read()
    print(data)
    data1 = f1.read()
    print(data1)

2、写:write()

写入内容到文件中,要注意的是写入的字符串也可以是二进制数据。且write()方法不会在字符串的结尾自动加上换行符。

# 只写入内容,清除原来的内容
with open(r'a.txt', 'w', encoding='utf8') as f1:
    f1.write('今天不适合出门\n')
    f1.write('因为今天太热了\n')

3、open()、close()

open()方法可打开多个文件,open括号里面有三个值,分别是文件路径、何种方式(读或写或追加)、最后是编码encoding。但是如果是二进制的模式下,编码encoding不用写。close()是通过代码关闭文件,避免内存的占用。用with open() as 变量名:方式程序会自动关闭文件。

with open(r'a.txt', 'r', encoding='utf8') as f1, open(r'b.txt', 'r', encoding='utf8') as f2,open(r'c.txt', 'r', encoding='utf8') as f3:
    pass

4、readline()、readlines()

readline()读取文件时是一次只读一行内容,除了用文本方式打开文件读外也可以读取二进制方式打开文件,但读取的数据返回的是bytes类型,若有中文使用GBK模式解码。

readlines()读取文件是一次读取多行数据,并存放人一个列表中,官方文档说可用于控制读取的行数,如果总行数数量超出了参数指定的大小,只会读取该参数指定的大小。

# 一次仅读取一行内容
with open(r'a.txt', 'r', encoding='utf8') as f1:
    data = f1.readline()
    print(data)     # 今天天气好热
    data1 = f1.readline()
    print(data1)    # 浩哥说有大风
    
# 一次读取多行内容,以列表的形式输出返回,且会出现有换行符(内容换行)
with open(r'a.txt', 'r', encoding='utf8') as f1:
    data = f1.readlines()
    print(data)     # ['今天天气好热\n', '浩哥说有大风\n', '我被写入了哦']
    data1 = f1.readlines()
    print(data1)    # []

5、writeline()

可写入多行数据值,将数据值存放在容器类型中,如列表、字典、集合等。

# 可填写多行内容,存放在列表、字典、集合、元组(容器类型)
with open(r'a.txt', 'w', encoding='utf8') as f1:
    f1.writelines(['今天不适合出门\n', '因为今天太热了\n'])
    f1.flush()  # 保存文件  

4、其它方法

1.获取文件描述符fileno

调用语法:fileno()

功能:如果文件存在则返回文件对应的底层文件描述赋值,为一个整数

2.缓存写入存储清空缓存flush

调用语法:flush()

功能:将文件缓存写入存储

3.判断文件是否可交互isatty

调用语法:isatty()

功能:判断文件是否可以交互操作,如终端输入设备是可以的

4.判断文件是否可读、可写

调用语法:readable()、writeable()

功能:判断文件是否可读、可写

5.判断文件是否支持随机访问seekable

调用语法:seekable()

功能:判断文件是否支持随机访问

6.调整文件大小truncate

调用语法:truncate()

功能:将文件调整为size指定大小写字节数,注意文件必须是以写模式打开。

文件内光标的移动

当我们读取文件内容时,光标会随着读取内容的结束移至到内容的末尾。但是有几种方式可以使文件内的光标随着我们的指令移动。

1.在文本模式中read()读取文件的内容时,括号里可添加要读取的字符个数,但是要注意的是,换行也算一个字节。且读取的内容会将换行符所体现的形式表现出来(换行)。
with open('a.txt', 'r', encoding='utf8') as read_f1:
    data1 = read_f1.read(4)
    print(data1)    # 少说点话
    data2 = read_f1.read(5)
    print(data2)    # 多点学习  这句话前面用了一个换行符

    
2.在二进制模式中read()读取的内容时在括号可添加要读取的字节个数,英文字母一个字节,汉字三个字节起步。二进制模式中换行符算两个字节,并且将换行符所体现的形式表现出来(换行)。
with open('a.txt', 'rb') as read_f1:
    data1 = read_f1.read(12)
    print(data1.decode())    # 少说点话
    data2 = read_f1.read(5)
    print(data2.decode())    # 多 这句话前面用了一个换行符
    
    
3.tell()能够获取读取内容的字节数
with open('a.txt', 'rb') as read_f1:
    data1 = read_f1.read(12)
    print(data1.decode())   # 少说点话
    print(read_f1.tell())   # 12
with open('a.txt', 'r', encoding='utf8') as read_f2:
    data2 = read_f2.read(4)
    print(data2)   # 少说点话
    print(read_f2.tell())   # 12

    
4.seek(offset, whence)控制光标移动的字节数
	offset	控制光标移动的字节数
	whence	模式
                0		基于文件开头移动的字节数
                1		基于当前光标所在位置移动的字节数,可以是正的也可以是负的
                2		基于文件末尾移动的字节数,通常是负的
	PS:1和2只能在二进制模式下使用,0无论哪个模式都可以。
    
with open('a.txt', 'r', encoding='utf8') as read_f1:
    data1 = read_f1.read()
    print(data1)
    read_f1.seek(0, 0)
    print(read_f1.read()) # 少说点话
    read_f1.seek(9, 0)
    print(read_f1.read()) # 话
    read_f1.seek(-6, 0)
    print(read_f1.read())   # 报错
with open('a.txt', 'rb') as read_f1:
    data1 = read_f1.read()
    print(data1.decode())   # 少说点话
    read_f1.seek(-3, 1)
    print(read_f1.read().decode('utf8'))  # 点
    read_f1.seek(-9, 2)
    print(read_f1.read().decode('utf8'))  # 说点话
'''
	seek(,),左边的数值表示偏移量,右边的数字表示模式,偏移量可以为正为负,但是一定要注意字节的大小。
'''

文件数据的修改

1、机械硬盘存储数据

数据的修改其实是写入的内容覆盖了原来的内容。

文件的数据储存在硬盘中,数据的删除是将占有态变成了自由态,自由态的删除可以用格式化(真的格式化设置)。可以用覆盖大量别的文件内容,然后删除,刷掉自由态的数据,保护自己的二手手机、二手电脑。

2、代码修改文件的方式

1.覆盖写

先读取文件内容到内存中,在内存中完成修改后,利用W模式打开文件将修改后的内容写入。优点在于硬盘的内存空间不变,但是数据量较大时会造成内存爆满。

'''先读取内容,将读取的内容里面的数据值替换成新的数据值,然后重新写入新的数据值'''
with open(r'a.txt', 'r', encoding='utf8') as read_f:
    data1 = read_f.read()
data2 = data1.replace('努力', '闭嘴')   # 少说点话 努力再努力再努力
with open(r'a.txt', 'w', encoding='utf8') as read_f2:
    read_f2.write(data2)    # 少说点话 闭嘴再闭嘴再闭嘴
2.重命名

先读取文件内容到内存中,在内存中完后修改后,保存到另一个文件中(新文件),再将原文件删除(快到肉眼看不到),最后将新的文件重命名为原文件的名字。优点在于不会造成内存的爆满,但是可能会占用两块内存空间(创建时),也可能在内存中创建了文件没有把数据刷到硬盘。

''''''
import os 	# 模块
with open('demo.txt', 'r', encoding='utf8') as read_f, \
        open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
    for line in read_f:	 # .swap临时文件,循环读取一行行内容
        wrife_f.write(line.replace('NB', 'SB'))		# 替换操作
os.remove('demo.txt')  # 删除文件
os.rename('.demo.txt.swap', 'demo.txt')  # 重命名文件

标签:知识点,读取,f1,read,读写,文件,print,open
来源: https://www.cnblogs.com/xiaojudeboke/p/16428187.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有