《数据挖掘》实验一:文件操作

一、实验目的

熟练掌握内置函数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库对文件进行操作的能力,也学习到了很多文件操作的新知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值