一、实验目的
熟练掌握内置函数open()的应用;
理解字符串编码格式对文本文件操作的影响;
熟练掌握上下文管理语句with的用法;
了解标准库json对JSON文件的读写方法;
了解扩展库python-docx、openpyxl、python-pptx对Office文档的操作。
二、实验内容
1、合并两个.txt文件的内容,两个文件的多行内容交替写入结果文件,如果一个文件内容较少,则把另一个文件的剩余内容写入结果文件尾部。
1.1实验准备:准备两个文档1.txt 2.txt
1.2实验代码:
def mergeTxt(txtFiles):
with open('result.txt', 'w', encoding='utf-8') as fp:
with open(txtFiles[0], 'r+') as fp1, open(txtFiles[1], 'r+') as fp2:
# 可以读取两个文件的行时,进入循环
while True:
line1 = fp1.readline()
line2 = fp2.readline()
# 如果有内容可读
if line1 or line2:
if line1:# line1有内容
fp.write(line1)
if line2:# line2有内容
fp.write(line2)
# 如果没有内容可读,跳出循环
else:
break
txtFiles = ['1.txt', '2.txt']
mergeTxt(txtFiles)
1.3实验结果:
查看result.txt文件:
2、补全代码:把如下房屋信息的列表写入JSON文件(房屋信息.json),然后再读取并输出这些信息
2.1实验代码:
import json
information = [
{'小区名称': '小区A', '均价': 8000, '月交易量': 20},
{'小区名称': '小区B', '均价': 8500, '月交易量': 35},
{'小区名称': '小区C', '均价': 7800, '月交易量': 50},
{'小区名称': '小区D', '均价': 12000, '月交易量': 18}]
# 此时information是list列表类型
with open("房屋信息.json", "w") as f:
# 把数据类型转换成字符串并存储在json文件中
json.dump(information, f)
print("文件写入完成!")
with open("房屋信息.json", 'r') as load_f:
# 把文件打开从字符串转换成数据类型
load_dict = json.load(load_f)
print(load_dict)
2.2实验结果:
3、编写程序,模拟生成某饭店自2020年1月1日开始连续100天试营业期间的营业额数据并写入CSV文件。文件中共两列,第一列为日期,第二列为营业额,文件第一行为表头或字段名称。假设该饭店第一天营业额基数为500元,每天增加5元,除此之外每天还会随机增加5到50元不等。
3.1 实验代码:
import csv
import random
import datetime
with open('营业额.csv', 'w', encoding='utf-8') as f:
writer = csv.writer(f, lineterminator='\n')
# 向csv文件中写入字段名称
writer.writerow(['日期', '营业额'])
# 生成2020年1月1日的数据
date = datetime.date(2020,1,1)
# 随机生成100个营业额数据
for i in range(100):
# 营业额每天增加5元,此外每天随机增加5到50元不等
amount = 500+i*5+random.randint(5, 50)
writer.writerow([str(date), amount])
# 累加生成自2020年1月1日开始的连续日期
date = date + datetime.timedelta(days=1)
3.2实验结果:
查看“营业额.csv”文件结果:
4. 编写程序,读取并输出word文档中红色的文字。
4.1实验准备:
准备好1.docx文件的内容:
4.2实验代码:
from docx import Document # 需要下载python-docx库
from docx.shared import RGBColor
def CheckRed(fn):
document = Document(fn)
# 在文档的段落中进行遍历
for p in document.paragraphs:
# 在每段的字符块中进行遍历
for r in p.runs:
# 判断字符块的RGB值是否是红色(255,0,0)
if r.font.color.rgb == RGBColor(255, 0, 0):
print(r.text)
# 在表格中进行遍历
for table in document.tables:
# 在每个表格的每行进行遍历:
for row in table.rows:
# 在每行的单元格中进行遍历:
for cell in row.cells:
# 对每个单元格中的内容进行遍历:
for p in cell.paragraphs:
for r in p.runs:
if r.font.color.rgb == RGBColor(255, 0, 0):
print(r.text)
CheckRed('1.docx')
4.3实验结果:
5. 文件“超市营业额.xlsx”中记录了某超市2019年3月1日至5日各员工在不同时段、不同柜台的销售额。编写程序,读取该文件中的数据,并统计每个员工的销售总额,每个时段的销售总额、每个柜台的销售总额。
5.1实验准备:
时段:8:00-14:00 14:00-20:00
柜台:生鲜水果、日用品、零食饮料
员工:1001小王 1002小李 1003小陈 1004小刘 1005小张 1006小杜
5.2实验代码:
from openpyxl import load_workbook
def Count():
# 声明三个字典,分别存放员工、时段、柜台的销售总额
staffs = dict()
periods = dict()
counters = dict()
# 读取xlsx文档
ws = load_workbook('超市营业额.xlsx').worksheets[0]
# 对表格中的每行进行遍历
for index, row in enumerate(ws.rows):
# 需跳过第一行
if index == 0:
continue
# 获取员工姓名、时段、柜台、销售额等信息
_, name, _, period, counter, money = map(lambda cell: cell.value, row)
# 根据员工姓名,对销售额进行累加
staffs[name] = staffs.get(name, 0) + money
# 根据不同时段,对销售额进行累加
periods[period] = periods.get(period, 0) + money
# 根据不同柜台,对销售额进行累加
counters[counter] = counters.get(counter, 0) +money
print("每个员工的销售总额:")
print(staffs)
print("每个时段的销售总额:")
print(periods)
print("每个柜台的销售总额:")
print(counters)
Count()
5.3实验结果:
6. 编写程序操作Excle文件,读取文件“大家的特长.xlsx”中的内容,并统计A-H列中的内容,在后面追加一列,对所有人的特长进行汇总。
6.1实验代码:
import random
from openpyxl import load_workbook
# 函数功能:随机生成表格数据
def Random():
wb = load_workbook("大家的特长.xlsx")
for w1 in wb:
w1 = wb.active
wb.remove(w1)
sheet = wb.create_sheet("大家的特长")
list_name = ["李明", "王平", "刘静", "陈红", "赵强"]
sheet.append(["姓名", "足球", "篮球", "乒乓球", "游泳", "唱歌", "跳舞", "吃饭"])# 添加第一行的表头内容
# 对每个人的特长随机生成“是”,将结果插入表格中
for i in list_name:
temp = []
temp.append(i)
# 对于每个特长使用choice函数随机选择“是”和“ ”
for j in range(7):
temp.append(random.choice("是 "))
sheet.append(temp)
wb.save("大家的特长.xlsx")
# 函数功能:对所有特长进行汇总
def Summarize():
wb = load_workbook("大家的特长.xlsx")
w = wb.active
w["I1"] = "所有特长"
list_sheet = [ "B", "C", "D", "E", "F", "G", "H"]
list_column = ["足球", "篮球", "乒乓球", "游泳", "唱歌", "跳舞", "吃饭"]
# 对每位同学进行遍历
for i in range(2, w.max_row+1):
temp = []
# 对每列特长进行遍历
for j in range(len(list_sheet)):
# 查看第j列第i行的值是否为”是“
if w[list_sheet[j] + str(i)].value == "是":
temp.append(list_column[j])
# 在第I列、第i行添加”所有特长“的汇总信息,以逗号为间隔
w["I"+str(i)] = ",".join(temp)
wb.save("大家的特长(汇总版).xlsx")
Random()
Summarize()
6.2实验结果:
代码随机生成的“大家的特长.xlsx”文件内容:
汇总后的结果文件“大家的特长(汇总版).xlsx”内容:
三、实验总结
此次实验我学习了利用python的一些库对文件进行操作,共完成了6个题目,题目整体难度不大,我都成功得出了预期结果,也学到了对文件的种种操作,整体收获很大。此外在实验中我也遇到了一些问题,在查找资料和咨询同学后都得以成功解决,现记录如下:
1.对于第四题查找文档中的红色文字
在程序中,我将文档中的文字分为段落文字和表格文字两种分别进行遍历查找。在查找段落文字时未出现问题,但在查找表格文字时使用判断语句if cell.font.color.rgb == RGBColor(255, 0, 0):时报错:cell没有font属性。在咨询同学后,我发现可以将单元格cell中的内容当作“段落文字”,重新进行遍历,这样操作后成功查找到表格中的红色文字。
2.对于第六题汇总所有人的特长
程序运行时报错zipfile.BadZipFile: File is not a zip file,查找原因为:不能在pycharm的文件中直接创建xlsx文件,会被识别为无效文件,必须在WPS中创建真正的表格文件。
程序运行时报错'Workbook' object has no attribute 'append',查找原因为:不能直接向workbook文件中添加数据,要先创建新的sheet,对应语句为sheet = wb.create_sheet("大家的特长"),之后可向sheet中插入数据。
程序运行成功,但“大家的特长.xlsx”文件内容为空,在CSDN上查找解决方案,需添加如下语句:for w1 in wb: w1 = wb.active wb.remove(w1)
3.对于文件数据
最开始,对于第五题和第六题所用到的文件数据,我是直接在excel里面手敲数据完成,后面尝试使用python代码生成文件数据,发现后者更能锻练我利用python库对文件进行操作的能力,也学习到了很多文件操作的新知识。