Skip to main content

文件读写

文件读写中,我们使用 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 版本的路径为电脑的文件路径


创建文件

使用 wa 模式打开文件时,如果文件不存在会自动创建

# 创建一个文件
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, "上海"])