【Python文件操作和各种包的实践应用】合肥工业大学实验三题解(源代码+详解)

持续更新,新手代码勿喷.

各种包的安装:

1.打开cmd
2.输入pip install *** (***为包的名字),例如 pip install numpy
3.等待下载好之后,重新打开pycharm等编辑器就行了

题目:

在这里插入图片描述
在这里插入图片描述

第一题题解(json文件处理)

import json
n = int(input("输入n:"))
# 二维数组
List = [[]]*n
filename = "D:/Pycharm/实验三/score1034.json"
# 这里需要注意encoding='UTF-8',因为json用记事本打开后的编码是UTF-8,而默认的好像是GBK
with open(filename, 'r', encoding='UTF-8') as f:
    data = json.load(f)
# 考虑到当n为奇数的时候,不能直接将对应的键值对全部打印出来,因此用到间隔为2的循环,然后用if处理末尾是奇数的情况
for i in range(0, n, 2):
    List[i] = list(data[i].keys())
    # 这一步保证最后一次赋值如果n是奇数,则不会将对应的values赋给list
    if i+1 != n:
        List[i+1] = list(data[i].values())
print(List)

第二题题解(csv文件处理)

import pandas as pd
import numpy as np
df = pd.DataFrame(pd.read_csv("D:\\Pycharm\\实验三\\成绩单数字.csv"))
List1 = df.values
List2 = df.columns
print(List2)
print(List1)


def Name():
    name = str(input("输入学生姓名:"))
    for i in range(len(List1)):
        if name == List1[i][0]:
            average = 0
            print('[[', i + 1, '0', ']]')
            for j in range(2, len(List1[i])):
                average += List1[i][j]
            print(name, "同学的平均成绩为{:.2f}".format(average / 6))


def Course():
    course = str(input("输入课程名称:"))
    for i in range(len(List2)):
        if course == List2[i]:
            average = 0
            for j in range(len(List1)):
                average += List1[j][i]
            median = np.median(df[course])
            deviation = np.std(df[course])
            print(course, "课程平均成绩为{:.2f}".format(average/len(List1)))
            print("该课程中位数为{:.2f}".format(median))
            print("该课程标准差为{:.2f}".format(deviation))


Name()
Course()

第三题题解(利用 numpy 和 Matplotlib画出正余弦函数图)

import numpy as np
import matplotlib.pyplot as plt
# 标题
plt.title("COS & SIN")
x = np.linspace(0, 2*np.pi, 100)
s = np.sin(x)
c = np.cos(x)
# 绘制sinx
plt.plot(x, s, color='red')
# 绘制cosx
plt.plot(x, c, color='blue', linestyle='--')
plt.show()

第四题题解(读取文件,然后画出雷达图)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 使能够读取中文
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
filename = 'D:/Pycharm/实验三/scoreRadar.txt'
fp = open(filename, 'r', encoding='UTF-8')
List1 = [[]]*4
flag = 0
s = fp.readline()
while s:
    # 去除换行符
    s = s.strip('\n')
    new_s = s.split("\t")
    List1[flag] = new_s
    s = fp.readline()
    flag += 1
# 记录各个科目
radar_labels = np.array(List1[0][1:])
nAttr = len(radar_labels)
# 使用ggplot风格
plt.style.use('ggplot')
print(List1)
# 循环记录data的值
'''data = []
for i in range(3):
    data.append([])
    data[i] = np.array(List1[i+1][1:])'''
# 记录不同专业成绩数据
data = np.array([[95, 96, 85, 63, 91], [75, 93, 66, 85, 88], [86, 76, 96, 93, 67]])
values1 = np.array(data[0])
values2 = np.array(data[1])
values3 = np.array(data[2])
# 设置雷达图角度,用于平分切开一个平面
angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
# 使雷达图封闭起来
values1 = np.concatenate((values1, [values1[0]]))
angles = np.concatenate((angles, [angles[0]]))
values2 = np.concatenate((values2, [values2[0]]))
values3 = np.concatenate((values3, [values3[0]]))
# 开始绘图
fig = plt.figure()
# 设置成极坐标形式
ax = fig.add_subplot(111, polar=True)
# 绘制折线图
ax.plot(angles, values1, 'b', linewidth=2, label='软件工程')
# fill可以用来填充颜色
# ax.fill(angles, values1,  alpha=0.5)
ax.plot(angles, values2, 'g', linewidth=2, label='计算机科学与技术')
# ax.fill(angles, values2,  alpha=0.5)
ax.plot(angles, values3, 'r', linewidth=2, label='网络工程')
# ax.fill(angles, values3,  alpha=0.5)
ax.set_thetagrids(angles*180/np.pi, radar_labels)
plt.figtext(0.52, 0.95, '成绩雷达图', ha='center', size=20)
ax.grid(True)
plt.show()
fp.close()

