文件读写
文件读写中,我们使用 Python 内置函数 open 操作文件
# open 语法如下
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
文件打开模式
| 模式 | 说明 |
|---|---|
r | 只读(默认), 文件必须存在 |
w | 只写, 文件不存在则创建, 存在则清空 |
a | 追加写入, 文件不存在则创建 |
r+ | 读写, 文件必须存在 |
w+ | 读写, 文件不存在则创建, 存在则清空 |
a+ | 读写追加, 文件不存在则创建 |
rb | 二进制只读 |
wb | 二进制只写 |
推荐使用 with 语句
使用 with 语句打开文件,可以自动关闭文件,避免忘记调用 close():
with open("path/to/file.txt", "r") as f:
content = f.read()
# 离开 with 块后文件自动关闭
路径
usb 版本的路径为电脑的文件路径
创建文件
使用 w 或 a 模式打开文件时,如果文件不存在会自动创建
# 创建一个文件
file = open("D:/a.txt", mode='w')
file.close()
# 推荐写法: 使用 with 自动关闭
with open("D:/a.txt", "w") as f:
f.write("Hello")
创建文件夹
创建文件夹用到了 os 模块
创建单层目录
import os
path = "D:/a" # 在D盘下创建一个a目录
os.mkdir(path)
递归创建多层目录
import os
# 一次性创建多层目录, 父目录不存在也会自动创建
os.makedirs("D:/a/b/c", exist_ok=True)
exist_ok=True 表示如果目录已存在不会报错.
删除文件
删除单个文件
import os
os.remove("D:/a.txt")
删除空文件夹
import os
os.rmdir("D:/a")
递归删除文件夹(含内容)
import shutil
# 删除整个目录及其所有内容
shutil.rmtree("D:/a")
注意
shutil.rmtree 会删除目录下的所有文件和 子目录,请谨慎使用.
判断文件/目录
判断文件是否存在
import os
if os.path.exists("D:/a.txt"):
print("文件存在")
else:
print("文件不存在")
判断是否为文件
import os
if os.path.isfile("D:/a.txt"):
print("这是一个文件")
判断是否为目录
import os
if os.path.isdir("D:/a"):
print("这是一个目录")
获取文件信息
获取文件大小
import os
size = os.path.getsize("D:/a.txt")
print(f"文件大小: {size} 字节")
获取文件名和扩展名
import os
# 获取文件名
name = os.path.basename("D:/folder/a.txt")
print(name) # a.txt
# 分离文件名和扩展名
name, ext = os.path.splitext("a.txt")
print(name) # a
print(ext) # .txt
获取文件所在目录
import os
dir_path = os.path.dirname("D:/folder/a.txt")
print(dir_path) # D:/folder
列出目录内容
列出所有文件和文件夹
import os
files = os.listdir("D:/folder")
for f in files:
print(f)
列出指定类型的文件
import glob
# 列出所有 .txt 文件
txt_files = glob.glob("D:/folder/*.txt")
for f in txt_files:
print(f)
# 递归搜索所有子目录下的 .png 文件
png_files = glob.glob("D:/folder/**/*.png", recursive=True)
for f in png_files:
print(f)
读文件
读取所有内容
with open("D:/a.txt", "r") as f:
content = f.read()
print(content)
读取一行
with open("D:/a.txt", "r") as f:
line = f.readline()
print(line)
读取所有行
with open("D:/a.txt", "r") as f:
for line in f.readlines():
print(line.strip()) # strip() 去除换行符
逐行读取(大文件推荐)
# 不会一次性加载整个文件到内存, 适合大文件
with open("D:/a.txt", "r") as f:
for line in f:
print(line.strip())
读取 JSON 文件
import json
with open("D:/config.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data)
读取二进制文件
with open("D:/image.png", "rb") as f:
data = f.read()
print(f"文件大小: {len(data)} 字节")
写文件
写入字符串
# w 模式: 每次写入会清空原内容
with open("D:/a.txt", "w") as f:
f.write("Hello World")
写入多行
with open("D:/a.txt", "w") as f:
lines = ["第一行\n", "第二行\n", "第三行\n"]
f.writelines(lines)
追加写入
# a 模式: 在文件末尾追加, 不清空原内容
with open("D:/a.txt", "a") as f:
f.write("追加的内容\n")
写入 JSON 文件
import json
data = {"name": "AScript", "version": "3.3"}
with open("D:/config.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
写入二进制文件
with open("D:/output.bin", "wb") as f:
f.write(b'\x00\x01\x02\x03')
复制与移动
复制文件
import shutil
shutil.copy("D:/a.txt", "D:/b.txt")
复制整个目录
import shutil
shutil.copytree("D:/folder_a", "D:/folder_b")
移动/重命名文件
import shutil
# 移动文件
shutil.move("D:/a.txt", "D:/folder/a.txt")
# 重命名文件
shutil.move("D:/a.txt", "D:/b.txt")
# 也可以用 os.rename
import os
os.rename("D:/a.txt", "D:/b.txt")
路径拼接
import os
# 推荐使用 os.path.join 拼接路径, 自动处理分隔符
path = os.path.join("D:/folder", "sub", "a.txt")
print(path) # D:/folder/sub/a.txt
CSV 文件操作
读取 CSV
import csv
with open("D:/data.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row) # 每行是一个列表
写入 CSV
import csv
with open("D:/data.csv", "w", encoding="utf-8", newline='') as f:
writer = csv.writer(f)
writer.writerow(["姓名", "年龄", "城市"])
writer.writerow(["张三", 25, "北京"])
writer.writerow(["李四", 30, "上海"])