当前位置: 首页 > news >正文

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)设置默认权限掩码

相关文章:

  • 多模态融合(十一): SwinFusion——武汉大学马佳义团队(二)
  • Java中包装类和泛型
  • 导出excel文件并在页面自动下载
  • TCP/IP、UDP、HTTP、HTTPS、WebSocket 一文讲解
  • 从零开始搭建CLIP模型实现基于文本的图像检索
  • elementUI中MessageBox.confirm()默认不聚焦问题处理
  • UML-共享汽车系统通信图深度解析
  • 蓝桥杯练习题2
  • Codeforces Educational Round 177 Div. 2 【B题,C待补
  • Unity:获取组件对象(GetComponent<T>())
  • MinnowBoard MAX单板UEFI BIOS代码编译教程
  • Spring 学习笔记之 @Transactional详解
  • 4N60-ASEMI开关电源与适配器专用4N60
  • 运筹学之遗传算法
  • Rust网络编程实战:全面掌握reqwest库的高级用法
  • QT+Cmake+mingw32-make编译64位的zlib-1.3.1源码成功过程
  • 深度学习--卷积神经网络CNN原理
  • 功能性高斯泼溅扩散——DiffGS: Functional Gaussian Splatting Diffusion
  • yolov8的数据处理lableimg的安装以及使用
  • 【更新完毕】2025华中杯C题数学建模网络挑战赛思路代码文章教学数学建模思路:就业状态分析与预测
  • 澎湃思想周报|哈佛与特朗普政府之争;学习适应“混乱世”
  • 官方披露:定西民政局原局长将收受烟酒高价“倒卖”给单位,用于违规接待
  • 大理州工业投资(集团)有限公司党委副书记、副总经理赵云接受审查调查
  • 刘国梁:奥运会乒乓球项目增至六金,国乒机遇与挑战并存
  • 道客网络陈齐彦:技术无界化,开源让AI变成了“全民食堂”
  • 中国正在俄罗斯国内生产武器?外交部:坚决反对无端指责和政治操弄