Python open()文件的字符数与指针字节关系
在实际使用过程中,经常会遇到文件读写相关的操作,这个时候我们就要用到文件系统。Python 提供了数据的存储与读取功能,能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。open() 函数格式如下,open()函数中重要的是前两个参数:file是文件名,mode是打开方式,打开文件成功会返回文件流对象,失败会引发异常。下表列出相关打开方式。open(file, mod
在实际使用过程中,经常会遇到文件读写相关的操作,这个时候我们就要用到文件系统。Python 提供了数据的存储与读取功能,能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。
open() 函数格式如下,open()函数中重要的是前两个参数:file是文件名,mode是打开方式,打开文件成功会返回文件流对象,失败会引发异常。下表列出相关打开方式。
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
表 1. open() 打开模式(mode)
参数 | 描述 |
---|---|
r | 以只读方式开启(默认) |
w | 以写入方式打开文件,会覆盖已存在的文件 |
x | 如果文件已经存在,会引发异常 |
a | 以写入方式打开文件,已末尾追加方式写入 |
b | 以二进制模式打开文件 |
t | 以文本模式打开(默认) |
+ | 可读写模式 |
U | 通用换行符支持 |
以下实例将一段文字写入档案,并读取出来。
实例
f = open('myfile.txt', 'w')
f.write('''Jupyter 是基于网页的用于交互计算的应用程序,
可被应用于全过程计算:开发、文档编写、
运行代码和展示结果。''')
f.close()
f = open('myfile.txt')
print(f.read())
f.close()
输出结果为:
Jupyter 是基于网页的用于交互计算的应用程序,
可被应用于全过程计算:开发、文档编写、
运行代码和展示结果。
表2 列出文件对象所支援的方法。
表2. 文件对象常见的方法
方法 | 描述 |
---|---|
close() | 关闭文件 |
read(size=-1) | 从文件读取size个字符,未给定size或给定负值,会读取剩馀的所有字符,回传字符串 |
readline() | 读取一行 |
write(str) | 将字符串str写入文件 |
writelines(seq) | 向文件写入字符串序列seq,seq是一个返回字符串的可迭代对象 |
seek(offset, from) | 在文件中移动文件指针,从from(0-文件起始位置,1-当前位置,2-文件末尾)偏移offset个字节 |
tell() | 返回文件指针所在字节数 |
以下实例为文件操作实例,我们用 read() 方法读取 8 个字符,得到的结果是『Jupyter 』,英文 Jupyter 加上一个空白,为8个字符,tell() 显示指针的方法也是显示 8 ;接著用 seek() 方法返回文件起始处, read() 方法读取 10 个字符,得到的结果是『Jupyter 是基』,英文 Jupyter 加上一个空白,为8个字符,再加上两个中文『是基』,的确是 10 个字符没问题,但有指针显示的却是 14 ,这样表示每个中文字符占用了 3 个字节。
实例
f = open('myfile.txt')
print("'%s'" % (f.read(8)))
print(f.tell())
f.seek(0,0)
print("'%s'" % (f.read(10)))
print(f.tell())
f.close()
输出结果为:
'Jupyter '
8
'Jupyter 是基'
14
我们直接将『 是基』复制到 UltraEdit 编辑器上,切换为 16 进制模式,如下图所示。可以看到空白字符的 ASCII Code 就是 0x20,而『是』则是16进制的 0xE6, 0x98, 0xAF 三个字节所组成。这里要再注意一点,『是』由 16 进制的 0xE6, 0x98, 0xAF 三个字节所组成并非绝对,因为目前是 UTF-8 的编码方式。
图 1. UltraEdit 16进制模式(UTF-8)
比方说我们将编码方式改成 GB18030 ,如下图所示,记得要重新输入『 是基』不然会呈现乱码。
图 2. UltraEdit 一般模式(GB18030)
接著再转换成 16 进制模式,就可以看到,每个中文字符只占用 2 个字节,且内容不同。『是』由 16 进制的 0xCA, 0xC7 两个字节所组成;『基』由 16 进制的 0xBB, 0xF9 两个字节所组成
图 3. UltraEdit 16进制模式(GB18030)
可以使用 Python 将字符串转换成字符时指定编码方式(encode),就可以得到 UltraEdit 16进制模式的结果,代码如下所示。
str1 = ' 是基'
charsUTF8 = str1.encode('utf-8')
charsGB18030 = str1.encode('GB18030')
print("utf-8 字节 16 进制编码为", charsUTF8)
print("GB18030 字节 16 进制编码为", charsGB18030)
输出结果为:
utf-8 字节 16 进制编码为 b' \xe6\x98\xaf\xe5\x9f\xba'
GB18030 字节 16 进制编码为 b' \xca\xc7\xbb\xf9'
Reference
- Unicode HOWTO, https://docs.python.org/3/howto/unicode.html

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)