Python常用代码片段大全:文件操作、字符串处理与时间转换模板

不晚
不晚
发布时间:2026-10-20| 4人浏览过
原创

在日常 Python 脚本开发、自动化运维以及数据处理任务中,文件读写、字符串清洗与格式化、以及时间日期的解析转换是调用频次最高的三大基础操作。熟练掌握经过生产检验的规范代码模板,不仅可以免去反复翻查技术手册的繁琐,更能从源头上杜绝文件句柄泄漏、跨平台编码乱码、字符串拼接性能劣化以及跨时区计算错误等常见隐患。本文系统梳理这三大领域的核心场景,提供开箱即用的实用代码片段与架构逻辑解析。

一、文件与路径操作实用模板

文件处理的核心原则是“安全、可预测与资源自闭合”。在现代 Python(Python 3.6+)中,推荐优先采用面向对象的 pathlib.Path 处理路径,结合上下文管理器 with open(...) 确保系统文件句柄在任何异常情况下均能妥善释放。

Python常用代码片段大全:文件操作、字符串处理与时间转换模板
图 1:Python 文件安全读写与上下文管理执行机制流程图

1. 现代化路径操作与目录管理(pathlib)

相比于传统的 os.path 字符串拼接,pathlib 提供了跨平台路径对象,使用 / 运算符直接拼接路径,更加直观且安全。

from pathlib import Path

# 1. 获取当前脚本所在绝对路径与项目根路径
current_dir = Path(__file__).resolve().parent
project_root = current_dir.parent

# 2. 跨平台路径拼接与目录创建
data_dir = project_root / "data" / "processed"
data_dir.mkdir(parents=True, exist_ok=True)  # parents=True 级联创建,exist_ok=True 避免已存在报错

# 3. 递归检索特定格式文件
csv_files = list(data_dir.rglob("*.csv"))

# 4. 文件属性判断与元信息获取
target_file = data_dir / "sample.txt"
if target_file.exists() and target_file.is_file():
    size_in_bytes = target_file.stat().st_size
    filename = target_file.name          # 带后缀的文件名
    stem = target_file.stem              # 不带后缀的主文件名
    extension = target_file.suffix        # 文件后缀扩展名

2. 文本文件安全读写与大文件逐行处理

针对常规文本文件与 GB 级超大日志文件,读写方式应区分对待。超大文件切勿使用 f.read() 或 f.readlines(),否则容易导致系统内存耗尽(OOM)。

from pathlib import Path

file_path = Path("large_server_log.txt")

# 模式 A:普通中小型文件安全写入与覆盖
def write_text_safely(path: Path, content: str) -> None:
    # 显式指定 utf-8 编码,避免平台差异导致的乱码
    with open(path, mode="w", encoding="utf-8") as f:
        f.write(content)

# 模式 B:超大文件流式逐行读取(内存占用恒定极小)
def process_large_file_line_by_line(path: Path) -> int:
    matched_lines_count = 0
    try:
        with open(path, mode="r", encoding="utf-8") as f:
            for line_number, line in enumerate(f, start=1):
                # 逐行剥离末尾换行符
                clean_line = line.rstrip("\r\n")
                if "ERROR" in clean_line:
                    matched_lines_count += 1
    except FileNotFoundError:
        print(f"目标文件不存在: {path}")
    except UnicodeDecodeError as e:
        print(f"解码失败,请确认文件编码格式: {e}")
    return matched_lines_count

3. JSON 与 CSV 结构化数据读写模板

数据交换中最常见的 JSON 与 CSV 格式,均应遵循标准库最佳配置规范,特别注意 CSV 写入时的 newline="" 参数,以防在 Windows 系统下产生冗余空行。

import json
import csv
from pathlib import Path
from typing import Any, Dict, List

# JSON 安全写入与读取
def save_json(path: Path, data: Dict[str, Any]) -> None:
    with open(path, mode="w", encoding="utf-8") as f:
        # ensure_ascii=False 确保中文字符以可读形式保存,indent=2 便于阅读
        json.dump(data, f, ensure_ascii=False, indent=2)

def load_json(path: Path) -> Dict[str, Any]:
    with open(path, mode="r", encoding="utf-8") as f:
        return json.load(f)

