本文章用意为方便日后写代码时随时复制粘贴,
如有问题或有更好的方法时请大家随时指正更新。
一、xlsx表格保存追加操作
import openpyxl
def xlsx_add_info_Method_one():
"""
方法1.使用append
追加写入1行数据
:return:
"""
# 指定文件路径
file_full_path = r'test.xlsx'
# sheet名称
sheet_name = 'sample1'
# 获取指定的文件
wb = openpyxl.load_workbook(file_full_path)
# 获取指定的sheet
ws = wb[sheet_name]
# 获得最大行数
max_row_num = ws.max_row
# 获得最大列数
max_col_num = ws.max_column
# 将当前行设置为最大行数
ws._current_row = max_row_num
# 使用append方法,将行数据按行追加写入
values = ['Jack', '12', '2023/11/12', 'Failed']
ws.append(values)
# 保存文件
wb.save(file_full_path)
def xlsx_add_info_Method_two():
"""
方法2.使用for循环
追加写入1行数据
:return:
"""
# 指定文件路径
file_full_path = r'test.xlsx'
# sheet名称
sheet_name = 'sample1'
# 获取指定的文件
wb = openpyxl.load_workbook(file_full_path)
# 获取指定的sheet
ws = wb[sheet_name]
# 获得最大行数
max_row_num = ws.max_row
# 获得最大列数
max_col_num = ws.max_column
values = ['Lisa', '35', '2023/11/27', 'Passed']
# 追加一行数据
for i in range(1, max_col_num + 1, 1):
ws.cell(max_row_num + 1, i).value = values[i - 1]
# 保存文件
wb.save(file_full_path)
def xlsx_add_info_Method_three():
"""
追加写入1列数据
:return:
"""
# 指定文件路径
file_full_path = r'test.xlsx'
# sheet名称
sheet_name = 'sample2'
# 获取指定的文件
wb = openpyxl.load_workbook(file_full_path)
# 获取指定的sheet
ws = wb[sheet_name]
# 获得最大行数
max_row_num = ws.max_row
# 获得最大列数
max_col_num = ws.max_column
values = ['Jack', '17', '2023/10/2', 'Failed']
for each in values:
# 通过row关键字指定行,colunm关键字指定列,均从1开始
ws.cell(row=values.index(each) + 1, column=max_col_num + 1, value=each)
# 保存文件
wb.save(file_full_path)
'''使用openpyxl处理单元格数据时,起始坐标从(1,1)开始,不是(0,0)。'''
workbook = load_workbook(filename='test.xlsx') # 打开表
sheet = workbook.active # 获取xlsx的工作表
ws = workbook[workbook.sheetnames[0]] # 获取第一个工作表
all_values = [[cell.value for cell in row] for row in sheet.rows] # 获取表格数据
def query_xlsx(ids, column, success_text):
"""
更改xlsx表的信息
:param ids: 需要更改的用户id
:param column: 第几列
:param success_text: 需要在指定列填入的数据
:return:
"""
nums = 0
for row in all_values:
nums += 1
row_id = row[0]
if row_id == ids:
ws.cell(row=nums, column=column, value=success_text) # row为行数, column为列数
workbook.save(filename=task_path) # 保存更改信息
workbook.close() # 对程序中只读的workbook
return True
二、日志操作
from loguru import logger
logger.add(
"./日志/log.log",
rotation='10MB', # 日志分割,可以根据时间也可以根据大小
colorize=False, # 是否染色
level='WARNING' # 日志等级
)
logger.warning('测试')
logger.debug('测试')
logger.success('测试')
三、多线程操作
我个人不喜欢用消息队列,所以自己经常使用这种方式使用多线程
import threading
def parse(txt):
print(f'{txt}')
def parse_main(txt_list):
threading_num = 20 # 线程数
threading_list = [] # 保存线程列表
task_list = [] # 任务列表
for txt in txt_list:
task_list.append(txt) # 将任务保存入列表
if len(task_list) == threading_num: # 如果保存的任务等于线城数则执行
for task in task_list:
t = threading.Thread(target=parse, args=(task,))
t.start()
threading_list.append(t)
for thr in threading_list:
thr.join()
task_list.clear() # 所有线程执行完毕后清空任务列表
'''执行剩余不满足线程数任务'''
if task_list:
for task in task_list:
t = threading.Thread(target=parse, args=(task,))
t.start()
threading_list.append(t)
for thr in threading_list:
thr.join()
task_list.clear()
四、CSV操作
import csv
import os
import threading
lock = threading.Lock()
def get_csv_info():
"""
获取csv信息
:return:
"""
csv_list = []
with open(f'test.csv', 'r', encoding='utf-8-sig', errors='ignore') as f:
csv_info_list = csv.reader(f)
for csv_info in csv_info_list:
if csv_info:
csv_list.append(csv_info)
return csv_list
def file_exists(filename):
# 使用os.path模块的exists()函数来检查文件是否存在
if os.path.exists(filename):
return True
else:
return False
def save_csv_info():
"""
保存csv信息
:return:
"""
file_name = f'test.csv'
file_code = file_exists(file_name) # 判断本地是否已有csv文件
info_list = [{'姓名': '张三'}, {'年龄': '18'}]
'''因为我经常使用多线程进行保存csv文件. 防止数据错乱、乱码等情况, 再保存的时候我通常会加个线程锁防止这种情况'''
with lock:
try:
with open(file_name, 'a', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=info_list[0].keys())
if not file_code: # 防止表头多次写入
writer.writeheader()
writer.writerows(info_list)
print('保存成功')
except Exception as e:
print(e)