一、实验目的
- 熟练掌握内置函数open()的应用
- 理解字符串编码格式对文本文件操作的影响
- 熟练掌握上下文管理语句with的用法
- 了解标准库json对JSON文件的读写方法
- 了解扩展库python-docx、openpyxl、python-pptx对Office文档的操作
二、实验内容
2.1 对txt文本文件操作
合并两个.txt文件的内容,两个文件的多行内容交替写入结果文件,如果一个文件内容较少,则把另一个文件的剩余内容写入结果文件尾部。
# 待合并文件
txt_list =["./1.txt", "./2.txt"]
# 结果文件
result_txt = "./result.txt"
def merge_txt(txt_list, result_txt):
with open(result_txt, 'w') as result:
with open(txt_list[0],"r") as file1:
with open(txt_list[1],"r") as file2:
# 读取两个文件的所有行
lines1 = file1.readlines()
lines2 = file2.readlines()
# 遍历最长的文件行数
for i in range(max(len(lines1), len(lines2))):
# 文件1行数没有全部写完
if i < len(lines1):
result.write(lines1[i])
# 文件2行数没有全部写完
if i < len(lines2):
result.write(lines2[i])
merge_txt(txt_list, result_txt)
1.txt内容:
2.txt内容:
结果文件:
2.2 对CSV文件操作
编写程序,模拟生成某饭店自2020年1月1日开始连续100天试营业期间的营业额数据并写入CSV文件。文件中共两列,第一列为日期,第二列为营业额,文件第一行为表头或字段名称。假设该饭店第一天营业额基数为500元,每天增加5元,除此之外每天还会随机增加5到50元不等。
import datetime
import random
import csv
# 初始化时间
init_time = datetime.datetime(2020,1,1)
# 营业额基数
base_money = 500
# 结果列表
result_list = []
for i in range(100):
# 这天的时间
time = init_time + datetime.timedelta(days=i)
# 随机收入
random_money = random.randint(5,50)
# 这里计算下一天的营业额没有包括前一天的[5, 50]的随机收入
today_money = base_money + 5*i + random_money
result_list.append({"time":time,"money":today_money})
# 将营业额数据写入CSV文件
with open("./result.csv", "w", newline="") as result:
writer = csv.DictWriter(result, fieldnames=["time", "money"])
writer.writeheader()
for info in result_list:
writer.writerow({"time":info["time"].strftime('%Y-%m-%d'),"money":info["money"]})
结果文件:
2.3 对word文件进行操作
编写程序,读取并输出word文档中红色的文字。
import docx
def find_red_words(file_path):
file = docx.Document(file_path)
# 用来存储红色文字的列表
red_words = []
for paragraph in file.paragraphs:
for run in paragraph.runs:
# 判断字体颜色是否为红色
# if run.font.color.rgb == 'FF0000': # 不能这么写
if run.font.color.rgb == docx.shared.RGBColor(255, 0, 0):
red_words.append(run.text)
print(run.text)
find_red_words("./word.docx")
word.docx文件内容:
运行结果:
2.4 对xlsx表格操作
- 文件“超市营业额.xlsx”中记录了某超市2019年3月1日至5日各员工在不同时段、不同柜台的销售额。编写程序,读取该文件中的数据,并统计每个员工的销售总额,每个时段的销售总额、每个柜台的销售总额。
import openpyxl
def calculate_sale(xlsx_path, sheet_name):
# 整个表格
workbook = openpyxl.load_workbook(xlsx_path)
# 工作簿
sheet1 = workbook[sheet_name]
# 三个字典分别用来存储每个员工销售总额,每个时段销售总额,每个柜台销售总额
employee_sale ={}
time_sale ={}
counter_sale ={}
for row in sheet1.iter_rows(min_row=2): # 跳过第一行
employee = row[0].value # 工号
time = row[3].value # 时间段
counter = row[5].value # 柜台
money = float(row[4].value) # 销售额
# 按照员工统计
if employee in employee_sale:
employee_sale[employee] += money
else:
employee_sale[employee] = money
# 按照时间段统计
if time in time_sale:
time_sale[time] += money
else:
time_sale[time] = money
# 按照柜台统计
if counter in counter_sale:
counter_sale[counter] += money
else:
counter_sale[counter] = money
print("按照员工统计销售总额:")
for employee, money in employee_sale.items():
print(f"{employee} : {money:.2f}")
print()
print("按照时间段统计销售总额:")
for time, money in time_sale.items():
print(f"{time} : {money:.2f}")
print()
print("按照柜台统计销售总额:")
for counter, money in counter_sale.items():
print(f"{counter} : {money:.2f}")
calculate_sale("./超市营业额.xlsx", "营业额")
表格内容:
运行结果:
- 编写程序操作Excle文件,读取文件“大家的特长.xlsx”中的内容,并统计A-H列中的内容,在后面追加一列,对所有人的特长进行汇总。(该文件在超市营业额.xlsx中的第二张工作簿)
import openpyxl
def gather_habits(xlsx_path, sheet_name):
# 整个表格
workbook = openpyxl.load_workbook(xlsx_path)
# 需要的工作簿
sheet2 = workbook[sheet_name]
# 新增一列
sheet2.insert_cols(sheet2.max_column + 1)
new_max_column = sheet2.max_column + 1
# 最后一列名称为“所有特长”
sheet2.cell(row=1, column=new_max_column).value = "所有特长"
for i in range(2, sheet2.max_row+1):
all = ""
# 遍历所有爱好栏,如果是“是”,则添加到“所有特长”中
for j in range(2, new_max_column):
if sheet2.cell(row=i, column=j).value == "是":
all += sheet2.cell(row=1, column=j).value + " "
sheet2.cell(row=i, column=new_max_column).value = all
workbook.save(xlsx_path)
gather_habits("./超市营业额.xlsx", "爱好")
文件内容:
运行结果: