python 的文件操作
文件的作用
- 永久的保存数据
- 文件中的内存保存在硬盘中
- 硬盘中的数据都是 0 和 1, 软件将 0 和 1的组合转换成我们认识的汉字
绝对路径和相对路径
- 绝对路径:是从目录开始的路径
- 相对路径: 以代码文件为参考的位置<.当前位置…上一级目录>
- 每个路径之间可以使用 / 隔开
- windows 下的注意点: \ 反斜杠是转义字符
- f = open(‘C:\Users\nl\Desktop\code\day07\b.txt’, ‘w’, encoding=‘utf-8’)
- 在字符串之前写上 r,字符串不再进行转义
f = open(r’C:\Users\nl\Desktop\code\day07\b.txt’, ‘w’, encoding=‘utf-8’)
打开文件
打开文件 open(file, mode=“r”, encoding)
- file 为文件名,要打开的文件,类型的str.
- 打开的方式, mode=“r” 是缺省参数, r read 只读, w write 只写, a append 追加
- encoding 打开文件的编码(怎么将汉字变为二进制(0,1)),常见的编码有 utf-8(一个汉字三个字节)
- gbk(一个汉字两个字节), open( 函数), 在windows下默认是gbk方式打开, 在Linux 和 mac 下,默认是 utf-8 打开
- pycharm 的默认打开方式为 utf-8
- 返回值, 返回一个文件对象, 要通过文件对象操作文件
打开方式 | 文件是否存在 |
---|---|
w 只写,文件指针在文件的开头 | 文件存在, 覆盖原文件.文件不存在, 创建文件 |
a 追加, 文件指针在文件的末尾 | 文件存在, 文件末尾追加内容,文件不存在,创建文件,写入内容使用文件对象.write() |
r 只读 | 文件存在, 打开文件,文件指针的文件开头.文件不存在,程序报错. read() 会移动文件指针 |
文件的读写
- 写文件 文件对象.write(字符串)
- 参数就是写入的内容
- 返回值, 写入的长度
- 文件对象.close 关闭文件. 关闭文件之后,文件对象不能使用, 不能再对文件进行操作,关闭的同时会自动保存文件
f = open('a.txt', 'w', encoding='utf-8')
num = f.write("hello")
print(num)
# 控制台输出
5
- 读文件使用read()函数
- 文件对象.read(num) num代表读取多少字节, num可以不写,代表读取全部
- 返回值是读取的内容,str
- \n 也占一个字符
"""
b.txt 中的内容为:
aaa12
454
65
56
2
23
"""
f =open("b.txt", "r", encoding="utf-8")
buf = f.read(4)
print(buf)
print("*************")
buf1 = f.read()
print(buf1)
f.close()
# 控制台输出
aaa1
***************
2
454
65
56
2
23
文件的追加操作
- a 方式打开文件,向文件中写入内容,使用的是write()函数
- “a” 方式打开文件,文件指针在文件的末尾
"""
b.txt中的内容为:
aaa12
454
65
56
2
23
"""
f =open("b.txt", "a", encoding="utf-8")
f.write("hello\nworld")
f.write("")
f.close
# 控制台输出
aaa12
454
65
56
2
23hello
world
文件的其他读取操作
- 文件对象.readline()
- 按行读取,一次读取一行
- 文件对象.readlines()
- 按行读取,一次读取所有行, 列表中的每一个元素都是一行的内容
"""
b.txt 中的内容
aaa12
454
65
56
2
23hello
world
"""
f = open("b.txt", "r", encoding="utf-8")
buf = f.readline()
print(buf)
buf = f.readline()
print(buf)
print('*************')
my_list = f.readlines()
print(my_list)
f.close
# 控制台输出
aaa12
454
********
['65\n', '56\n', '2\n', '23hello\n', 'world']
模拟读取大文件
f = open("b.txt", "r", encoding="utf-8")
while True:
buf = f.readline()
if buf:
print(buf, end="")
else:
break
f.close()
# 控制态输出
aaa12
454
65
56
2
23hello
world
文件的备份案例
思路:
1.输入要备份的文件
2. 对文件进行切片操作
3. 只读打开文件
4. 写 打开备份文件
5. 读取文件的内容
6. 将读取的内容写入到备份文件
7. 关闭文件和备份文件
# 1. 输入要备份的文件
file_name = input("请输入你想备份的文件")
# 2. 对文件进行切片操作
num = file_name.rindex(".")
# 文件名字 [备份] 文件后缀
new_file_name = file_name[:num] + "[备份]" + file_name[num:]
# 3. 只读打开文件
f = open(file_name, "r", encoding="utf-8")
# 4. 写打开备份文件
new_f = open(new_file_name, "w", encoding="utf-8")
# 5. 读取文件的内容
buf = f.read()
# 6. 将读取的文件写入到备份文件
new_f.write(buf)
# 7. 关闭文件
f.close()
new_f.close()
文件备份案例升级版-----支持二进制文件
# 1. input 输入要备份的文件 xxx.后缀
file_name = input("请输入要备份的文件:")
# 2. xxx.后缀 —> xxx[备份].后缀
# 2.1 对 xxx.后缀 进行切片操作
num = file_name.rindex('.')
# new_file_name = 'a[备份].txt'
# 文件名字 后缀
new_file_name = file_name[:num] + "[备份]" + file_name[num:]
# 1. 读打开 a.txt, 二进制方式打开文件,不能指定 encoding参数
f = open(file_name, 'rb')
# 2. 写打开 a[备份].txt
new_f = open(new_file_name, 'wb')
# 3. 读取 a.txt 文件中的内容
buf = f.read() # bytes
# 4. 将读取到内容写入到 a [备份].txt
new_f.write(buf) # bytes
# 5. 关闭 a.txt
f.close()
# 6. 关闭 a [备份].txt
new_f.close()
with打开文件
with可以自动的关闭文件, 不需要手动关闭, 上下文管理器
# as 起别名
# with 可以自动的关闭文件, 不需要手动关闭, 上下文管理器
with open('a.txt', 'r', encoding="utf-8") as f:
buf = f.read()
print(buf)
# 控制台输出
aaa
vvv
bbb
xxx
xxxxxxxxx
文件和目录的常见目录
- 导入os包
- 文件重命名 ----> os.rename(原文件名, 新文件名)
- 删除文件, 只能删除文件, 不能删除目录 ----> os.remove()
- 创建文件夹(目录) ----> os.mkdir()
- 获取当前程序路径
path = os.getcwd()
print(path)
- 改变默认目录 change dir ----> os.chdir(“b”) #进入 b 这个文件夹
- 获取目录列表(目录中的文件), 返回的是列表
file_list = os.listdir
print(file_list)
- 删除目录, 删除空目录 ----> os.rmdir()
- 判断文件是否存在, 返回的是 bool 类型
result = os.path.exists("a.txt")
print(result)
批量创建文件
import os
def create_files():
"""批量创建文件"""
for i in range(10):
file_name = f"b/file{i}.txt"
f = open(file_name, "w")
f.close()
create_files()
批量修改文件名
import os
def change_file():
"""
批量修改文件名, 添加前缀
:param path: 目录,修改哪个目录
:return:
"""
# 获取目录中有哪些文件
file_list = o.listdir(path)
# 遍历
for file in file_list:
new_file = 'python333-' + file
os.rename(path + '/'+file, path + '/' + new_file)
change_files('b')
def change_file_2(path):
"""
批量修改文件名, 删除前缀
:param path: 目录,修改哪个目录
"""
# 先获取当钱工作目录
old_path = os.getcwd()
# 切换到 path 目录
os.chdir(path)
file_list = os.listdir()
print(file_list)
# 修改
for file in file_list:
num = len('python333-')
new_file = file[num:]
os.rename(file, new_file)
# 恢复到之前的目录
os.chdir(old_path)
change_file_2()
批量删除文件
import os
def delete_files():
#想删除文件的名字
for i in range(10):
file = "file-%d" %i
os.remove(file)
delect_files()