Python第三天

作者:

在

在 Python 中,文件操作是非常常见的任务。Python 提供了内置的函数来处理文件的读写操作。

文件的类型

  1. 文本文件:包含可读的字符(如 .txt、.csv)。一般使用 UTF-8 编码,可以使用文本编辑器查看。
  2. 二进制文件:包含非文本数据(如图像、音频、视频文件,后缀如 .jpg、.png、.mp3)。以原始==字节格式==存储。需要使用专用软件查看,Bytes形式存储。

==注意==:后缀名不会影响文件类型 .md | .txt |.csv 都是文本文件

文件操作的过程

  1. 打开文件
  2. 读写文件
    • 读文件:将文件内容读入内存
    • 写文件:将内存内容写入文件
  3. 关闭文件

操作方法

文件路径

  • 绝对路径:从根路径开始描述文件的位置,例如:F:技术文件课件-笔记课件修订Python1.Python基础语法,具有唯一性,不会出错,不管写在哪里都可以准确的找到文件的位置
  • 相对路径:相对当前位置进行文件定位,容易出错,需要对路径比较熟悉

==注意==:会相对路径就可,到时候linux会重新搞

txt.path=Path(__file__).parent  #获取当前运行程序脚本文件的上一级文件夹路径,方便后续定位文件夹里的其他脚本文件,如当前为.py,可以找所在文件夹的其他文件.txt

# 后径路径拼接..
#Path(__file__).parent   相当于文件夹路径被定死可以在任何程序文件运行

with open(‘ 文件名’,’方式’,’编码 ‘)

使用 with 语句可以自动管理文件的打开和关闭,with 语句打开后自动关闭文件

with open('example.txt', 'r') as file:        # 获取file文件对象
    content = file.read()

==注意==:在windows系统自动关闭后文件不会被占用,可删除或重命名

以不同模式打开

访问方式 说明
r 以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,报错
a 以追加方式打开文件。如果该文件已存在,文件==指针==将会放在==文件的结尾==。如果文件不存在,创建新文件进行写入
r+b 以二进制读写方式打开。文件指针在开头,可读可写,文件必须存在
a+b 以二进制读写方式打开。文件指针在末尾,追加写入,可读全文,不存在则创建

==注意==:对于==二进制文件binary==,只能使用 b 模式,表示以 bytes 方式操作(所有文件本质上最终都是字节存储,使用这种模式无需考虑文本文件的字符编码),读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 r 和 a 以 字符串Str形式读写

文件编码

由操作系统打开文件,那么如果我们没有指定编码,那么打开文件的默认编码取决于操作系统,操作系统会用自己的默认编码去打开文件,在 Windows 下是 gbk,在 Linux 下是 utf-8。

with open('example.txt','r',encoding='utf-8') as file:

==注意==:file是==文件对象==:代表打开的文件

读取文件

  • read(size):读取指定大小的内容,如果没有指定,读取全部内容。
  • readline():读取一行。
  • readlines():读取所有行并返回一个列表。

==注意==:size 标准为 8192(8 k b) 读写磁盘大文件 64kb

示例:

with open('example.txt','r',encoding='utf-8') as file:

content = file.read()          # 读取全部内容
line = file.readline()      # 读取一行
lines = file.readlines()      # 读取所有行

print(content)
print('-----------')
print(line)
print('-----------')
print(lines)

# 思考?
# 为什么后面两个print读取不到东西呢?

==注意==:光标读到哪就放到哪不会重置开头,读完返回空字符串 ‘ ‘ 或 空列表 [ ]

文件指针

用 seek(0) 来操作指针,重置光标位置

语法:

file.seek(0)
  • 括号里

    (可选):指定光标基准位置,可以取以下值:

    • 0:从文件开头开始计算(默认值)
    • 1:从当前位置开始计算
    • 2:从文件末尾开始计算

​

示例:

with open('example.txt','r',encoding='utf-8') as file:

content = file.read()          # 读取全部内容
file.seek(0)                # 把光标移到到文件的开头
line = file.readline()      # 读取一行
file.seek(0)                # 再次把光标移动到文件的开头
lines = file.readlines()      # 读取所有行

print(content)
print('-----------')
print(line)
print('-----------')
print(lines)

按行读取文件内容

  • read() 默认会把文件的所有内容一次性读取到内存
  • readline() 可以一次读取一行内容
# 方式一、 通过循环按行读取文件所有内容
file1 = open("example.txt")
i = 1
while True:
    text1 = file1.readline().strip()
    if text1:
        print("这是第%s行内容" % i)
        i += 1
        print(text1)
    else:
        break

file1.close()

file2 = open("example.txt")

#  通过for循环遍历按行读取文件所有内容
for i in file2.readlines():
    print(i.strip())

file2.close()

写入内容

用 file.write( ) 写入内容

