Python中文件编码、读写操作方法与实战技巧
作者:流㶡
1.文件编码
在计算机中,一个文件由3部分组成,分别是文件保存的路径(位置)、文件类型和文件的内容。
1.1文件的编码方式
编码(Encoding) 是计算机将字符(如 'A'、'中')转换为二进制字节(bytes)的规则。不同编码方式对同一字符的表示可能不同。
常见编码格式:
| 编码 | 特点 | 适用场景 |
|---|---|---|
| UTF-8 | 可变长度,兼容 ASCII,支持全球所有语言 | ✅ 推荐默认使用 |
| ASCII | 仅支持英文字符(0~127) | 纯英文环境 |
| UTF-16/UTF-32 | 固定长度,占用空间大 | 特定系统内部使用 |
关键原则:
- 保存和读取必须使用相同编码,否则会出现乱码!
- 优先使用
UTF-8,它是 Web 和现代系统的标准。
1.2 编码与 Unicode 值的转换:chr()与ord()函数详解
在 Python 中,字符(Character) 与 Unicode 码点(Code Point) 之间可以通过两个内置函数相互转换:
ord():将字符转换为对应的 Unicode 整数值chr():将 Unicode 整数值转换回对应的字符
这两个函数是理解字符编码、处理文本底层逻辑的重要工具。
ord()函数:字符 → Unicode 码点
语法:
ord(c)
- 参数
c必须是长度为 1 的字符串 - 返回该字符在 Unicode 编码表中的十进制整数编号
示例:
print(ord('A')) # 65
print(ord('a')) # 97
print(ord('0')) # 48
print(ord('中')) # 20013
print(ord('😊')) # 128522(表情符号也有 Unicode 编码!)应用场景:
- 判断字符类型(如
ord('A') <= ord(ch) <= ord('Z')判断是否大写字母) - 调试字符编码问题
chr()函数:Unicode 码点 → 字符
语法:
chr(i)
- 参数
i是一个有效的 Unicode 码点整数(范围:0 ~ 0x10FFFF) - 返回对应的单字符字符串
示例:
print(chr(65)) # 'A'
print(chr(97)) # 'a'
print(chr(20013)) # '中'
print(chr(128522)) # '😊'
# 生成字母表
letters = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
print(''.join(letters)) # ABCDEFGHIJKLMNOPQRSTUVWXYZ注意:若传入无效码点(如负数或超出范围),会抛出 ValueError。
chr()与ord()的互逆关系
这两个函数互为反函数:
char = 'Python'
for c in char:
code = ord(c)
restored = chr(code)
print(f"'{c}' → [code] → '{restored}'")输出:
'P' → 80 → 'P'
'y' → 121 → 'y'
't' → 116 → 't'
'h' → 104 → 'h'
'o' → 111 → 'o'
'n' → 110 → 'n'
与编码(Encoding)的关系
虽然 ord()/chr() 操作的是 Unicode 码点,但文件存储时需通过编码(如 UTF-8)转为字节:
text = "中"
unicode_val = ord(text) # 20013(Unicode 码点)
utf8_bytes = text.encode('utf-8') # b'\xe4\xb8\xad'(UTF-8 编码后的字节)
# 验证:从字节解码回字符
restored = utf8_bytes.decode('utf-8')
print(restored == text) # True关键区别:
ord()/chr():操作 Unicode 层面(逻辑字符).encode()/.decode():操作 字节层面(物理存储)
实战应用示例
1. 凯撒密码(Caesar Cipher)
def caesar_encrypt(text, shift):
result = []
for char in text:
if char.isalpha():
base = ord('A') if char.isupper() else ord('a')
shifted = (ord(char) - base + shift) % 26
result.append(chr(base + shifted))
else:
result.append(char)
return ''.join(result)
encrypted = caesar_encrypt("Hello", 3)
print(encrypted) # Khoor2. 生成连续字符序列
# 生成数字字符 '0'~'9'
digits = [chr(ord('0') + i) for i in range(10)]
# 生成十六进制字符 '0'~'F'
hex_chars = digits + [chr(ord('A') + i) for i in range(6)]
print(''.join(hex_chars)) # 0123456789ABCDEF常见误区
| 误区 | 正确理解 |
|---|---|
“ord('AB') 可以获取字符串编码” | ❌ ord() 仅接受单个字符 |
“chr(65) 返回 ASCII 字节” | ❌ 返回的是 Unicode 字符 'A',与编码无关 |
“中文字符没有 ord() 值” | ❌ 所有 Unicode 字符都有唯一码点 |
总结
| 函数 | 作用 | 典型用途 |
|---|---|---|
ord(c) | 字符 → Unicode 整数 | 字符判断、加密、编码分析 |
chr(i) | Unicode 整数 → 字符 | 生成字符、解密、构造字符串 |
2.文件的操作
Python 通过内置函数 open() 实现文件操作,核心流程:打开 → 读/写 → 关闭。
2.1 打开文件
基本语法:
file = open(filename, mode='r', encoding='utf-8')
常用模式(mode):
| 模式 | 说明 |
|---|---|
'r' | 只读(默认) |
'w' | 覆盖写模式 |
| ' x ' | 创建写模式。如果计算机中不存在此文件则创建一个新文件,如果存在此文件则返回异常错误FileExistsError |
'a' | 追加(在末尾写入)。只允许对文件进行写操作,如果计算机中存在此文件,则在该文件的末尾继续写入 |
| 'b' | 二进制读/写 |
| ' t ' | 文本模式。与‘b’模式相互对应,‘t’模式为默认模式 |
| ‘ + ’ | 增加模式。与‘r’、‘w’、'x'、'a'模式一同使用,可在原功能基础上增加读写功能,例如‘r+’表示文件可读可写 |
推荐写法:使用with语句(自动关闭文件)
with open('example.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 文件在此自动关闭,即使发生异常为什么用 with?
避免忘记 f.close() 导致资源泄漏(尤其在异常情况下)。
2.2 读取文件
(1)read():读取全部内容
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read() # 返回整个文件字符串(2)readline():读取一行
with open('log.txt', 'r', encoding='utf-8') as f:
first_line = f.readline() # 包含换行符 \n(3)readlines():读取所有行(返回列表)
with open('config.txt', 'r', encoding='utf-8') as f:
lines = f.readlines() # ['line1\n', 'line2\n', ...](4)逐行遍历(内存友好,推荐大文件使用)
with open('large_file.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line.strip()) # strip() 去除换行符大文件处理:避免 read() 一次性加载,用 for line in f 逐行读取。
2.3 写入文件
(1)write():写入字符串
with open('output.txt', 'w', encoding='utf-8') as f:
f.write("Hello, World!\n")
f.write("Python 文件操作")注意:
'w'模式会清空原文件!- 写入内容必须是字符串(非字节)
(2)writelines():写入字符串列表
lines = ["第一行\n", "第二行\n"]
with open('list.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)(3)追加模式'a'
with open('log.txt', 'a', encoding='utf-8') as f:
f.write("\n[INFO] 新日志条目")(4)写入非字符串数据(如数字、列表)
需先转换为字符串:
data = [1, 2, 3]
with open('numbers.txt', 'w', encoding='utf-8') as f:
f.write(str(data)) # 写入 "[1, 2, 3]"高级技巧:使用 json 模块保存结构化数据
import json
data = {"name": "张三", "age": 25}
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)3.常见问题与最佳实践
乱码问题
原因:打开文件时指定的 encoding 与文件实际编码不一致。
解决:
- 用编辑器(如 VS Code)查看文件编码
- 尝试常见编码(
utf-8,gbk) - 使用
chardet库自动检测编码:
import chardet
with open('unknown.txt', 'rb') as f:
raw_data = f.read()
encoding = chardet.detect(raw_data)['encoding']文件未关闭
- 后果:资源泄漏、文件被锁定、数据未写入磁盘。
- 解决:始终使用
with open(...) as f:
安全写入(避免写到一半崩溃)
# 先写临时文件,再重命名(原子操作)
with open('temp.txt', 'w', encoding='utf-8') as f:
f.write(new_content)
import os
os.replace('temp.txt', 'final.txt') # 安全替换4.总结:文件操作核心要点
| 操作 | 推荐方式 | 注意事项 |
|---|---|---|
| 打开 | with open(..., encoding='utf-8') as f: | 指定编码,用 with |
| 读取 | 大文件用 for line in f | 避免 read() 加载过大文件 |
| 写入 | 'w' 覆盖,'a' 追加 | 内容必须是字符串 |
| 编码 | 统一使用 UTF-8 | 读写编码必须一致 |
到此这篇关于Python中文件编码、读写操作方法与实战技巧的文章就介绍到这了,更多相关Python文件操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
