python文件类操作:json/ini配置文件、logging日志统计、excel表格数据读写、os操作库
文章目录
- 一、with open文件操作
- 二、csv表格数据读写
- 三、Excel表格数据读写
- 四、json配置文件读写
- 五、ini配置文件读写
- 六、logging日志统计
- 七、os操作库(文件拼接、创建、判断等)
打开文件使用不同参数有着不同的含义,比如只读、只写、二进制读等,具体参数介绍如下
参数 | 类型 |
---|---|
r | 只读方式打开,指针在文件开头。默认方式 |
rb | 二进制只读方式打开,指针在文件开头 |
r+ | 读写,指针在开头 |
rb+ | 二进制读写,指针在开头 |
w | 写入,存在则覆盖,不存在则创建 |
wb | 二进制写入,存在则覆盖,不存在则创建 |
w+ | 读写,存在则覆盖,不存在则创建 |
wb+ | 二进制读写,存在则覆盖,不存在则创建 |
a | 追加,存在则指针方末尾,不存在则创建 |
ab | 二进制追加,存在则指针方末尾,不存在则创建 |
a+ | 读写,存在则指针方末尾,不存在则创建 |
ab+ | 二进制追加,存在则指针方末尾,不存在则创建 |
一、with open文件操作
open() :是 Python 中用于文件操作的核心内置函数,它用于打开文件并返回文件对象,通过这个对象可以进行读写操作
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file:文件路径
mode:打开模式(参考上方表格)
encoding:制定文件编码(如utf-8)
errors:指定编码错误处理方式
newline:控制换行符处理方式(如newline=“\n”,写入的\n为换行符)
文件对象常用方法
方法 | 描述 |
---|---|
read(size=-1) | 读取指定字节数(默认全部) |
readline(size=-1) | 读取一行 |
readlines(hint=-1) | 读取所有行到列表 |
write(s) | 写入字符串 |
writelines(lines) | 写入多行 |
seek(offset, whence=0) | 移动文件指针 |
tell() | 返回当前文件位置 |
flush() | 刷新缓冲区 |
close() | 关闭文件 |
读取文件操作
# 方法1:一次性读取全部内容
with open('example.txt', 'r', encoding='utf-8') as f:content = f.read()print(content)# 方法2:逐行读取
with open('example.txt', 'r', encoding='utf-8') as f:for line in f:print(line.strip()) # strip() 去除首尾空白字符# 方法3:读取为行列表
with open('example.txt', 'r', encoding='utf-8') as f:lines = f.readlines()
写入文件操作
# 覆盖写入
with open('output.txt', 'w', encoding='utf-8') as f:f.write('Hello, World!\n')f.write('这是第二行\n')# 追加写入
with open('output.txt', 'a', encoding='utf-8') as f:f.write('这是追加的内容\n')# 写入多行
lines = ['第一行\n', '第二行\n', '第三行\n']
with open('output.txt', 'w', encoding='utf-8') as f:f.writelines(lines)
也可以直接使用open操作,比如
# 1、以写的方式打开文件
f = open("1.txt", "w")
# 2、写入文件内容
f.write("hello world")
# 3、关闭文件
f.close()
但是这种写法可能出现一定的安全隐患,比如以读模式打开,然后写入输入,可能会出现异常,f.close就不会调用,无法正常关闭文件,这里可以使用tre…except或者直接使用with open来处理,with open自带了上下文管理器,上下文管理器也可以自行定义
enter:表示上文方法,需要返回一个操作文件对象
exit:表示下文方法,with语句执行完成会自动执行,即使出现异常也会执行该方法。
class Myopen(object):def __init__(self, file, mode):self.file = fileself.mode = modedef __enter__(self):# 这个方法是用来进入上下文环境的文件,用来做初始化的准备工作self.file_handle = open(self.file, self.mode)return self.file_handledef __exit__(self, exc_type, exc_val, exc_tb):# 这个方法是在退出上下文环境时,一般用来做资源的回收self.file_handle.close()if exc_type:print('有异常发生')# 该函数默认返回 False,将异常抛出,如果不想抛出异常,可以将返回值改成 True,可以在该函数中处理异常return Truewith Myopen('1.txt', 'w') as f:f.write('Hello World')
二、csv表格数据读写
CSV (Comma-Separated Values) :是一种常用的表格数据存储格式,Python 通过 csv 模块提供了强大的 CSV 文件读写功能
中文叫作逗号分割值或字符分割值,文件以纯文本形式存储表格数据。
csv表格数据的读取
import csv# 方法1:读取为列表
with open('data.csv', 'r', newline='', encoding='utf-8') as f:reader = csv.reader(f)for row in reader:print(row) # 每行是一个字符串列表# 方法2:读取为字典(使用首行作为键)
with open('data.csv', 'r', newline='', encoding='utf-8') as f:reader = csv.DictReader(f)for row in reader:print(row) # 每行是一个有序字典print(row['name'], row['age']) # 通过列名访问
csv表格数据的写入
import csv# 数据准备
headers = ['name', 'age', 'city']
data = [['Alice', 25, 'New York'],['Bob', 30, 'London'],['Charlie', 35, 'Paris']
]# 写入CSV
# newline='' 参数避免解决写一行空一行
with open('output.csv', 'w', newline='', encoding='utf-8') as f:# 默认行与行之间的分隔符为逗号,换其他的可用参数,即csv.writer(f, delimiter=' ') 空格分隔writer = csv.writer(f)writer.writerow(headers) # 写入表头writer.writerows(data) # 写入多行数据# 字典写入
dict_data = [{'name': 'Alice', 'age': 25, 'city': 'New York'},{'name': 'Bob', 'age': 30, 'city': 'London'}
]with open('dict_output.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.DictWriter(f, fieldnames=headers)writer.writeheader() # 写入表头writer.writerows(dict_data)
对于表格数据的读写,还有更高级的用法,详情请见:Python数据处理之Pandas库
三、Excel表格数据读写
Excel文件
:对于Excel文件的操作最常用的库有openpyxl库(适用于.xlsx格式)和pandas库,pandas库的使用详情请见:Python数据处理之Pandas库
Excel文件的读取
from openpyxl import load_workbook# 加载工作簿
wb = load_workbook('example.xlsx')# 获取所有工作表名称
print(wb.sheetnames)# 选择工作表
sheet = wb['Sheet1'] # 按名称选择
# 或 sheet = wb.active # 获取活动工作表# 读取单元格数据
cell_value = sheet['A1'].value # 通过坐标
cell_value = sheet.cell(row=1, column=1).value # 通过行列号# 遍历行数据
for row in sheet.iter_rows(values_only=True):print(row) # 每行是一个元组# 遍历列数据
for column in sheet.iter_cols(values_only=True):print(column)
Excel文件的写入
from openpyxl import Workbook# 创建新工作簿
wb = Workbook()# 获取活动工作表
sheet = wb.active
sheet.title = "Data" # 重命名工作表# 写入数据
sheet['A1'] = "Hello" # 单个单元格
sheet.cell(row=2, column=1, value="World") # 行列号方式# 批量写入行数据
data = [['Name', 'Age', 'City'],['Alice', 25, 'New York'],['Bob', 30, 'London']
]
for row in data:sheet.append(row)# 保存文件
wb.save('output.xlsx')
Excel样式设置
from openpyxl.styles import Font, Alignment, Border, Side# 设置字体
sheet['A1'].font = Font(bold=True, color="FF0000")# 设置对齐
sheet['B1'].alignment = Alignment(horizontal='center')# 设置边框
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
sheet['C1'].border = thin_border
公式计算
sheet['D1'] = 10
sheet['D2'] = 20
sheet['D3'] = "=SUM(D1:D2)" # 写入公式
对于Excel更高级的用法,详情请见:Python数据处理之Pandas库
四、json配置文件读写
JSON: 是一种轻量级的数据交换格式,Python 通过 json 模块提供了 JSON 数据的编码和解码功能
json文件的写入
import json# Python 数据结构
data = {"name": "Alice","age": 25,"is_student": True,"courses": ["Math", "Physics"],"address": {"street": "123 Main St","city": "New York"}
}# 写入 JSON 文件
with open('data.json', 'w', encoding='utf-8') as f:json.dump(data, f, indent=4) # indent 参数用于美化输出# 也可以先转换为 JSON 字符串
json_str = json.dumps(data, indent=4)
print(json_str) # 打印 JSON 字符串
json文件的读取
import json# 从文件读取
with open('data.json', 'r', encoding='utf-8') as f:loaded_data = json.load(f)print(loaded_data['name']) # 访问数据print(loaded_data['courses'][0])# 从 JSON 字符串读取
json_string = '{"name": "Bob", "age": 30}'
data_from_str = json.loads(json_string)
print(data_from_str['age'])
五、ini配置文件读写
INI文件是一种常见的配置文件格式,由节(section)、键(key)和值(value)组成。以下是各种编程语言中读写INI文件的方法
。在读取过程中,键值会默认为小写,加上如下代码则可以保持原有大小写config.optionxform = lambda option: option
函数 | 含义 |
---|---|
config = configparser.ConfigParser() | 创建 ConfigParser 对象 |
config.read(‘config.ini’) | 读取配置文件 |
config.sections() | 获取所有 section (即方括号内容,列表) |
config.has_section(section) | 检查 section 是否存在 |
config.options(section) | 获取某个section的所有key值 |
config[section][key] | 字典格式访问(不存在闪退) |
config.get(section, key) | 获取某个 section的key的值(不存在闪退) |
config.get(section, key, fallback=“DEBUG”) | 安全读取,如果不存在则输出fallback指定默认内容 |
config.getint(section, key) | 获取整数型值 |
config.getboolean(section, key) | 获取布尔型值 |
config.getfloat(section, key) | 获取浮点型值 |
config.add_section(section) | 添加section |
config.set(section, key, ‘smtp.example.com’) | 添加key |
config.has_option(section, key) | 检查 key 是否存在 |
ini文件的写入操作
import configparser# 创建 ConfigParser 对象
config = configparser.ConfigParser()config.add_section('config')
config.set('config', 'key1', 'value1')
config.set('config', 'section1', 'key1')config.add_section('database')
config.set('database', 'key2', 'value2')
config.set('database', 'section2', 'key2')# 也可以以键值对的方式
# config['database'] = {
# 'key2': 'value2',
# 'section2': 'key2'
# }with open('E:/config.ini', 'w') as configfile:config.write(configfile)
执行完之后得到如下结果
[config]
key1 = value1
section1 = key1[database]
key2 = value2
section2 = key2
实例:以上面ini文件为例,读取config文件
import configparser# 创建 ConfigParser 对象
config = configparser.ConfigParser()# 默认情况下,读取出来的option会默认为小写
# 保持原有的大小写,需要写入如下代码
config.optionxform = lambda option: option# 读取配置文件
config.read('E:/config.ini')# 获取所有 section
sections = config.sections()
# 读取section
print(sections) # ['config', 'database']
# 以字典形式读取 不存在则报错
print(config["database"]["key2"]) # value2
# 安全读取,如果不存在则输出fallback指定默认内容
print(config.get("database", "key", fallback="default"))
# 将信息转化为字典
data_dict = {}
for section in config:for option in config[section]:data_dict[option] = config.get(section, option)
print(data_dict) # {'key1': 'value1', 'section1': 'key1', 'key2': 'value2', 'section2': 'key2'}
六、logging日志统计
logging 是 Python 标准库中用于记录日志的强大模块,提供了灵活的日志记录系统。该日志有多个级别,由低到高如下表(默认的是WARNING等级,当在WARNING或更高等级的才记录日志信息)
日志 | 级别 |
---|---|
DEBUG | 详细信息,通常用于调试 |
INFO | 程序正常运行时使用 |
WARNING | 表示意外情况或未来可能出现问题 |
ERROR | 由于更严重的问题,程序某些功能无法正常工作 |
CRITICAL | 严重错误,程序可能无法继续运行 |
简单日志记录方式
import logging# 基本配置,log级别设置为INFO
logging.basicConfig(level=logging.INFO)# 记录不同级别的日志
logging.debug('这是一条调试信息') # debug级别低于INFO,不会记录
logging.info('这是一条普通信息')
logging.warning('这是一条警告信息')
logging.error('这是一条错误信息')
logging.critical('这是一条严重错误信息')
配置日志格式和输出位置:logging.basicConfig
可以设置输出等级、保存文件位置、输出更格式等。
logging.basicConfig(level=logging.INFO, format='%(levelname)s-%(filename)s-%(lineno)d-%(asctime)s-%(message)s', filename='log.txt', filemode='w')
lecel:输出等级
format:格式,%(levelname)s名称,%(filename)s程序名,%(lineno)d当前行号,%(asctime)s打印日志时间,%(message)s打印日志信息
filename:输出到某文件
filemode:打开文件格式,w写,a追加
import logging# 设置记录日志的级别、输出格式、输出文件等
logging.basicConfig(level=logging.INFO, format='%(levelname)s-%(filename)s-%(lineno)d-%(asctime)s-%(message)s', filename='log.txt', filemode='w')
logging.debug('Debug...')
logging.info('Info...')
logging.warning('Warning...')
logging.error('Error...')
logging.critical('Critical...')
log.txt输出文件如下
INFO-main.py-6-2023-03-29 15:42:34,333-Info…
WARNING-main.py-7-2023-03-29 15:42:34,333-Warning…
ERROR-main.py-8-2023-03-29 15:42:34,333-Error…
CRITICAL-main.py-9-2023-03-29 15:42:34,333-Critical…
运行日志同时输出到控制台和文件(完整日志配置示例)
import logging
from logging.handlers import RotatingFileHandler
import sys# 1. 创建模块级日志记录器
# logging.getLogger(__name__)优点
# 实现层次化的日志记录,每个模块有自己的日志记录器,可以单独配置每个模块的日志级别和处理方式,日志中会自动显示日志来源的模块名
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG) # 设置记录器级别# 2. 创建格式化器
formatter = logging.Formatter(fmt='%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s',datefmt='%Y-%m-%d %H:%M:%S'
)# 3. 创建处理器(多个)# 文件处理器(带轮转)
file_handler = RotatingFileHandler(filename='app.log', # 日志文件名maxBytes=1024*1024*10, # 10MBbackupCount=5, # 保留5个备份encoding='utf-8'
)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.INFO) # 文件日志级别# 控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
console_handler.setLevel(logging.DEBUG) # 控制台日志级别# 4. 将处理器添加到记录器
logger.addHandler(file_handler)
logger.addHandler(console_handler)# 5. 禁止传播到根记录器(可选)
logger.propagate = False# 使用示例
logger.debug('调试信息') # 只会在控制台显示
logger.info('普通信息') # 会写入文件和控制台
logger.warning('警告信息')
日志轮转:是一种日志管理机制,用于控制日志文件的大小和数量,防止单个日志文件过大或日志文件无限增长占用过多磁盘空间。
日志文件轮转
from logging.handlers import RotatingFileHandlerlogger = logging.getLogger(__name__)
handler = RotatingFileHandler('app.log', maxBytes=1024*1024, # 1MBbackupCount=3 # 保留3个备份
)
logger.addHandler(handler)
定时轮转日志文件
from logging.handlers import TimedRotatingFileHandlerhandler = TimedRotatingFileHandler('app.log',when='midnight', # 每天午夜interval=1,backupCount=7 # 保留7天
)
七、os操作库(文件拼接、创建、判断等)
os 模块:是 Python 中用于与操作系统交互的标准库,提供了与操作系统交互的各种功能。它允许你执行文件和目录操作、进程管理、环境变量访问等操作系统相关任务
文件目录操作:文件的创建与删除、路径拼接等
函数 | 含义 |
---|---|
os.path.exists(path) | 检查路径是否存在 |
os.path.isfile(path) | 检查是否为文件 |
os.path.isdir(path) | 检查是否为目录 |
os.path.getsize(path) | 获取文件大小(字节) |
os.path.getmtime(path) | 获取文件最后修改时间 |
os.path.join(path1[, path2[, …]]) | 路径拼接 |
os.path.abspath(path) | 获取绝对路径 |
os.path.dirname(path) | 获取目录名 |
os.path.basename(path) | 获取文件名 |
os.rename(src, dst) | 重命名文件或目录 |
os.remove(path) | 只能删除文件 |
os.rmdir(path) | 只能删除空目录(不能有文件) |
os.removedirs(path) | 递归删除空目录(不能有文件) |
os.mkdir(path[, mode]) | 只能创建单级目录 |
os.makedirs(path[, mode]) | 递归创建目录 |
os.listdir(path) | 列出目录内容 |
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) | 目录树生成器 |
系统信息类:目录切换,获取目录、环境变量
函数 | 含义 |
---|---|
os.getcwd() | 获取当前工作目录 |
os.chdir(path) | 改变当前工作目录 |
os.getenv(key[, default]) | 获取环境变量值 |
os.name | 操作系统名称(‘posix’, ‘nt’, ‘java’) |
os.environ | 系统环境变量字典 |
os.cpu_count() | 返回CPU数量 |
进程管理:执行指令
函数 | 含义 | 解释 |
---|---|---|
os.system(cmd) | 执行指令 | 返回值表示是否执行成功,新起shell进程,阻塞型 ,执行结束才会执行后续操作 |
os.popen(cmd[, mode[, bufsize]]) | 执行命令并返回文件对象(弃用) | |
os.startfile(path[, operation]) | 用关联程序打开文件(Windows) | |
os.kill(pid, sig) | 发送信号给进程 | |
os.getpid() | 获取当前进程ID | |
os.getppid() | 获取父进程ID |
权限管理
函数 | 含义 |
---|---|
os.access(path, mode) | 检查路径权限 |
os.chmod(path, mode) | 更改权限 |
os.chown(path, uid, gid) | 更改所有者(Unix) |
os.umask(mask) | 设置默认权限掩码 |