# CSV 字典格式读写
def save_csv_records(path: Path, records: List[Dict[str, Any]], fieldnames: List[str]) -> None:
    # newline="" 必须声明,防止跨平台换行解析出现双重换行
    with open(path, mode="w", encoding="utf-8", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(records)

def load_csv_records(path: Path) -> List[Dict[str, str]]:
    with open(path, mode="r", encoding="utf-8", newline="") as f:
        reader = csv.DictReader(f)
        return [row for row in reader]

二、高频字符串处理与文本清洗模板

Python 中的 str 是不可变对象(immutable)。每一次对字符串的替换、裁剪都会生成新对象。因此在文本清洗与大规模流水线处理中,合理选用原生的字符串方法与正则表达式能够带来显著的性能提升。

Python常用代码片段大全:文件操作、字符串处理与时间转换模板
图 2:Python 字符串从清洗、切分到格式化输出的处理管道

1. 边界剥离、安全前缀与后缀处理

在 Python 3.9 之前,许多开发者误用 lstrip() 或 rstrip() 剥离前后缀,而这两个函数实际上是按字符集合进行贪婪剔除,极易导致意外截断。Python 3.9+ 引入了语义明确的 removeprefix() 与 removesuffix()。

raw_text = "  ===Python_API_Response_v2.json===  \n"

# 1. 常规空白与指定字符清除
clean_text = raw_text.strip().strip("=")  # "Python_API_Response_v2.json"

# 2. 区分 lstrip 误区与 removeprefix
sample = "www.example.com"
# 错误示范:sample.lstrip("w.") 会剔除所有属于 'w' 和 '.' 的字符集合
safe_domain = sample.removeprefix("www.")   # "example.com"
safe_stem = "data_backup.tar.gz".removesuffix(".tar.gz")  # "data_backup"

# 3. 三元分段:比 split 更轻量的分隔方案
url = "https://api.domain.com/v1/users?id=100"
scheme, separator, path = url.partition("://")
# scheme -> "https", separator -> "://", path -> "api.domain.com/v1/users?id=100"

2. 正则表达式清洗与高频提取模板

对于涉及多重空白、特殊符号过滤或特定格式识别的场景,标准库 re 是最强大的工具。多次复用的正则模式应使用 re.compile() 预编译以节省解析开销。

import re

# 预编译常用正则规则
RE_MULTI_SPACES = re.compile(r"\s+")
RE_CHINESE_ONLY = re.compile(r"[^\u4e00-\u9fa5A-Za-z0-9_]")
RE_EMAIL = re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")

def clean_noisy_text(content: str) -> str:
    # 步骤 1:将连续的空格、制表符、换行符折叠为单个空格
    collapsed = RE_MULTI_SPACES.sub(" ", content).strip()
    # 步骤 2:去除所有非中文、英文字母、数字和下划线的杂质字符
    purified = RE_CHINESE_ONLY.sub("", collapsed)
    return purified

# 提取文本中所有手机号
raw_document = "联系方式:张三 13800138000,李四 13912345678,非手机 010-12345678"
phone_pattern = re.compile(r"(?<!\d)1[3-9]\d{9}(?!\d)")
extracted_phones = phone_pattern.findall(raw_document)
# extracted_phones -> ['13800138000', '13912345678']

3. f-string 高级格式化与排版模板

f-string(Formatted string literals)是目前兼具可读性与执行效率的最优格式化手段,支持直接在花括号内执行对齐、补零、浮点数精度截断以及千分位分隔。

value = 1234567.89123
ratio = 0.8542
item_id = 42

# 1. 浮点精度与千分位分隔符
formatted_currency = f"¥{value:,.2f}"      # "¥1,234,567.89"
formatted_percent = f"{ratio:.1%}"         # "85.4%"

# 2. 数字左侧补零(如工号、ID编号)
formatted_id = f"ID_{item_id:06d}"         # "ID_000042"

# 3. 文本对齐与填充宽幅(构建对齐日志或终端表格)
title = "Report"
left_aligned = f"{title:<15}"              # "Report         "
center_aligned = f"{title:^15}"            # "    Report     "
banner = f"{title:=^20}"                   # "=======Report======="

# 4. 日期对象的直接内联格式化(无需显式 strftime)
import datetime
today = datetime.date(2026, 10, 20)
date_str = f"Date: {today:%Y/%m/%d}"       # "Date: 2026/10/20"

三、日期时间解析、转换与时区处理模板

时间处理的核心在于理清四种形态:**时间戳(Timestamp)**、**时间文本(String)**、**本地朴素时间(Naive datetime)** 与 **感知时区时间(Aware datetime)**。混淆 naive 与 aware 对象是跨地区系统最普遍的缺陷来源。

Python常用代码片段大全:文件操作、字符串处理与时间转换模板
图 3:Python 日期时间类型转换与拓扑流向图

1. 字符串、时间戳与 datetime 互转模板

时间互转的关键是区分解析(strptime,Parse String)与格式化(strftime,Format String)。常见通配符中,%Y 代表四位年份,%m 代表两位月份,%d 代表日,%H 代表 24 小时制小时,%M 代表分钟,%S 代表秒。

from datetime import datetime
import time

# 1. 字符串解析为 datetime 对象
time_str = "2026-10-20 11:30:45"
dt_obj = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")

# 2. datetime 格式化为自定义字符串或 ISO 8601
formatted_str = dt_obj.strftime("%Y年%m月%d日 %H点%M分")  # "2026年10月20日 11点30分"
iso_str = dt_obj.isoformat()                             # "2026-10-20T11:30:45"

# 3. datetime 转换为 Unix 时间戳(秒级 float)
timestamp_seconds = dt_obj.timestamp()                   # 1792467045.0
timestamp_ms = int(timestamp_seconds * 1000)             # 毫秒级整数时间戳

# 4. 时间戳还原为 datetime 对象
restored_dt = datetime.fromtimestamp(timestamp_seconds)

2. 时间间隔与跨度计算(timedelta)

严禁使用乘以 86400 秒的手动计算方式处理天数变化,因为夏令时转换与润秒可能会导致计算失准。datetime.timedelta 是标准、安全的时间偏移工具。

from datetime import datetime, timedelta

now = datetime.now()

# 1. 计算过去与未来的时间点
seven_days_ago = now - timedelta(days=7)
three_hours_later = now + timedelta(hours=3, minutes=15)

# 2. 计算两个时间点之间的差距
event_time = datetime(2026, 12, 31, 23, 59, 59)
duration = event_time - now

print(f"相距天数: {duration.days} 天")
print(f"剩余总秒数: {duration.total_seconds():.1f} 秒")

# 3. 产生连续的日期序列(常用于数据报表拉取)
start_date = datetime(2026, 10, 1)
end_date = datetime(2026, 10, 5)
date_range = []
curr = start_date
while curr <= end_date:
    date_range.append(curr.strftime("%Y-%m-%d"))
    curr += timedelta(days=1)
# date_range -> ['2026-10-01', '2026-10-02', '2026-10-03', '2026-10-04', '2026-10-05']

3. 时区感知时间转换模板(Python 3.9+ zoneinfo)

在 Python 3.9 之后,内置的 zoneinfo 模块正式取代了第三方库 pytz,成为标准官方时区解决方案。处理带时区时间的关键是:永远不要在朴素时间上直接 replace 错误的时区,而应先绑定基准时区,再通过 astimezone 进行物理时区转换。

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

# 1. 获取当前 UTC 时间(Aware 时区感知对象)
utc_now = datetime.now(timezone.utc)

# 2. 安全转换为指定时区(如北京时间 Asia/Shanghai 与 纽约时间 America/New_York)
beijing_tz = ZoneInfo("Asia/Shanghai")
ny_tz = ZoneInfo("America/New_York")

beijing_time = utc_now.astimezone(beijing_tz)
ny_time = utc_now.astimezone(ny_tz)

print(f"UTC 时间:   {utc_now}")
print(f"北京时间:   {beijing_time}")
print(f"纽约时间:   {ny_time}")

# 3. 将没有时区的文本安全解析并附带时区属性
naive_str = "2026-10-20 14:00:00"
naive_dt = datetime.strptime(naive_str, "%Y-%m-%d %H:%M:%S")

# 正确做法:确知该时间为北京时间,显式赋予其时区属性
aware_beijing_dt = naive_dt.replace(tzinfo=beijing_tz)
# 随后可平滑转为 UTC 存储入库
target_utc_dt = aware_beijing_dt.astimezone(timezone.utc)

四、综合实战案例:日志文件流式解析与规范化导出

下面是一个将文件流式读取、字符串正则清洗提取与时间转换串联起来的生产级脚本模板。该脚本从源日志文件中逐行检索异常日志,提取其中的 IP 地址、非标时间字符串,将其统一格式化为 ISO 8601 标准并附带北京时区,最后流式写入新的 CSV 结构化文件。

import re
import csv
from pathlib import Path
from datetime import datetime
from zoneinfo import ZoneInfo

# 正则表达式匹配形如:[20/Oct/2026:11:22:33] IP: 192.168.1.50 - Msg: User login failure
LOG_PATTERN = re.compile(
    r"\[(?P<raw_time>[^\]]+)\]\s+IP:\s+(?P<ip>\d{1,3}(?:\.\d{1,3}){3})\s+-\s+Msg:\s+(?P<msg>.*)"
)

def process_log_pipeline(input_log_path: Path, output_csv_path: Path) -> int:
    beijing_tz = ZoneInfo("Asia/Shanghai")
    processed_count = 0
    fieldnames = ["standard_iso_time", "client_ip", "cleaned_message"]

    # 保证源文件与目标文件在上下文管理器中同步安全流转
    with open(input_log_path, mode="r", encoding="utf-8") as fin, \
         open(output_csv_path, mode="w", encoding="utf-8", newline="") as fout:
        
        writer = csv.DictWriter(fout, fieldnames=fieldnames)
        writer.writeheader()

        for line in fin:
            match = LOG_PATTERN.search(line)
            if not match:
                continue

            # 1. 提取字段
            raw_time_str = match.group("raw_time")  # e.g., "20/Oct/2026:11:22:33"
            client_ip = match.group("ip")
            raw_msg = match.group("msg")

            # 2. 时间解析与时区补全
            try:
                parsed_time = datetime.strptime(raw_time_str, "%d/%b/%Y:%H:%M:%S")
                aware_time = parsed_time.replace(tzinfo=beijing_tz)
                standard_time = aware_time.isoformat()
            except ValueError:
                # 时间格式异常兜底机制
                standard_time = ""

            # 3. 字符串清洗
            clean_msg = raw_msg.strip().replace("\t", " ")

            # 4. 写入 CSV 记录
            writer.writerow({
                "standard_iso_time": standard_time,
                "client_ip": client_ip,
                "cleaned_message": clean_msg
            })
            processed_count += 1

    return processed_count

五、核心要点速查与防御规范

为便于日常开发查验与复用,下表将本文三大领域的最优调用习惯与高危操作进行系统对照:

Python常用代码片段大全:文件操作、字符串处理与时间转换模板
图 4:Python 基础处理模块核心知识速查与防御规范矩阵
操作类别 推荐标准库 / 方法 关键核心参数 / 语法 主要规避风险
路径处理 pathlib.Path Path.resolve() / .mkdir(parents=True) 操作系统平台分隔符 / 与 \ 混淆问题
文件读写 with open(...) mode="r", encoding="utf-8" Windows 默认编码 GBK 导致 UnicodeDecodeError
大文件读取 文件迭代器 for line in f: 惰性遍历 内存耗尽崩溃(Out Of Memory)
前后缀剥离 str.removeprefix / suffix 精确匹配去除 str.lstrip / rstrip 字符集误剪裁
字符串合并 str.join() "".join(list_of_strings) 循环内 += 导致的 $O(N^2)$ 性能瓶颈
时间间隔运算 datetime.timedelta timedelta(days=n, hours=h) 夏令时切换与月份天数不均计算错误
跨国时区转换 zoneinfo.ZoneInfo dt.astimezone(ZoneInfo("...")) Naive 朴素时间在不同服务器环境下的歧义

总结:编写高效稳定的 Python 代码,本质在于善用标准库经过高度优化的底层协议。文件操作依托 with 与 pathlib 建立坚固屏障;字符串处理利用 f-string、join 与语义化剥离保障吞吐性能;时间转换依托 datetime、timedelta 与 zoneinfo 统一时区度量。将上述模板融入日常工程实践,能够显著提升代码质量与系统的可维护性。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。