文件的操作与处理

文件操作

1.什么是文件?

文件其实是操作系统暴露给用户操作硬盘的快捷方式(接口)

2.代码如何操作文件

关键字open()

三步走:
        1.利用关键字open打开文件
        2.利用其它方法操作文件
        3.关闭文件 
文件路径
        相对路径与绝对路径
        路径中出现了字母与斜杠的组合产生了特殊含义如何取消
        在路径字符串前面加一个r
        eg:r'D:\py20\day08\a.txt'
格式:
open(文件路径,读写模式,字符编码)
    文件路径与读写模式是必须的
    字符编码是可选的(有些模式需要编码)
 res = open('a.txt', 'r', encoding='utf8')
 print(res.read())
 res.close()  # 关闭文件释放资源


# with上下文管理(能够自动帮你close())
with open(r'a.txt','r',encoding='utf8') as f1:  # f1=open() f1.close()
    print(f1.read())
"""以后代码操作文件 推荐使用with语法"""

3. 文件读、写、追加三模式

r 只读模式(只能看不能改)

# 路径不存在:直接报错
with open(r'b.txt', 'r', encoding='utf8') as f:
         pass
# 路径存在
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 读取文件内所有的内容
    f.write('123')  # 写文件内容

image

w 只写模式(只能写不能看)

# 路径不存在:路径不存在自动创建
     with open(r'b.txt', 'w', encoding='utf8') as f:
         pass

    # 路径存在:1.会先清空文件内容  2.再执行写入操作
    with open(r'a.txt', 'w', encoding='utf8') as f:
        f.read()
        f.write('hello world!\n')
        f.write('hello world!\n')
        f.write('hello world!\n')

image

a 只追加模式(追加内容, 同样不能读)

# 路径不存在, 创建一个新的文件,可以写入内容但不可以读
with open(r'money.txt', 'a', encoding='utf8') as f1:
    # f1.read()  # 报错
    f1.write('insist study')

# 路径存在, 在文件内容的尾部追加新的写入内容
with open(r'money.txt', 'a', encoding='utf8') as f2:
    f2.write('graduation from Oldboy')

image
小总结:

我们所学习的r w a读写模式都只能操作文本文件

4. 文件操作方法

1. 读系列

with open(r'a.txt', 'r', encoding='utf8') as f:
     print(f.read())  # 一次性读取文件内所有的内容
     print(f.readline())  # 每次只读文件一行内容
     print(f.readlines())  # 读取文件所有的内容 组织成列表 每个元素是文件的每行内容
     print(f.readable())  # 判断当前文件是否具备读的能力

2.写系列

with open(r'a.txt','w',encoding='utf8') as f:
     f.write('克服一切困难 奥利给!')  # 往文件内写入文本内容
     f.write(123)  # 写入的内容必须是字符串类型
     f.writelines(['jason','kevin','tony'])  # 可以将列表中多个字符串元素全部写入
     print(f.writable())  # True
     print(f.readable())  # False
   	f.flush()  # 直接将内存内文件数据刷到硬盘 相当于ctrl+s

5. 文件优化操作

with open(r'a.txt', 'r', encoding='utf8') as f:
    # print(f.read())  # 一次性读取文件内所有的内容
    # print(f.read())  # 一次性读取文件内所有的内容
    # print(f.read())  # 一次性读取文件内所有的内容
    """
    1.一次性读完之后 光标停留在了文件末尾 无法再次读取内容
    2.该方法在读取大文件的时候 可能会造成内存溢出的情况
        解决上述问题的策略就是逐行读取文件内容
    """
    # for line in f:  # 文件变量名f支持for循环  相当于一行行读取文件内容
    #     line
    '''以后涉及到多行文件内容的情况一般都是采用for循环读取'''

6. 文件操作模式

t	文本模式
	1.默认的模式
    	r w a  >>> rt wt at
    2.该模式所有操作都是以字符串基本单位(文本)
    3.该模式必须要指定encoding参数
    4.该模式只能操作文本文件
    
b   二进制模式
	1.该模式可以操作任意类型的文件
    2.该模式所有操作都是以bytes类型(二进制)基本单位
    3.该模式不需要指定encoding参数
    	rb wb ab

image

二进制模式读写操作

 with open(r'a.txt','rb') as f:
     # print(f.read())
     print(f.read(5).decode('utf8'))


 with open(r'a.txt','r',encoding='utf8') as f:
     print(f.read())
     print(f.read(4))

"""
read()  括号内可以放数字
    在t模式下表示字符个数
    在b模式下表示字节个数
英文字符统一使用一个bytes来表示
中文字符统一使用三个bytes来表示
"""

image

文件内光标的移动(了解)

 with open(r'b.txt', 'rb') as f:
     print(f.read(4).decode('utf8'))
     print(f.tell())  # 查看光标移动了多少个字节
     f.seek(3, 1)
     print(f.read().decode('utf8'))
"""
控制文件内光标的移动  f.seek()
f.seek(offset,whence)
    offset表示位移量
        始终是以字节为最小单位
            正数从左往右移动
            负数从右往左移动
    whence表示模式
        0:以文件开头为参考系(支持tb两种模式)
        1:只支持b模式 以当前位置为参考系
        2:只支持b模式 以文件末尾为参考系
"""

文件的内容修改(了解)

# 方式1 覆盖
 with open(r'c.txt','r',encoding='utf8') as f:
     data = f.read()
      print(type(data))
 with open(r'c.txt','w',encoding='utf8') as f1:
     new_data = data.replace('tony','jason')
     f1.write(new_data)

# 方式2 新建
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原文件
os.rename('c.txt.swap', 'c.txt')  # 重命名文件

"""
方式1:优点   在文件修改过程中同一份数据只有一份   缺点   如果文件过大内存会出现溢出从而崩溃
方式2: 优点   是内存不会出现溢出   缺点   在文件修改过程中同一份数据存了两份
"""
posted @ 2021-11-10 18:32  zong涵  阅读(179)  评论(0编辑  收藏  举报