语法:

file.write( )

示例:日记记录

# 日记程序
# 以追加模式打开日记文件
with open('diary.txt', 'a',encoding='utf-8') as file:

# 获取用户输入的日记内容
content = input("请输入今天的日记:")

# 将日记内容写入文件
file.write(content + "n")
print("日记已保存!")

案例:简单的备份程序

将一个文本文件的内容复制到另一个文件,用于简单的备份。

# 简单备份小程序
'a.txt'
'b.txt'

with open('a.txt','r',encoding='utf-8') as src:
    content = src.read()

with open('b.txt', 'a',encoding='utf-8') as dest:  # 以追加方式打开文件'b.txt'
    dest.write(content)

print(f"备份成功!'a.txt' 的内容已复制到 'b.txt'")

Json 文件读取

json本质上是文本格式,为” ……… “,引号里是python的所有脚本.

JSON类型 Python类型
object dict
array list
string str
number(整形)int int
number(浮点型)float float
true True
false False
null None

转换方法

作用 输出
json.dumps() 将 Python 对象序列化为 JSON 字符串 obj → str
json.dump() 将 Python 对象序列化为Json格式并写入文件( obj, filename,encoding=utf-8) → 无返回值
json.loads() 将 JSON 字符串反序列化为 Python 对象 str → obj
json.load() 从文件读取并反序列化为 Python 对象 (filename) → obj

==注意==:区别在于数据来源或去向:带s的是处理字符串(在内存中操作),没有写入文件 ;没有s的是处理文件对象,读写文件内容

dump把写的代码转为json格式写到文件里,load是从 Json文件读取到 python 程序中.

序列化和反序列化

序列化:从 Python 到 JSON

反序列化: 从 JSON 到 Python

文件读写操作

  1. 把data以json格式写入到文件
data = {"result": "success", "code": 200}

with open("output.json", "a", encoding="utf-8") as f:
    json.dump(data, f)
  1. 把json文件里的东西读取到python里,去掉 ” “
with open("output.json", "r", encoding="utf-8") as f:
    data = json.load(f)

JSON 与 bytes 的 转换

JSON 本质文本格式为str,转换成字节才可在二进制里运行

  1. 编码与解码
  • Json 到 bytes:先 Python 对象 变成 JSON 字符串(dumps),再通过.encode( )编码成字节形式
  • bytes 到 Json:先将字节通过decode( )解码成字符串,再 loads( )解码成Python对象

==注意==:一切都是围绕str到bytes的编解码

转换路线

方向 步骤
Python对象到bytes obj到JSON字符串再到bytes
bytes到Python对象 bytes到JSON字符串再到obj
import json

data = {"action": "login", "user": "张三", "ts": 1234567890}

# === 对象 → bytes ===
json_bytes = json.dumps(data, ensure_ascii=False).encode("utf-8")
print(json_bytes)   # b'{"action":"login","user":"张三","ts":1234567890}'

# === bytes → 对象 ===
recovered = json.loads(json_bytes.decode("utf-8"))
print(recovered["user"])  # 张三

读写二进制Json文件

手动编码后写入,读取时先解码

  1. 写入二进制 Json文件
data = {"sensor": "temp", "value": 23.5}

with open("data.bin", "wb") as f:
    # 将对象转为 bytes 后写入
    f.write(json.dumps(data, ensure_ascii=False).encode("utf-8"))
  1. 读取二进制文件
with open("data.bin", "rb") as f:
    raw_bytes = f.read()   #  先把读取的内容写到内存上来,不然没有目标 
    obj = json.loads(raw_bytes.decode("utf-8"))

Base64:把图片,音视频等二进制转入JSON存储

json不能存储真正二进制内容,==须先用Base64编码成字符串==,字符串可安全放入JSON字符串字段里

典型JSON结构示例:

{
  "fileName": "photo.jpg",
  "mimeType": "image/jpeg",
  "data": "/9j/4AAQSkZJRgABAQEBLAEsAAD..."
}

图片,音视频都是二进制形式

==注意==:Base64编码返回永远是字节,所以必须.decode()去掉b得到字符串;b64decode解码自动处理字符串去掉字符串标识,把字符串还原为二进制得到原本的b,b64decode解码直接把字符串传进去

· 编码:base64.b64encode(二进制数据) → 返回 bytes(例如 b’data’) 如果你想要 str(文本字符串),需要再调用 .decode(‘utf-8’)。 所以确实“不是直接转的,需要多一步 decode”。 · 解码:base64.b64decode(字符串) → 返回原始 bytes。 它可以接受 str 参数(如 ‘….’),不需要你先 encode 成 bytes。 所以解码时“可以直接转”。

你的理解完全正确,而且区分了编码和解码的不同处理方式。简洁准确地概括了 Python base64 模块的行为👍

ru