在实际使用过程中,经常会遇到文件读写相关的操作,这个时候我们就要用到文件系统。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
Logo

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

更多推荐