python 基础系列(八) — Python中的文件操作
![](https://benchegnzhou.github.io/imagerepository/androidImg/image_000460.jpg)
python基础系列索引
python 基础系列(一) — Python介绍
python 基础系列(二) — Python基本语法
python 基础系列(三) — Python中的变量进阶
python 基础系列(四) — Python中的面向对象
python 基础系列(五) — Python中的继承
python 基础系列(六) — Python的异常及其处理
python 基础系列(七) — Python中的模块
python 基础系列(八) — Python中的文件操作
python 基础系列(九) — Python中的vi – 终端中的编辑器
python 基础系列(十) — Windows CMD命令大全
python 基础系列(十一) — 使用PyCharm远程调试树莓派python代码 — Windows CMD命令大全
如果你对python感兴趣,不妨看一下我的其他文章
1.文件的存储方式
-
文本文件
- 可以使用文本编辑器
- 本质上还是二进制文件
-
二进制文件
- 保存的内容不是直接给人阅读的,而是提供给其他文件使用的
- 例如: 图片文件、音频文件、视频文件
- 二进制文件不能使用人本编辑软件查看
2.文件的基本操作
操作文件的套路
- 打开文件
- 读、写文件
- 关闭文件
操作文件的函数/方法
序号 | 函数/方法 | 说明 |
---|---|---|
01 | open | 打开文件,并返回文件对象 |
02 | read | 将文件内容读取到内存 |
03 | write | 将指定内容写入文件 |
04 | close | 关闭文件 |
open
函数负责打开文件,并返回文件对象read/write/close
三个方法都需要,文件对象来调用
2.3 read 方法 – 读取文件
-
open
函数的第一个参数是要打开的文件名(文件名区分大小写)- 如果文件存在,返回 文件操作对象
- 如果文件不存在,抛出异常
-
read
方法可以一次性读入
并返回
文件的所有内容 -
close
方法负责关闭文件
- 如果 忘记关闭文件,会造成系统资源消耗,而且会影响到后续对文件的访问、修改
-
注意:方法执行后,会把 文件指针 移动到文件的末尾
# 1. 打开文件 ,注意文件文件名大小写, 注意指定编码集 file = open("README.txt", encoding="utf-8") # 2. 一次性读取所有文件内容 text = file.read() print(text) # 3. 关闭打开的文件 file.close()
文件指针
- 文件指针 标记 从按个位置开始读取数据
- 第一次打开文件时, 通常 文件指针会指向文件的开始位置
- 当执行了
read
方法之后,文件指针 会移动到 读取内容的末尾- 默认情况下会移动到文件的末尾。
注意:当使用
read
方法读取内容后,再次执行read
方法读取时,文件内容为空
代码示例
file = open("README.txt", encoding="utf-8")
text = file.read()
print(text)
print(len(text))
text = file.read()
print(text)
print(len(text))
file.close()
运行结果
可以的
3
0
打开文件的方式
open
函数默认只读方式打开文件,并返回文件对象
语法如下
f = open("文件名","访问方式",, encoding="文件编码方式"))
访问方式 | 说明 |
---|---|
r | 以只读方式打开文件,文件的指针将会放在文件的开头、这是默认模式,如果文件不存在抛出异常 |
w | 以写的方式打开文件,如果文件存在会覆盖;文件不存在会创建新文件 |
a | 已追加的方式打开文件,如果文件已存在,文件指针会放在文件结尾;如果文件不存在会创建新文件并写入 |
r+ | 以读写方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常 |
w+ | 以读写方式打开文件。如果文件存在会被覆盖,如果文件不存在会创建新文件 |
a+ | 以读写方式打开文件。如果该文件已存在,文件指针将会放在文件结尾;如果文件不存在创建新文件写入 |
提示:
r+/w+/a+
的方式操作文件,会频繁的移动文件指针,影响文件的操作效率,开发中更多的是 以只读、只写或者追加的方式操作文件
按行读取文件内容
read
方法默认情况下会把文件的 所有内容一次性读取到内存中- 如果文件太大内存占用严重
readline
方法
readline
方法可以一次性读取一行内容- 方法执行后,会把文件指针移动到下一行,准备再次读取
读取大文件的正确姿势
file = open("README.txt", encoding="utf-8")
while True:
# 读取一行
line = file.readline()
# 判断是否读取到内容
if not line:
break
# 每一行文件的末尾默认已经有换行
print(line,end="")
file.close()
运行结果
五日观妓
唐代:万楚
西施谩道浣春纱,碧玉今时斗丽华。
眉黛夺将萱草色,红裙妒杀石榴花。
新歌一曲令人艳,醉舞双眸敛鬓斜。
谁道五丝能续命,却令今日死君家。
文件复制
代码示例
# 打开文件
file_read = open("README.txt", "r", encoding="utf-8")
file_write = open("copy.txt", "w", encoding="utf-8")
# 读写文件
file_write.write(file_read.read())
# 关闭
file_read.close()
file_write.close()
读取大文件
# 打开文件
file_read = open("README.txt", "r", encoding="utf-8")
file_write = open("copy.txt", "a", encoding="utf-8")
while True:
# 读写文件
line = file_read.readline()
if not line:
break
file_write.write(line)
# 关闭
file_read.close()
file_write.close()
文件/目录的常用操作
-
在 终端/文件浏览器 、 中可以执行常规的
文件/目录
操作管理,例如- 创建、重命名、删除、干煸路径、查看内容、…
-
在
python
中,如果希望通过程序事项上述功能,需要导入os
模块
文件操作
序号 | 方法名 | 说明 | 示例 |
---|---|---|---|
01 | rename | 重命名文件 | os.rename(源文件名,目标文件名) |
02 | remove | 删除文件 | os.rename(文件名) |
目录操作
序号 | 方法名 | 说明 | 示例 |
---|---|---|---|
01 | listdir | 查看目标列表 | os.listdir(目录名) |
02 | mkdir | 创建目录 | os.mkdir(目录名) |
03 | rmdir | 删除目录 | os.rmdir(目录名) |
04 | getcwd | 获取当前目录 | os.getcwd() |
05 | chdir | 修改工作目录 | os.chdir(目录名) |
06 | path.isdir | 判断是否是文件夹 | os.path.isdir(文件路径) |
提示:文件和目录操作都支持 相对路径和绝对路径
文本文件的编码格式
- 文本文件存储的内容是基于 字符编码 的文件,常见的编码
ASCII
编码,UNICODE
编码等
Python 2.x 默认使用
ASCII
编码
Python 3.x 默认使用UFT-8
编码
ACII 编码和 UNICODE 编码
-
在python 2.x 文件的 第一行 增加以下代码 , 解释器会以
utf-8
编码处理python
文件# *-* coding:utf8 *-*
这种方式是官方推荐使用的!
# coding=utf-8
-
unicode 字符串
-
在
Python 2.x
中,机使指定了文件使用UTF-8
的编码格式,但是在遍历字符串时,任然 以字节为单位遍历 字符串 -
要能够 正确的遍历字符串,在定义字符串时,需要 在字符串的引号前 ,增加一个小写字母
u
,告诉解释器这是一个unicode
字符串(使用UTF-8
编码格式的字符串)
在 Python 2.x
中定义中文字符串
str = u"你好世界"
可以解决乱码问题
eval 函数
eval()
函数十分强大 – 将字符串 当成 有效的表达式 来求值并 返回计算结果
示例代码
# 基本的数学计算
print(eval("1 + 1"))
# 字符串重复 eval(参数必须是一个字符串)
print(eval("'*' * 10"))
# 将字符串转换成列表
print(eval("type([1,2,3])"))
# 将字符串转换成列表
print(eval("type({'name':'小明','age':12})"))
执行结果:
2
**********
<class 'list'>
<class 'dict'>
应用场景
-
制作一个简易的计算器,用户输入计算表达式,返回计算结果
str = input(“请输入计算表达式”)
print(eval(str))
运行
输入 1+2
返回 3
不要滥用 eval()函数
在开发时千万不要使用
eval()
函数直接转换input
函数的结果
比如在 input
函数中直接输入 如下代码
__import__('os').import('ls')
上述代码等价于
import os
os.system("终端命令")
执行成功返回0
执行失败报错