第五题题解(读取文本,利用wordcloud生成词云)

import jieba
import wordcloud
# imread用来设置背景图片
from imageio import imread
r1 = open("校长2018.txt", "r", encoding="utf-8")
t1 = r1.read()
r1.close()
# 利用jieba库中的lcut函数实现对t1的切割分类
ls1 = jieba.lcut(t1)
txt1 = " ".join(ls1)
# 设置长宽高背景颜色,字体等 这里设置字体必须小写.
w1 = wordcloud.WordCloud(width=1000, height=800, background_color="black", font_path="msyh.ttc")
w1.generate(txt1)
w1.to_file('cp1.png')

# 自定义背景颜色和背景图片
background_color = str(input("输入你想要的背景颜色:"))
background_picture = str(input("输入你想要的背景的绝对路径:"))
mk = imread(background_picture)
r2 = open("校长2018毕业讲话.txt", "r", encoding="utf-8")
t2 = r2.read()
r2.close()
ls2 = jieba.lcut(t2)
txt2 = " ".join(ls2)
w2 = wordcloud.WordCloud(width=1000, height=800, background_color=background_color, font_path="simhei.ttf", mask=mk)
w2.generate(txt2)
w2.to_file('cp2.png')
# D:/Pycharm/xiaoyu.jpg

第六题题解(使用 numpy 实现矩阵的加法、减法、乘法和求逆)

import numpy as np
MA = np.array([[1, 2, 3], [4, 5, 6]])
MB = np.array([[1, 5, 6], [2, 7, 9]])
MC = np.array([[1, 4], [2, 5], [3, 6]])
MD = np.array([[-2, 1], [4, -3]])


# 加
def Plus(A, B):
    return A+B


# 减
def Reduce(A, B):
    return A-B


# 乘
def Multipication(A, B):
    return A.dot(B)


# 逆
def Inverse(C):
    return np.linalg.inv(C)


print("矩阵MA加矩阵MB等于:\n{}".format(Plus(MA, MB)))
print("矩阵MA减矩阵MB等于:\n{}".format(Reduce(MA, MB)))
print("矩阵MA乘矩阵MB等于:\n{}".format(Multipication(MA, MC)))
print("矩阵MD的逆等于:\n{}".format(Inverse(MD)))

第七题题解(使用 opencv 完成一幅图像的读取、显示,并用 matplotlib 画出该图像的直方图)

import cv2 as cv
import matplotlib.pyplot as plt
# 阅读图片
# 路径最好不要出现中文......
filename = "D://Pycharm//girlfriend.jpg"
img = cv.imread(filename)
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", img)


# 用matplotlib展示直方图
plt.hist(img.ravel(), 256)
# 用matplotlib展示原图像
'''b, g, r = cv.split(img)
dst_rgb = cv.merge([r, g, b])
plt.imshow(dst_rgb)
plt.xticks([])
plt.yticks([])'''
plt.show()
cv.waitKey(0)

第八题题解(使用 pil 完成一副图像的水平翻转、垂直翻转、水平+垂直翻转)

from PIL import Image
import matplotlib.pyplot as plt
filename = "D://Pycharm//xiaoyu.jpg"
# 图片读取


img = Image.open(filename)
plt.imshow(img)


def fanzhuan():
    s = str(input("输入翻转方式:"))
    if s == '水平翻转':
        plt.imshow(img.transpose(Image.FLIP_LEFT_RIGHT))
        plt.show()
    elif s == '垂直翻转':
        plt.imshow(img.transpose(Image.FLIP_TOP_BOTTOM))
        plt.show()
    elif s == '水平+垂直翻转':
        plt.imshow(img.transpose(Image.ROTATE_180))
        plt.show()
    else:
        print("输入错误")


fanzhuan()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值