python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python文件操作

Python中文件编码、读写操作方法与实战技巧

作者:流㶡

本文主要介绍了计算机文件的基本结构和编码方式,重点讲解了Python中的文件操作与字符编码处理,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

1.文件编码

在计算机中,一个文件由3部分组成,分别是文件保存的路径(位置)文件类型文件的内容

1.1文件的编码方式

编码(Encoding) 是计算机将字符(如 'A''中')转换为二进制字节(bytes)的规则。不同编码方式对同一字符的表示可能不同。

常见编码格式:

编码特点适用场景
UTF-8可变长度,兼容 ASCII,支持全球所有语言✅ 推荐默认使用
ASCII仅支持英文字符(0~127)纯英文环境
UTF-16/UTF-32固定长度,占用空间大特定系统内部使用

关键原则:

1.2 编码与 Unicode 值的转换:chr()与ord()函数详解

在 Python 中,字符(Character) 与 Unicode 码点(Code Point) 之间可以通过两个内置函数相互转换:

这两个函数是理解字符编码、处理文本底层逻辑的重要工具。

ord()函数:字符 → Unicode 码点

语法

ord(c)

示例

print(ord('A'))      # 65
print(ord('a'))      # 97
print(ord('0'))      # 48
print(ord('中'))     # 20013
print(ord('😊'))     # 128522(表情符号也有 Unicode 编码!)

应用场景:

chr()函数:Unicode 码点 → 字符

语法

chr(i)

示例

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

关键区别:

实战应用示例

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)  # Khoor

2. 生成连续字符序列

# 生成数字字符 '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 文件操作")

注意:

(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 与文件实际编码不一致。

解决

  1. 用编辑器(如 VS Code)查看文件编码
  2. 尝试常见编码(utf-8gbk
  3. 使用 chardet 库自动检测编码:
import chardet
with open('unknown.txt', 'rb') as f:
    raw_data = f.read()
    encoding = chardet.detect(raw_data)['encoding']

文件未关闭

安全写入(避免写到一半崩溃)

# 先写临时文件,再重命名(原子操作)
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文件操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文