文件处理

文件处理

什么是文件处理 :修改存储的信息

什么是文件:操作系统提供的虚拟概念,存储信息(用二进制存储信息)

什么是文本:.txt/.word/.md/.py/.xml/.ini 存储的是文字

视频/音频文件(多媒体文件)

# 1. 打开文件 ①文件路径Copy Path②打开模式,w-->write③
f = open(r'D:day 09	est.py','w',encoding='utf8')

# 2. 读取/修改操作
f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑之地,人生无处不青山
''')

# 3. 保存文件
f.flush()    # 快速保存,你可以不使用

# 4. 关闭文件
f.close()  # 告诉操作系统关闭文件


# file_path = r'D:day09	est.py','w',encoding='utf8'
# f = open(file_path)  # 把该路径的文件读入内存,只是没有可视化的界面而已
# print(f)
# data = f.read()  # 读取文件
# print(data)
# f.close()

文件的三种打开方式

# 打开文件的三种模式 
r--》read(只读不可写)
w-->write(只写不可读,清空文本文件)
a--》append(只写不可读,追加)

# 读取:rt  read_text 读文本内容 只读
print(f.readable()) # 判断是否可读
print(f.writable()) # 判断是否可写

# r-->只读;
data = f.read()  # 读取所有文本内容
print(data)
# 仅作了解
# print(f.readline())  # 一行一行读取
# print(f.readlines())  # 读取所有行放入列表 


# 要循环读出文本内容
for i in f.read():  # 循环出一个个字符
    print(i)
for i in f:  # 循环出一行行 # 节省内存
    print(i)

    
# 文本读一行少一行,每一行末尾默认有一个换行
for i in f:
    print(i)

# print('f.readline():',f.readline())
# wt: 只写(w清空文件后写入),不可读
 f = open(r'D:day 09	est.py', 'wt', encoding='utf8')
print(f.readable())
print(f.writable())

f.write('abc')  w-->清空写入;

# 仅作了解
# f.writelines(['abc', 'edf', 'gbk'])  # 自动拼接列表元素,一行写入
# at: 只写入(追加写入) a-->追加写入
f = open(r'D:day 09	est.py', 'at', encoding='utf8')
print(f.readable())
print(f.writable())

encoding编码格式

# encoding指定写入的编码格式
f = open(r'D:day 09	est.py', 'at', encoding='gbk')
f.write('中')

# encoding指定读文件的编码格式
f = open(r'D:day 09	est.py', 'rt', encoding='gbk')
print(f.read())

打开文件的两种模式

b模式

所以音频通过rb模式打开-->读取二进制,b模式下没有encoding这个参数,b不单独使用,一般与r

# t和b模式
# gbk/utf8只针对文本,所以音频通过rb模式打开-->读取二进制,b模式下没有encoding这个参数,b不单独使用,一般与r/w/a一起配合使用

 f = open(r'D:day 09	est.py','rb')  # 读入内存
 data = f.read()

# b模式一般用于图片/音频/视频的保存
import requests

response = requests.get('http://photocdn.sohu.com/20120708/Img347586981.jpg')
data = response.content  # 拿到图片的二进制
# print(data)

# w和a模式可以自动创建文件   没有就创建有就覆盖
f = open(r'D:day 09	est.jpg', 'wb')
f.write(data)

t模式

t模式针对文本文件,t模式不单独使用,必读得和r/w/a一起使用

rt模式,默认r

f = open(r'D:day 09关于实施乡村振兴战略的意见.txt','rt',encoding='utf8')
data = f.read()
print(data)

# rt --> py/md(默认编码是utf8)/txt(默认编码是gbk)/word(默认编码是utf8)/ini


# pdf(PyPDF2)/excel(pandas)/xml(xml)/json/pkl (无法控制,可以使用其他模块(自己百度))

绝对路径和相对路径

# 文件的路径: 文件在硬盘的地址

# 绝对路径: 从盘符开始 D:day 09	est.py

# 相对路径: 执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下


# 未来些项目尽量用相对路径
f = open('test.py','r',encoding='utf8')
print(f.read())

with管理文件上下文

# with提供一个自动关闭文件(接触了操作系统的占用)
with open('test.py', 'r', encoding='utf8') as f:
    print(f.read())
    # 在这个缩进下不会关闭文件,在这个缩进下对文件操作
    
# 关闭文件(操作系统),没有关闭python内存中的文件
print(f)  # 只涉及python,不会报错
print(f.read())  # .read()涉及操作系统,报错

文件的高级应用

# 三种新的模式(可读又可写),尽量不要使用

# r只读/w清空写入/a追加写入  --> 要么只读,要么只写


# 假设一个文件即可读又可写,假设写需要10s,读需要5s

# 针对test.py,我们要写入一个国字,需要10s

# 过了1s,我们读了这个文件,5s过后,我们看到文件只有一个中字

# 感觉自己没写入,你会再一次写入一个国字(基于前面一个字是中字)

# 4s过后,第一个的写入成功了,文件变成 中国 了

# 再过6s,第二次写入一定失败

# 以前就发生过(现在的电脑牛逼了,所以不会有这种事发生,但是还是有一定概率的)
# 可写可读 r+
with open('test.py', 'r+', encoding='utf8') as fr:
    print(fr.readable())
    print(fr.writable())
    fr.write('高级')  # 光标在文件头部,覆盖后面的字符


# 可写可读 w+ 和 w 没有任何区别
with open('test.py', 'w+', encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())

    
# 可写可读 a+ a模式默认光标在尾部
with open('test.py','a+',encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())
    fw.seek(0,0)
    print(fw.read())


# 综上:如果你真的有即可读又可写的需求,用两种不同的模式打开两次文件

光标的高级应用

# 8个进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)
# (00000000-->一个字节 00000000 00000000) --> 一个字符,对应三个字节,对应一个中文  --> utf8


# 下三种移动光标的位置(以字节为单位)4
# seek
# with open('test.py', 'rb') as fr:
    # fr.seek(5)  # 移动了3个字节,一个中文,默认从开头开始
    # print(fr.read())
    # print(fr.read().decode('utf8'))

# whence规定只有0,1,2 三种模式  # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
     fr.seek(3, 0)  # 0从开头
     # print(fr.read().decode('utf8'))
     fr.seek(3, 1)
     print(fr.read().decode('utf8'))
     fr.seek(0, 2)
     print(fr.read())

# tell : 告诉你当前所在位置
 with open('test.py', 'rb') as fr:
     fr.seek(3, 0)
     print(fr.tell())

# truncate: 截断
with open('test.py', 'ab') as fa:
    fa.truncate(2)

# 移动光标(以字符为单位)
# read
# with open('test.py', 'r', encoding='utf8') as fr:
#     print(fr.read(3))  # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符

文件的修改

with open('test.py', 'r+', encoding='utf8') as fr:
    fr.seek(0, 0)
    data = fr.read()
    print(data)
    fr.seek(3, 0)
    fr.write('干')

# 文件没有修改一说,只有覆盖


# 缓存文件的原理

# 同时打开多个文件
 with open('test.py', 'r', encoding='utf8') as fr, 
         open('test_swap.py', 'w', encoding='utf8') as fw:
    data = fr.read()
    data = data.replace('sb', '傻逼')

    fw.write(data)

import os

os.remove('test.py')
os.rename('test_swap.py', 'test.py')
原文地址:https://www.cnblogs.com/jzm1201/p/12594890.html