1. 文件与持久化
常用的文件类型:数据文件,配置文件,日志文件,数据库文件,声音和图像文件等
""" 读取的过程:1.打开文件;2.读取文件;3.关闭文件
r:read;w:write;a+:读写
"""
# 相对路径 绝对路径,读取文件
# 方法一
file = open('data.txt', 'r')
# 方法二
file = open(r'd:\data.txt', 'r')
# 方法三
file = open('d:\\data.txt', 'r')
print(file.readable()) # 文件是否可读
print(file.writable()) # 文件是否可写
file.seek(6) # 跳过6个字符
file.read(6) # 读取6个字符
# 文件按行读取并打印
data = file.readline()
while data:
print(data, end='') # end='': 表示不会自动换行
data = file.readline()
# 文件全部读取并打印
datas = file.readlines()
print(type(datas)) # <class 'list'>
for line in datas:
print(line, end='')
⚠️ file.close() # 如果关闭文件前,抛异常,则该句无法执行
解决方案:使用
with关键字,不用关系close()什么时候被调用,系统会自动关闭文件
with open('data.txt', 'r') as file:
datas = file.readlines()
print(type(datas))
for line in datas:
print(line, end='')
2. 文件的读写
读取文件示例:
读取配置文件
# app.config
# This is database config file
db_url=xx.xx.xx.xxx
db_port=1521
db_user=admin
db_pass=passward
# appConfig.py
configData = dict()
# 读取文件
with open('app.config', 'r') as file:
lines = file.readlines()
for line in lines:
if not line.startswith("#"):
key = line.split("=")[0]
value = line.split("=")[1].replace("\n", "")
configData[key] = value
if __name__ == "__main__":
print(configData)
写入文件示例:
"""写入文件
w: 文件清空再写入
a: 文件末尾追加写入
"""
with open('data_write.txt', 'a') as file:
datas = ['hello python', 'i am sniper', 'like']
# writelines的参数既可以是列表也可以是字符串
# file.writelines([data+'\n' for data in datas])
# file.writelines("\n".join(datas))
# write的参数是字符串
file.write("\n".join(datas))
文件打开方式汇总:
r | w | a |
r+ | w+ | a+ |
rb:打开二进制文件(声音、图像、视频) | wb | ab |
rb+ | wb+ | ab+ |
⚠️ 与‘r’相关的读取(上述表格第一列)操作,需要文件已存在,否则报错;
与‘w’相关的读取(上述表格第二、三列)操作,文件不存在
3. 字符的编码问题
with open('data_cn.txt', 'w') as file:
file.write("人生苦短,我用python")
with open('data_cn.txt', 'r') as file:
print(file.read())
# python encoding的默认值:GBK ; pycharm的是 utf-8
with open('data_cn_1.txt', 'r', encoding='utf-8') as file:
print(file.read())
4. 目录及其他操作
目录操作相关模块:os\os.path(os.path:当前工作模块的目录)
常规操作:目录/文件
import os
import shutil
print('data.txt文件是否存在:', os.path.exists('data.txt'))
print('data1.txt文件是否存在:', os.path.exists('data1.txt'))
print('程序运行当前目录:', os.getcwd())
dirname = "dir_demo"
if not os.path.exists(dirname):
# 创建目录,若是\dir_demo\subdir这类多级目录结构,要求上层的都已创建,否则报错
# os.mkdir(dirname)
# 创建目录,支持创建多级目录结构:\dirdemo\subdir:较常用
os.makedirs("dir_demo\subdir")
else:
# 删除目录, 但目录必须得是空的
# os.rmdir(dirname)
# 删除非空文件夹, 谨慎使用
shutil.rmtree(dirname)
遍历:目录/文件
# 遍历文件夹下的子目录和文件:方法一
filenames = os.listdir(os.getcwd())
for fname in filenames:
print(fname)
# 遍历文件夹下的子目录和文件:方法二, 除了遍历,还继续递归子目录
for files in os.walk(os.getcwd()):
print(files)
# 序列解包
for dirpath, subdirs, files in os.walk(os.getcwd()):
for name in subdirs:
print("目录", os.path.join(dirpath, name))
for name in files:
print("文件", os.path.join(dirpath, name))
# 删除文件, 但要求文件存在
if os.path.exists("data_write.txt"):
os.remove("data_write.txt")