1_11_文件管理#

作者: ZhouLong
创建日期: 2026 年 01 月 31 日
版本: 1.0

浏览量:

1、文件路径处理#

1.1 路径表示方法#

在Python中,处理文件路径有多种方式,传统方法可以用字符串来表示,此外为了方便,也常用os.path模块和pathlib模块。pathlibPath对象可以像普通字符串一样使用,但功能更强大。

# 字符串表示
file_path = "data/file.txt"   # 最基础
file_path = "./data/file.txt" # 等价上行有无./不影响
file_path = r".\data\file.txt"   # windows 的文件路径一般复制来是反斜杠,有反斜杠一定需要加r在前
file_path = ".\\data\\file.txt"  # 和上一行相比,不加r,则要以双反斜杠表示

# 使用os.path
import os
current_dir = os.getcwd()  # 获取当前工作目录
file_path = os.path.join(current_dir, "data", "file.txt")  # 跨平台路径拼接

# 使用pathlib
from pathlib import Path
current_path = Path.cwd()  # 当前目录Path对象
file_path = current_path / "data" / "file.txt"  # 使用/运算符拼接路径

1.2 路径操作#

from pathlib import Path

path = Path("/home/user/data/sample.txt")

# 获取路径各部分
print(path.name)      # 获取文件名+扩展名
print(path.stem)      # 获取文件名
print(path.suffix)    # 获取扩展名
print(path.parent)    # 获取父目录
print(path.anchor)    # 获取根目录

# 检查路径
print(path.exists())   # 路径是否存在
print(path.is_file())  # 是否是文件
print(path.is_dir())   # 是否是目录

运行结果

sample.txt
sample
.txt
\home\user\data
\
False
False
False

1.3 遍历目录#

iterdir()列出目录内容,glob()使用通配符匹配,rglob()递归匹配。这些方法比传统的os.listdir()更强大易用。

from pathlib import Path

# 遍历当前目录
for item in Path(".").iterdir():
    print(item.name)

# 遍历当前目录所有py文件
for file_path in Path(".").glob("*.py"):
    print(file_path)

# 递归遍历所有py文件
for file_path in Path(".").rglob("*.py"):
    print(file_path)

2、基本文件类型介绍#

平时我们可能会接触到很多文件类型,不同文件类型以不同后缀来区别。

2.1 文本文件(.txt)#

纯文本格式,最基本的文件类型,仅包含字符数据,无格式信息。使用字符编码(如UTF-8、GBK)存储文本内容。
特点:体积小、通用性强、可跨平台阅读。
适用场景:程序源代码、配置文件、日志记录、简单文档、README文件。
局限性:不支持富文本格式(如字体、颜色)、结构简单。


2.2 JSON文件(.json)#

结构化数据格式,源于JavaScript,现已成为跨语言通用数据交换标准。采用键值对结构,支持嵌套对象和数组。
特点:人类可读、易于解析、支持复杂数据结构、与Web技术天然兼容。
适用场景:API请求/响应数据、应用程序配置、前后端数据传递、NoSQL数据库导出。
标准结构{"key": "value", "array": [1, 2, 3], "nested": {"item": "data"}}

2.3 FASTA文件(.fasta, .fa, .fna)#

生物序列格式,生物信息学领域标准,存储核酸(DNA/RNA)或蛋白质序列数据。
格式规范:">"开头行为序列描述行,后续行为序列数据(可多行)。
特点:简洁明了、专业领域通用、支持长序列分段存储。
适用场景:基因组序列存储、蛋白质数据库、序列比对分析、生物信息学研究。
示例格式

>序列1名字|描述信息1
ATCGATCGATCGATCG
ATCGATCGATCGATCG
>序列2名字|描述信息2
TCGATCGATCGATCGA
TCGATCGATCGATCGA

2.4 CSV文件(.csv)#

表格数据格式,以纯文本形式存储表格数据,每行一条记录,字段间用逗号分隔。
特点:跨平台兼容、体积较小、可被Excel/数据库直接导入、支持文本编辑器查看。
适用场景:数据导出/导入、数据库备份、简单统计报表、机器学习数据集。
变体格式:TSV、SSV、自定义分隔符。
注意点:字段含逗号或换行时需用引号包裹,无统一标准可能造成解析差异。

2.5 Excel文件(.xlsx, .xls)#

电子表格文件,微软Office套件标准格式,包含完整电子表格功能。xlsx基于XML(ZIP压缩),xls为二进制旧格式。
特点:支持多工作表、单元格格式、公式计算、图表、数据验证等丰富功能。
适用场景:商业报表、数据分析、财务管理、项目计划、带有格式的数据存储。
优势功能:数据透视表、条件格式、宏编程(VBA)、图表可视化、多工作表组织。

2.6 NumPy数组文件(.npz, .npy)#

科学计算专用格式,NumPy库优化的二进制存储格式,专为多维数组设计。
.npy格式:保存单个NumPy数组,包含数据类型、形状等元数据。
.npz格式:压缩格式,可保存多个数组(类似字典结构),支持数据压缩。
特点:读写速度快、存储效率高、保留数组结构信息、Python科学计算生态原生支持。
适用场景:机器学习模型参数、数值计算中间结果、大型矩阵存储、数据预处理缓存。

