1. 文件的存储方式
- 文本文件
- 可以使用 文本编辑软件 查看
- 本质上还是二进制文件
- 例如:python 的源程序
- 二进制文件
- 保存的内容 不是给人直接阅读的,而是 提供给其他软件使用的
- 例如:图片文件、音频文件、视频文件等等
- 二进制文件不能使用 文本编辑软件 查看
2. 文件的基本操作
在 计算机 中要操作文件的套路非常固定,一共包含三个步骤:
- 打开文件
- 读、写文件
- 读: 将文件内容读入内存
- 写: 将内存内容写入文件
- 关闭文件
在python中对应的操作如下:
- open 函数负责打开文件,并且返回文件对象
- read/write/close 三个方法都需要通过 文件对象 来调用
读取文件
- open 函数的第一个参数是要打开的文件名(文件名区分大小写)
- 如果文件 存在,返回 文件操作对象
- 如果文件 不存在,会 抛出异常
- read 方法可以一次性 读入 并 返回 文件的 所有内容
- close 方法负责 关闭文件
- 如果 忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问
- 注意:read 方法执行后,会把 文件指针 移动到 文件的末尾
用法示例:
# 1. 打开 - 文件名需要注意大小写
file = open("main.py")
# 2. 读取
text = file.read()
print(text)
# 3. 关闭
file.close()
关于文件指针
文件指针 标记 从哪个位置开始读取数据
第一次打开 文件时,通常文件指针会指向文件的开始位置
当执行了read 方法后,文件指针 会移动到 读取内容的末尾
再次调用 read 方法就无法读取到内容了,因为文件指针已经移动到了文件末尾了。
打开文件的方式
open 函数默认以 只读方式 打开文件,并且返回文件对象, 此外open函数的第二个参数可以支持文件操作的权限模式
语法如下:
f = open("文件名", "访问方式")
写入文件
# 打开文件
f = open("README", "w")
f.write("hello python!\n")
f.write("今天天气真好")
# 关闭文件
f.close()
按行读取文件内容
read 方法默认会把文件的 所有内容 一次性读取到内存,如果文件太大,对内存的占用会非常严重, 可以使用readline 方法来逐行读取
- readline 方法可以一次读取一行内容
- 方法执行后,会把 文件指针 移动到下一行,准备再次读取
读取大文件的正确姿势
# 打开文件
file = open("README")
while True:
# 读取一行内容
text = file.readline()
# 判断是否读到内容
if not text:
break
# 每读取一行的末尾已经有了一个 `\n`, 通过end将print输出的'\n'替换掉,保留readline的
print(text, end="")
# 关闭文件
file.close()
如果想要一次性将所有的行读取出来, 可以使用readlines方法
# 打开文件
f = open('settings.py', "r")
# 读取文件内容
content = f.readlines()
# 检查关键词是否存在
# enumerate() 是 Python 内置函数,用于将一个可迭代对象(例如列表、元组、字符串等)组合为一个枚举对象,同时提供索引和元素值.
for i, line in enumerate(content):
print(f"settings.py:{i + 1} content: {line}")
文件复制操作
(1) 小文件的复制操作
# 1. 打开文件
file_read = open("README")
file_copy = open("README_bak", "w")
# 2. 读取并写入文件
text = file_read.read()
file_copy.write(text)
# 3. 关闭文件
file_read.close()
file_copy.close()
(2) 大文件的复制操作
打开一个已有文件,逐行读取内容,并顺序写入到另外一个文件
# 1. 打开文件
file_read = open("README")
file_copy = open("README_bak", "w")
# 2. 读取并写入文件
while True:
line = file_read.readline()
if not line:
break
file_copy.write(line)
# 3. 关闭文件
file_read.close()
file_copy.close()
with open() as读写文件
语法如下:
with open(文件名, 模式) as 文件对象:
文件对象.方法()
代码示例:
with open('..\data.txt', 'r',encoding="utf-8") as f:
print(f.read())
注意: 这种方式读写数据只会执行一次, 并不会循环执行, 如果要执行多次, 还需要配合循环语句来实现,例如:
with open("main.py", 'rb') as f:
while True:
line = f.readline()
if line:
print(line)
else:
break
3. 文件/目录的常用管理操作
在 Python 中,如果希望通过程序实现文件 / 目录 管理操作功能,例如: 创建、重命名、删除、改变路径、查看目录内容,需要导入 os 模块
(1) 文件操作
(2) 目录操作
4. 文本文件的编码格式
文本文件存储的内容是基于 字符编码 的文件,常见的编码有 ASCII 编码,UNICODE 编码等
- Python 2.x 默认使用 ASCII 编码格式
- Python 3.x 默认使用 UTF-8 编码格式
(1) ASCII 编码
- 计算机中只有 256 个 ASCII 字符
- 一个 ASCII 在内存中占用 1 个字节 的空间
8 个 0/1 的排列组合方式一共有 256 种,也就是 2 ** 8
(2) UTF-8 编码格式
- 计算机中使用 1~6 个字节 来表示一个 UTF-8 字符,涵盖了 地球上几乎所有地区的文字
- 大多数汉字会使用 3 个字节 表示
- UTF-8 是 UNICODE 编码的一种编码格式
(3) Ptyhon 2.x 中如何使用中文
在 Python 2.x 文件的 第一行 增加以下代码,解释器会以 utf-8 编码来处理 python 文件
# *-* coding:utf8 *-*
或者
# coding=utf8
否则有中文的时候会执行报下面错误:
SyntaxError: Non-ASCII character '\xe9' in file
(4) unicode 字符串
- 在 Python 2.x 中,即使指定了文件使用 UTF-8 的编码格式,但是在遍历字符串时,仍然会 以字节为单位遍历 字符串
- 要能够 正确的遍历字符串,在定义字符串时,需要 在字符串的引号前,增加一个小写字母 u,告诉解释器这是一个 unicode 字符串(使用 UTF-8 编码格式的字符串)
# *-* coding:utf8 *-*# 在字符串前,增加一个 `u` 表示这个字符串是一个 utf8 字符串
hello_str = u"你好世界"
print(hello_str)
for c in hello_str:
print(c)