【数据分析基础】实验三 文件操作、数组与矩阵运算

一.实验目的

  1. 掌握上下文管理语句with的使用方法。
  2. 掌握文本文件的操作方法。
  3. 了解os、os.path模块的使用。
  4. 掌握扩展库Python-docx、openpyxl的安装与操作word、Excel文件内容的方法。
  5. 熟练掌握numpy数组相关运算和简单应用。
  6. 熟练使用numpy创建矩阵,熟悉常用的矩阵运算。

二、实验内容

遍历并输出文本文件的所有行内容。

(1)程序代码:

with open('the_little_prince.txt') as fp:
    for line in fp: # 文件对象可以直接迭代
        print(line)

(2)运行结果(截图):

假设文件data.txt中有若干整数,所有整数之间使用英文逗号分隔,编写程序读取所有整数,将其按升序排序后再写入文本文件data_asc.txt中

参考代码:

(1)程序代码:

with open('data.txt', 'r') as fp:
    data = fp.readlines()
data = [line.strip() for line in data]  # 删除每行两侧的空白字符
data = ','.join(data)  # 合并所有行
data = data.split(',')  # 分隔得到所有数字字符串
data = [int(item) for item in data]  # 将数字字符串列表转换为整数列表
data.sort()  # 对整数列表进行升序排序
data = ','.join(map(str, data))  # 将排序后的整数列表转换为字符串,准备写入文件
with open('data_asc.txt', 'w') as fp:  # 打开文件data_asc.txt并将排序后的字符串写入
    fp.write(data)

(2)data.txt(截图):

(3)Data_asc.txt(截图):

编写程序,递归删除指定文件夹中指定类型(.tmp、.log、.obj)的文件和大小为0的文件。

参考代码:

(请注意:以上示例代码中,主程序调用函数删除指定文件时,指定的目录是‘D:\我的桌面\test’,需要在运行程序前先建立该目录,并在该目录下建立一些相关的文件。该程序功能涉及到文件的删除,所以指定测试的目录要谨慎!)

(1)程序代码:

from os.path import isdir, join, splitext
from os import remove, listdir, chmod, stat
file_types = ('.tmp', '.log', '.obj')  # 指定要删除的文件类型
def delete_certain_files(directory):
    if not isdir(directory):
        return
    for filename in listdir(directory):
        temp = join(directory, filename)

        # 检查是否为目录,如果是,则递归调用
        if isdir(temp):
            delete_certain_files(temp)
            # 检查文件扩展名,并且检查文件大小是否为0
        elif splitext(temp)[1] in file_types or stat(temp).st_size == 0:
            try:
                os.chmod(temp, 0o777)  # 修改文件属性,获取删除权限
                remove(temp)  # 删除文件
                print(f"{temp} Deleted.")
            except Exception as e:
                print(f"Error deleting file {temp}: {e}")
# 指定要删除文件的目录
delete_certain_files(r'C:\Users\A\Desktop\test')

(2)运行结果(截图):

(3)运行前后文件夹概览:

   

数组的创建与运算

(1)程序代码和运行结果:

矩阵的创建与运算。

(1)程序代码和运行结果(截图):

三、实验任务

学习教材第5、6章内容,根据实验内容练习相关编程知识。

独立完成如下编程任务并提交实验报告。(报告撰写要求详见模板文档)

假设文件data.txt中有若干整数,所有整数之间使用英文逗号分隔,编写程序读取每一行的整数,将每行数据按降序序排序后,按行保存到新文件data_desc.txt中。

(1)程序代码:

data = fp.readlines()

data = [line.strip() for line in data]  # 删除每行两侧的空白字符
data = ','.join(data)  # 合并所有行
data = data.split(',')  # 分隔得到所有数字字符串
data = [int(item) for item in data]  # 将数字字符串列表转换为整数列表
data.sort(reverse=True)  # 对整数列表进行降序排序
data = ','.join(map(str, data))  # 将排序后的整数列表转换为字符串,准备写入文件
with open('data_asc.txt', 'w') as fp:  # 打开文件data_asc.txt并将排序后的字符串写入
    fp.write(data)