2.7 HDF5文件(.h5, .hdf5)#

层次化科学数据格式,设计用于存储和组织大量科学数据,支持并行I/O和压缩。
核心概念:类似文件系统的层次结构,包含组(group)、数据集(dataset)、属性(attribute)。
特点:支持TB/PB级数据、高效压缩、跨平台、支持部分读取、丰富的元数据管理。
适用场景:深度学习模型权重、大规模仿真数据、天文/气象数据、科学仪器原始数据存储。
技术优势:可扩展性高、支持数据切片访问、多进程并发读写安全。

3、不同类型文件的读写方法#

对文件的操作有多种方法。无论哪种操作,都需要使用with语句。使用with语句可以确保文件正确关闭,即使发生异常。指定编码(如utf-8)可以避免乱码问题。对于大文件,建议逐行读取以节省内存。

3.1 文件处理模式#

# 不同文件打开模式
# "r": 只读(默认)
# "w": 写入(会覆盖,文件不存在会创建)
# "a": 追加
# "x": 创建新文件(如果存在则失败)
# "b": 二进制模式
# "t": 文本模式(默认)
# "+": 读写模式

# 二进制文件读写
with open("image.jpg", "rb") as f:
    binary_data = f.read()

# 上下文管理器处理多个文件
with open("source.txt", "r") as src, open("dest.txt", "w") as dst:
    dst.write(src.read()) #  把source.txt的内容写入dest.txt

3.2 文本文件读写#

# 读取文本文件
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()  # 读取全部内容
    lines = f.readlines()  # 读取所有行到列表

# 写入文本文件
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("Hello, World!\n")
    f.writelines(["Line 1\n", "Line 2\n"])

3.3 JSON文件读写#

import json

# 读取JSON文件
with open("data.json", "r", encoding="utf-8") as f:
    data = json.load(f)  # 返回Python对象

# 写入JSON文件
data = {"name": "Alice", "age": 30, "scores": [85, 92, 78]}
with open("output.json", "w", encoding="utf-8") as f:
    json.dump(data, f)  

# JSON字符串与Python对象转换
json_str = json.dumps(data)  # 对象转JSON字符串
python_obj = json.loads(json_str)  # JSON字符串转对象

3.4 FASTA文件读写#

FASTA文件以>开头的行作为序列标识符,后续行是序列数据。生物信息学中常用,处理DNA、RNA或蛋白质序列。

def read_fasta(file_path):
    """读取FASTA文件"""
    sequences = {}
    with open(file_path, "r") as f:
        current_id = None
        current_seq = []
        for line in f:
            line = line.strip()
            if line.startswith(">"):
                if current_id:
                    sequences[current_id] = "".join(current_seq)
                current_id = line[1:]  # 去掉">"
                current_seq = []
            else:
                current_seq.append(line)
        if current_id:
            sequences[current_id] = "".join(current_seq)
    return sequences

def write_fasta(sequences, file_path):
    """写入FASTA文件"""
    with open(file_path, "w") as f:
        for seq_id, sequence in sequences.items():
            f.write(f">{seq_id}\n")
            # 每60个字符一行
            for i in range(0, len(sequence), 60):
                f.write(sequence[i:i+60] + "\n")

# 使用示例
sequences = read_fasta("sample.fasta")
write_fasta(sequences, "output.fasta")

3.5 CSV文件读写#

import csv

# 读取CSV文件
with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    headers = next(reader)  # 读取表头
    for row in reader:
        print(row)

# 使用DictReader(推荐)
with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:  # 每行是一个字典
        print(row["name"], row["age"])

# 写入CSV文件
data = [
    ["Name", "Age", "City"],
    ["Alice", "30", "Beijing"],
    ["Bob", "25", "Shanghai"]
]
with open("output.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)

# 使用DictWriter
with open("output2.csv", "w", encoding="utf-8", newline="") as f:
    fieldnames = ["Name", "Age", "City"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({"Name": "Alice", "Age": 30, "City": "Beijing"})

3.6 NumPy数组文件读写#

import numpy as np

# 创建示例数据
array1 = np.array([[1, 2, 3], [4, 5, 6]])
array2 = np.random.rand(3, 4)

# 保存单个数组为.npy文件
np.save("single_array.npy", array1)

# 保存多个数组为.npz文件
np.savez("multiple_arrays.npz", arr1=array1, arr2=array2)

# 保存压缩的npz文件
np.savez_compressed("compressed_arrays.npz", arr1=array1, arr2=array2)

# 读取文件
loaded_single = np.load("single_array.npy")
loaded_multi = np.load("multiple_arrays.npz")
print(loaded_multi.files)  # 查看包含的数组名
print(loaded_multi["arr1"])  # 访问特定数组

解释.npy格式保存单个NumPy数组,.npz格式保存多个数组(类似字典)。NumPy二进制格式加载速度快,适合科学计算中的中间数据存储。