Python提供了内置的文件对象,以及对文件、目录进行操作的内置模块 文件有两个属性,文件名和路径
1、文件路径
文件路径大家都理解,比如我有一个文件log.txt文件放在D盘,"D:\log.txt"这个就是这个文件的文件路径 路径分为绝对路径和相对路径绝对路径
总是从根目录开始,不依赖当前的工作目录 Window 系统中以盘符(C:、D:)作为根文件夹。例如:C:\Users\YourName\Documents\file.txt 而 OS X 或者 Linux 系统中以 / 作为根文件夹。例如:/home/yourname/documents/file.txt相对路径
相对路径是相对于当前工作目录的路径project/ │ ├── main.py └── data/ └── file.txt
如果我们读取file.txt文件,我们就可以使用相对路径,data/file.txt就是上述的相对路径 读取文件使用open函数,下边我们详细讲解,这里我们直接使用
file_path = 'data/file.txt' with open(file_path, 'r') as file: lines = file.readlines() print(lines) # 执行结果 ['abcdefg']
路径拼接
我们在实际工作中,会经常联合使用,比如文件的工作目录是不固定的,但是文件在项目中是固定的,所以我们确定文件的相对路径,然后拼接文件在项目中的路径,这样不管目录怎么变,我们文件的指向路径永远不会出错 首先我们用到了os模块os.path.join(path1, path2, ...)
: 拼接路径os.path.dirname(__file__):
当前文件的工作目录
project/ │ ├── main.py └── data/ └── file.txt
我们使用拼接的方式确定file.txt文件的路径
import os # 获取当前文件的所在的目录 base_dir = os.path.dirname(__file__) # 将路径与文件名连接起来 file_path = os.path.join(base_dir, 'data/file.txt') # 打开文件,并读取所有行 with open(file_path, 'r') as file: lines = file.readlines() print(lines)
2、open文件
open() 函数是Python内置的一个函数认识open
f = open('文件路径', mode='r')查看一下源码
file
: 要打开的文件路径(字符串)或文件对象。mode
: 打开文件的模式,如 'r'(读取)、'w'(写入)、'a'(追加)等
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
r | 只读 | error | - |
r+ | 读写 | error | T |
w | 只写 | create | T |
w+ | 读写 | create | T |
a | 只写 | create | F,尾部追加写 |
a+ | 读写 | create | F,尾部追加写 |
wb | 只写二进制字符串,写入bytes | create | T |
rb | 只读二进制字符串,返回bytes | error | - |
打开操作三板斧
1.打开文件:open函数,返回文件对象 2.对文件进行读写操作,read()函数/write()函数 3.关闭文件:close函数,关闭文件小栗子
打开project项目下的file文件,打印输出读取文件的内容project/ │ ├── main.py └── data/ └── file.txt
练习:
# 1、打开文件 f = open('data/file.txt', 'r') # 2、读取文件内容 content = f.read() print(content) # 3、关闭文件 f.close()
3、open另一种写法
上边我们已经学会了open函数的使用以及操作文件的三板斧 但是呢,还是会有问题的,在上边的表格中我们可以看到,如果文件不存在的时候,运行代码会报错 而且当文件读写时都有可能产生 IOError ,一旦出错,后面的 f.close() 就不会调用with open
所以我们使用open函数还有另一种用法with open()用法好处:结合了
open()
函数和上下文管理器 with
语句,用于打开文件并在操作完成后自动关闭文件
with open(file_path, mode, encoding) as file: # 在文件上进行操作 # 文件会在代码块退出后自动关闭
encoding编码格式小知识: f = open(...)是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8; f = open('a.txt','r',encoding='utf-8')
小栗子
还是上述那个例子project/ │ ├── main.py └── data/ └── file.txt
我们使用with...open函数打开读取文件,打印输出文件内容
# 使用with语句打开文件file.txt,以只读模式 with open('data/file.txt', 'r') as f: # 将文件内容读取到content变量中 content = f.read() # 打印content变量 print(content) # 执行结果 abcdefj
4、文件操作的模式
这里我们讲三种文件操作模式:- r(默认的):只读
- w:只写
- a:只追加写
r 模式的使用
# r只读模式: 在文件不存在时则报错 with open('data/file.txt', 'r') as f: content = f.read() print(content)
读取文件,如果不命名编码格式,默认采用gbk编码格式,这里如果我们要读取的文件格式是utf-8,这时候我们可以open函数指定添加文件的编码格式
# 增加coding编码格式 with open('data/file.txt', 'r', encoding='utf-8') as f: content = f.read() print(content)
w 模式的使用
# w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件写入新内容 with open('data/file.txt', 'w', encoding='utf-8') as f: f.write('你好,世界!\n') f.write('你好,中国!\n') f.write('111\n222\n333\n')
写入文件我们先把mode模式改成w,然后在下边调用文件对象的write方法写入文件内容,注意的是,如果文件不存在不会报错,会自动创建然后写入文档,如果文件存在有内容,写入内容后文件内容会清空写入新内容 查看写入内容:
a模式的使用
# a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件内容追加写入内容 with open('data/file.txt', 'a', encoding='utf-8') as f: f.write('追加的内容1\n') f.write('追加的内容2\n') f.write('111\n222\n333\n')
查看追加内容:
w 模式与 a 模式的异同
- 相同:都是往文件写入内容,文件不存在的时候会创建文件
- 不同:w模式是每次写入都会清空原来的文件内容,把写入的内容写入到文件里,a模式是不会清空原来的文件内容,会在后边追加写入文件内容
5、读写文件
文件读取read()、readline()、readlines()
read() 优点:逐个字节或字符读取所有内容 劣势:大文件太大无法读取,不适用于读取大文件with open('data/file.txt', 'r', encoding='utf-8') as f: content = f.read() print(content)
readline() 优点:逐行读取文件内容 劣势:比readlines()慢很多
with open('data/file.txt', 'r', encoding='utf-8') as f: content = f.readline() print(content)
使用readline只会读取一行数据,而且读取第一行内容时,会读取最后的换行符,所以使用print函数打印的时候默认会换行,多出一个空行 这块我们可以使用数字来控制读取的字节数
with open('data/file.txt', 'r', encoding='utf-8') as f: # 读取6个字符数 content = f.readline(6) print(content)
readlines() 优点:读取所有行文件内容;自动将文件内容分析成一个行的列表
with open('data/file.txt', 'r', encoding='utf-8') as f: content = f.readlines() print(content)
执行结果:
['你好,世界!\n', '你好,中国!\n', '111\n', '222\n', '333\n', '追加的内容1\n', '追加的内容2\n', '111\n', '222\n', '333\n']
你会发现:
- readlines()读取所有行然后把它们作为一个字符串列表返回
- 返回的每一行内容包含换行符
文件写入write()和writelines()
write() 优点:向文件写入单行字符串数据 每次调用write()
都会将参数字符串写入文件,不会自动添加换行符
with open('data/file.txt', 'r', encoding='utf-8') as f: content = f.read() print(content)
writelines() 优点:向文件写入字符串列表 一次性向文件写入多行字符串数据符
lines = ['Line 1\n', 'Line 2\n', 'Line 3\n'] with open('data/file.txt', 'w', encoding='utf-8') as f: f.writelines(lines)