(2)data.txt(截图):

(3)Data_asc.txt(截图):


超市营业额.xslx

已知有文件“超市营业额.xslx”中记录了某超市2019年3月1日至3日各个员工在不同时段、不同柜台的销售额,部分数据如下图:

编写程序,读取该文件中的数据,并统计每个员工的销售总额、每个时间段的销售总额、每个柜台的销售总额。

(1)程序代码:

import pandas as pd
# 读取Excel文件
df = pd.read_excel('超市营业额.xlsx', engine='openpyxl')
# 将日期和时段列转换为字符串,以便于后续处理
df['日期'] = df['日期'].astype(str)
df['时段'] = df['时段'].astype(str)
# 统计每个员工的销售总额
total_by_employee = df.groupby('工号')['交易额'].sum()
# 统计每个时间段的销售总额
total_by_time = df.groupby('时段')['交易额'].sum()
# 统计每个柜台的销售总额
total_by_counter = df.groupby('柜台')['交易额'].sum()
# 输出结果
print("每个员工的销售总额:")
print(total_by_employee)
print("\n每个时间段的销售总额:")
print(total_by_time)
print("\n每个柜台的销售总额:")
print(total_by_counter)

(2)运行结果(截图):

编写函数Search(pathname,check_str) 实现检查指定文件夹及其子文件夹中的文件内容包含指定字符串check_str的.docx、.xlsx文档名称并存入元组,返回该元组。编写主程序,接收输入:文件夹名和要查找的字符串,调用函数Search(pathname,check_str),打印输出返回的结果

(1)程序代码:

import os
def Search(pathname, check_str):
    # 初始化一个元组,用于存储匹配的文件路径
    matching_files = ()
    # 遍历指定的文件夹及其子文件夹
    for root, dirs, files in os.walk(pathname):
        for file in files:
            # 检查文件扩展名是否为 .docx 或 .xlsx,并且文件名是否包含指定的字符串
            if file.lower().endswith(('.docx', '.xlsx')) and check_str in file:
                # 将文件的完整路径添加到元组中
                matching_files += (os.path.join(root, file),)
    # 返回匹配到的所有文件路径
    return matching_files
def main():
    # 从用户那里获取文件夹路径和要查找的字符串
    pathname = input("请输入文件夹路径:")
    check_str = input("请输入要查找的字符串:")
    # 调用 Search 函数并获取结果
    result = Search(pathname, check_str)
    # 打印结果
    if result:
        print("找到的文件:")
        for file in result:
            print(file)
    else:
        print("没有找到包含指定字符串的文件。")
if __name__ == "__main__":
    main()

(2)运行结果(截图):

实验总结:

知识点小结:

我掌握了使用with语句进行上下文管理,这是一种优雅且安全的方法来处理文件操作。

我学会了如何使用Python标准库中的os和os.path模块来操作文件和目录。

我了解了如何安装并使用扩展库python-docx和openpyxl来处理Word和Excel文件。

我熟练掌握了numpy库的基本使用,包括数组的创建、运算以及矩阵的生成和运算。

实验体会:

通过实践,我体会到了Python在数据处理方面的强大功能。特别是在处理Excel和Word文档时,合适的库可以极大地提高工作效率。我也认识到了代码的可读性和维护性的重要性,这在我编写和重构代码时被特别关注。

未解决的问题:

在实验过程中,我遇到了一些挑战,尤其是在处理复杂的文件操作和数组运算时。有时,我需要花费额外的时间去理解错误信息并找到解决方案。

改进的方法:

继续深入学习Python的高级特性和第三方库,以扩展我的技术栈。

学习更多关于代码优化和性能提升的技巧,阅读更多的技术文档和源代码,以获得更深入的理解。

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值