文件处理

文件处理

'''
什么是文件?
    操作系统将复杂的硬件操作包装成一个简易的接口
为什么操作文件?
    人或程序需要永久的存储数据
'''
# 通过Python代码来操作文件
# 打开文件 open(r"D:pyday07111.txt",encoding='utf-8')  # 操作系统,默认编码为gbk
# r 取消转义
# f = open(r"D:pyday07111.txt",encoding='utf-8')  # f为文件对象.f也是一个变量名
# print(f.read())  # 将文件中的内容全部读出
# f.close()  # 告诉操作系统将文件关闭

# 这样每次用完文件都要告诉操作系统关闭文件太过麻烦.接下来介绍一种比较简单的方法
# with open(r"D:pyday07111.txt",encoding='utf-8') as f:  f仅仅是个变量名,可以把它理解为遥控器
#     print(f)
#     print(f.read())

# 文件打开方式:
# r 只读
# w 只写
# a 追加写模式

# 操作文件单位方式
# t 文本文件  文本文件在使用是一定要标明encoding模式.不然会采用系统默认编码GBk
# b 二进制  一定不能标明encoding  该模式是直接用二进制进行传输


# mod参数可以不写,默认情况下是rt模式   如果只写了r w a默认情况下rt wt at
# with open(r'D:pyday07111.txt',mode = 'r',encoding='utf-8') as f:
    # print(f.readable())  # 可读
    # f.write('aaaaa')  # 直接报错,在r模式下只能读

# r 模式下打开文件,如果文件不存在直接报错
# with open(r'D:pyday07111.txt',mode = 'r',encoding='utf-8') as f:
    # print(f.read())  # 将文件内容一次性全部读出
    # print(f.readline())  # 将文件内容一行读出,如果文件内容过大,一次性全部读出可能会导致内存爆炸,逐行减轻内存压力
    # print(f.readline())
    # print(f.readline())
    # print(f.readlines())  # 返回一个列表,列表中每个元素与文件中的行一一对应
    # 也可以使用for循环将文件每行全部读出
    # for line in f:
    #     print(line)


# w模式,w模式在文件存在时,会将文件清空,再进行写入,在文件不存在时会新建一个文件
# l = ['阿挺冲冲冲
','阿挺冲冲冲
','阿挺冲冲冲
']
# with open(r'D:pyday07	est.txt',mode='w',encoding='utf-8') as f:
    # print(f.readable())  # 在w模式下只能写不能读
    # print(f.writable())
    # f.write('asdasdasd')  # 文件内容会直接清空,重新写入
    # f.writelines(l)  # 可以输入容器类型,内部就是for循环
    # for line in l:
    # f.write(line)

# a模式,a模式在文件不存在时会新建一个文件,在文件存在时不会清空文件,会将光标移动到末尾进行添加
# with open(r'D:pyday07	est.txt',mode='a',encoding='utf-8') as f:
#     print(f.readable())  # a模式下只能写,不能读
#     print(f.writable())
#     f.write('chongchong
')  # 在文件末尾直接进行添加
'''
r
w
a
以上三种为纯净模式
r+
w+
a+
这三个模式均为可读可写模式,但这种模式很low,一般情况下只用纯净模式
'''
# 在r+模式下打开一个没有创建的文件,会直接报错,并不会直接创建文件
# with open(r'111.txt','r+',encoding='utf-8') as f:
#     print(f.readable())  # True
#     print(f.writable())  # True
#     print(f.readline())  # 文件光标移到第一行末尾
#     f.write('heiheihei')  # 虽然文件光标在第一行末尾,在写入的情况下,会直接在文件末尾 进行添加


# with open(r'111.txt','w+',encoding='utf-8') as f:
#     print(f.readable())  # True
#     print(f.writable())  # True
#     print(f.readline())
#     f.write('heiheihei')

# with open(r'111.txt','a+',encoding='utf-8') as f:
#     print(f.readable())  # True
#     print(f.writable())  # True


# 在rt模式下read()内加的数字都是字符个数,其他模式下都是字节个数
光标在文件中的移动
'''
f.seek(offset,whence)
offset:相对偏移量  光标移动位数(字节数)
whence:
    0 参照文件的开头  t和b都可以使用
    1 参照光标当前位置  只有b模式可以使用
    2 参照文件的末尾  只有b模式可以使用
'''
# with open(r'111.txt','rt',encoding='utf-8') as f:
#     print(f.read(1))  # 读取一个字符
#     f.seek(6,0)  # 相对文件开头移动6个字节


# with open(r'test','rb') as f:
#     print(f.read())
#     f.seek(-4,2)
#     print(f.read().decode('utf-8'))

# 可以将文件中的某个字符进行替换
# with open(r'test','r+',encoding='utf-8') as f:
#     f.seek(3,0)
#     f.write('过')  # 直接将字符进行替换
View Code
检测文件是否新加内容
# 检测文件是否新加内容
# with open(r'111.txt','rb') as f:
#     f.seek(0,2)
#     while True:
#         res = f.readline()
          # 查看光标移动了多少位 bytes
          # print(f.tell())
#         if res:
#             print('新增内容:%s'%res.decode('utf-8'))
#             说明有人在操作文件


# with open(r'111.txt','r',encoding='utf-8') as f:
#     f.read()
#     while True:
#         res = f.readline()
#         if res:
#             print('新增内容:%s'%res)
View Code
# 截断文件
# 截断文件
# with open(r'111.txt','a',encoding='utf-8') as f:
#     f.truncate(3)  # 截断直接从文件头开始,截断的是字节个数

修改文件

# 修改文件
# 先将数据由硬盘读到内存(读文件)
# 在内存中完成修改(字符串的替换)
# 再覆盖原来的内容(写文件)




# with open(r'111.txt','rt',encoding='utf-8') as f:
#     data = f.read()
# with open(r'111.txt','w',encoding='utf-8') as f:
#     f.write(data.replace('nmsl','egon'))
# 这种修改方式优缺点
# 优点:任意时间yp上都只有一个文件  不会过多占用硬盘空间
# 缺点:在文件内容过大时,内存可能会溢出







# 文件修改方式2
# 新建一个文件,并且将老文件中内容全部读到内存并进行修改
# 将修改好的内容写入新文件,用新文件代替老文件  直接将老文件删除,把新文件命名为老文件

import os
with open(r'111.txt','r',encoding='utf-8') as f ,
    open(r'123.txt','w',encoding='utf-8') as n:
    for line in f:
        new_line = line.replace('nmsl','egon')
        n.write(new_line)
os.remove('111.txt')
os.rename('123.txt','111.txt')


# 优点:不需要考虑文件内容是否会溢出内存
# 缺点:在硬盘中会存在两个文件,占用硬盘资源
View Code


原文地址:https://www.cnblogs.com/asdaa/p/11147223.html