在计算机中,文件指的是存储在磁盘上的数据序列,它可以包含任何数据内容。
文件名是文件的一个重要属性。文件名通常由文件主名和扩展名构成。一般来说, 主名和扩展名之间用一个圆点“.”隔开。 扩展名由 1 ~ 4 个字符组成,用于表示文件的类型。 例如:report.docx 是主名为report、扩展名为docx 的word文档,searchGoods.py 是主名为searchGoods、扩展名为 py 的 Python 源文件。
计算机中使用文件夹(也常常称为目录)来组织文件。文件夹可以包含文件和其他文件夹。
路径指明了文件在计算机中存储的位置。路径中包含了存储文件的各级文件夹。文件夹之间用斜线隔开。在 Windows 中使用倒斜杠
\
来分隔,在 Mac OS 和 Linux 中使 用正斜杠/
作为路径分隔符。有两种方式表示文件路径。
- 绝对路径:从根目录开始的路径。
- 相对路径:从当前工作目录开始的路径。
还有点
.
和点点..
文件夹。它们不是真正的文件夹,而是可以在路径中使用的特殊名称。单个的句点(“点”)用作文件夹目名称时,是“这个目录”的缩写。两个句点(“点点”)意思是父文件夹。
每个运行在计算机上的程序, 都有一个“当前工作目录”。 在 Python 中, 可以用
os
模块中的getcwd()
方法获取当前工作目录:
import os
os.getcwd()
假如在根目录的 Users 文件夹下有一个文件夹 xiaoaoquan, 其中有一个 Documents 文件夹,存储了 report.docx 文件。
用绝对路径描述这个文件的位置为:
/Users/xiaoaoquan/Documents/report.docx
如果当前工作目录是 /Users/xiaoaoquan,用相对路径描述这个文件的位置为:
Documents/report.docx
在
os
模块中还包含大量文件相关操作的方法。 例如,listdir(path=None)
方法返回指 定目录中包含的文件和子目录列表,默认情况下返回当前工作目录中的信息。
os.listdir()
计算机上存储的文件都是以二进制存储的,一般可以采取以下两种方式读取:
- 文本文件:文件内容是常规的字符, 不会包含字体、大小和颜色等信息, 例如带 有 .py 扩展名的 Python 源文件。
- 二进制文件:文件内容是特殊的字节数据, 例如 Word 文档、PDF 文档、图像文件 和编译后的可执行文件。
计算机中使用字符集表示字符。最常用的美国标准信息交换代码(American Standard Code for Information Interchange,ASCII 码)定义了从 0 到 127 的整数对应的字符。
print(ord('a'))
print(chr(97))
Unicode
突破了ASCII
码只能表示英文字母和符号的限制, 为每种语言的每个字符设定了唯一的编码,以满足跨语言、跨平台进行文本转换和处理的要求。
print(ord('嗷'))
将
Unicode
字符按照特定编码规则(例如UTF8
编码)翻译为原始字节形式的过程被称为编码。反过来,把原始字节翻译为Unicode
字符串的过程则被称为解码。
在 Python 中,操作文件包含 3 个步骤:
- 调用
open()
函数打开物理文件,返回一个文件对象。- 调用文件对象的
read()
或write()
方法读写文件。- 调用文件对象关闭文件。
Python 通过内置的 open()
函数打开文件并创建该对象。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file1 = open('test.txt')
print(type(file1))
print(file1)
利用内置
open()
函数创建文件对象赋值给 file1 后, 直接查看其内容可以看到该 对象打开的物理文件(含路径和文件名),打开模式和编码。
参数
mode
是打开文件的模式,如表所示,默认值为 ‘rt
’:
模式 | 说明 |
---|---|
‘r’ | 只读模式,如果文件不存在,返回异常FileNotFoundError,默认值 |
‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖源文件 |
‘x’ | 创建写模式,文件不存在则创建,存在则返回异常FileExistsError |
‘a’ | 追加写模式,文件不存在则创建,存在则在原文件最后追加内容 |
‘b’ | 二进制文件模式 |
‘t’ | 文本文件模式,默认值 |
‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
参数
encoding
是指定文本文件读取数据时解码或写入数据时编码所用的规则, 为默认值None
时使用的规则取决于操作系统。通过sys
模块的方法可以查看当前默认编码。
import sys
sys.getdefaultencoding()
在操作完文件后,必须将文件关闭,这点非常重要。
调用文件对象的
close()
方法可以关闭文件, 终止文件对象与磁盘物理文件的连接、 释放操作系统资源。在写入和追加写入模式下,暂存于内存中的文件内容会输出到磁盘中永久保存。
file1 = open('test.txt')
file1.close()
当指定
open()
函数的mode
参数值为 ‘w
’ ‘x
’ 和 ‘a
’ 时,可以向创建的文件对象中写入数据。使用文件对象的write()
方法就可以将文本写入文件中。
file_obj.write(text)
file1 = open('test.txt', 'w', encoding='utf-8')
file1.write('我是小嗷犬。\n')
file1.close()
在 Python 中, 使用
open()
函数打开文件时,mode
参数的默认值是“rt
”, 即以文本文件的形式读取文件。
对于可读的文件对象,可以使用表的四种方法读取内容:
方法 | 说明 |
---|---|
以字符串形式返回整个文件内容 | |
默认读入从当前位置至文件末尾的内容;当size参数为大于0的正整数n时, 从文件中读入最多n个字符 | |
默认从文件中读入一行内容;当size参数为大于0的正整数n时, 从当前行读入最多n个字符 | |
默认返回以文件中所有行为元素构成的列表;当hint参数为大于0的正整数n时,读入的所有行字符数不超过 n行 |
当打开文本文件时,会有一个指针指向文件开头的字符。每次读取数据后,指针会往后移动到相应位置。 例如,在使用
readline()
读入一行内容时, 指针会移动到下一个换行符的后面,直到指向文件尾部标记EOF(end of file)
。
在绝大多数情况下,对于文本文件的读取都是逐行读取。文件对象本身是一个可迭代对象。 因此,通常情况下,推荐使用
for
循环来逐行读取文本文件内容。
file1 = open('test.txt', 'w', encoding='utf-8')
file1.write('我是小嗷犬。\n喜欢嗷嗷嗷。\n')
file1.close()
file2 = open('test.txt', encoding='utf-8')
for line in file2:
print(line)
file2.close()
文件作为可迭代对象, 可以使用列表推导式和
map()
函数对每行进行相应处理, 生成新的列表。
file1 = open('test.txt', 'w', encoding='utf-8')
file1.write('我是小嗷犬,\n喜欢嗷嗷嗷。\n')
file1.close()
file2 = open('test.txt', encoding='utf-8')
lines1 = [line.rstrip() for line in file2]
print(lines1)
lines2 = list(map(lambda line: line.rstrip(), file2)
print(lines2)
file2.close()
Python 中的
with
语句适用于对资源进行访问的场合, 确保不管使用过程中是否发生异常都会释放资源,比如文件使用后自动关闭。
file1 = open('test.txt', 'w', encoding='utf-8')
file1.write('我是小嗷犬。\n喜欢嗷嗷嗷。\n')
file1.close()
with open('test.txt', encoding='utf-8') as file2:
for line in file2:
print(line)
在 Python 中, 提供的
pickle
模块能够将 Python 对象直接存储到文件中。 在需要使用数据时,直接从文件中读取,并还原为 Python 对象。
注意,
pickle
操作的不是文本文件, 而是二进制文件。 因此, 存储的文件如果直接使用文本编辑器,则打开无法查看具体内容。
将 Python 对象存储到
pickle
文件的语法是:
pickle.dump(obj, file)
从
pickle
文件中将二进制数据读取出来重建为 Python 对象的语法是:
pickle.load(file)
将列表
ls
使用pickle
模块存储在二进制文件 test.pkl 中,然后再次从文件中读取数据,重建为列表后打印:
import pickle
ls = ['Python', 'Java', 'C', 'Golang', 'C++', 'C#']
file1 = open('test.pkl', 'wb')
pickle.dump(ls, file1)
file1.close()
file2 = open('test.pkl', 'rb')
new_ls = pickle.load(file2)
print(new_ls)
JSON(javascript object notation)是一种和语言无关的轻量级数据交换格式, 采用文本格式来存储和表示数据。这种格式便于阅读和编写,也易于程序的解析和生成。
JSON 语法规则与 Python 中的字典和列表非常相似:
- 利用一对方括号 [] 表示数组;
- 利用一对花括号 {} 表示对象;
- 利用冒号分割键值对;
- 利用逗号分隔数组的元素或对象的键值对。
在 Python 中, 可以通过第三方库 json 方便地实现 JSON 格式字符串与 Python 字典和列表的相互转换。 将 Python 对象转换为 JSON 格式字符串的语法是:
json.dumps(obj, ensure_ascii=True)
将 JSON 格式字符串转换为 Python 对象的语法是:
json.loads(s)
将列表
ls
转换为 JSON 格式字符串的代码如下所示:
import json
ls = ['Python', 'Java', 'C', 'Golang', 'C++', 'C#']
json_str = json.dumps(ls, ensure_ascii=False)
print(type(json_str))
print(json_str)
相反,将上面代码中的
json_str
转换为 Python 列表的代码如下所示:
import json
ls = ['Python', 'Java', 'C', 'Golang', 'C++', 'C#']
json_str = json.dumps(ls, ensure_ascii=False)
new_ls = json.loads(json_str)
print(type(new_ls))
print(new_ls)