Python数据分析


项目一:txt文件读写

一、打开文件

使用open()函数打开文件后,可以获得一个文件对象。

mode='r',以只读方式打开文件,默认模式。

mode='w',即写模式时,open()函数会打开一个文件只用于写入,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被清空。如果该文件不存在,创建新文件。
mode='a',即追加模式时,open()函数会打开文件用于追加。如果该文件已存在,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

# 打开目标txt文件
target_file = './txt文件筛选与读写素材/Python项目1—猜大小.txt'
file = open(target_file, 'r', encoding='utf-8')  
# 使用文件对象.read()方法读取文件内容
content = file.read()
print(content)
file.close()   #关闭文件

二、判断文件中是否有关键词

# 打开目标txt文件
target_file = './txt文件筛选与读写素材/Python项目1—猜大小.txt'
file = open(target_file, 'r', encoding='utf-8')  
# 使用文件对象.read()方法读取文件内容
content = file.read()
# 判断文件中是否有关键词
key_word = input('请输入你要查找的关键词:')
if key_word in content:
    print(f'找到了,文件“{target_file}”中存在关键词“{key_word}”')
file.close()   #关闭文件

三、获得文件夹内所有文件名

import os
# 设置目标文件夹路径
path = './txt文件筛选与读写素材/'
# 获取文件夹下的所有文件名
files_list = os.listdir(path)
print(files_list)

四、筛选出所有txt文件

import os
# 设置目标文件夹路径
path = './txt文件筛选与读写素材/'
# 获取文件夹下的所有文件名
files_list = os.listdir(path)

# 筛选出所有txt文件
for file_name in files_list:
    if '.txt' in file_name:
        print('文件名:',file_name)
        file_path = path + file_name # 拼接出文件的相对路径
        print('文件路径:',file_path)

五、从全部文件中查找关键词

import os

# 从txt文件中查找是否存在关键词
def findKeyWord(target_file,key_word):
    # 打开目标txt文件
    file = open(target_file, 'r', encoding='utf-8')  
    # 使用文件对象.read()方法读取文件内容
    content = file.read()
    # 判断文件中是否有关键词
    if key_word in content:
        print(f'找到了,文件“{target_file}”中存在关键词“{key_word}”')
    file.close()   #关闭文件

def main():
    # 设置目标文件夹路径
    path = './txt文件筛选与读写素材/'
    # 获取文件夹下的所有文件名
    files_list = os.listdir(path)
    key_word = input('请输入你要查找的关键词:')

    # 筛选出所有txt文件
    for file_name in files_list:
        if '.txt' in file_name:
            file_path = path + file_name # 拼接出文件的相对路径
            findKeyWord(file_path,key_word)
main()

六、txt文件写入

import os

# 从txt文件中查找是否存在关键词
def findKeyWord(target_file,key_word):
    # 打开目标txt文件
    file = open(target_file, 'r', encoding='utf-8')  
    # 使用文件对象.read()方法读取文件内容
    content = file.read()
    # 判断文件中是否有关键词
    if key_word in content:
        print(f'找到了,文件“{target_file}”中存在关键词“{key_word}”')
    file.close()   #关闭文件

def main():
    # 设置目标文件夹路径
    path = './txt文件筛选与读写素材/'
    # 获取文件夹下的所有文件名
    files_list = os.listdir(path)
    # 存放查询结果,以追加模式打开,这样每次写入就添加在最后,不会将原内容清空
    result_file = open('./result.txt','a',encoding = 'utf-8')
    key_word = input('请输入你要查找的关键词:')

    # 筛选出所有txt文件
    for file_name in files_list:
        if '.txt' in file_name:
            file_path = path + file_name # 拼接出文件的相对路径
            findKeyWord(file_path,key_word)
            result_file.write(file_path + '\n')  # 将结果写入文件
    result_file.close() #关闭文件

main()

项目二:csv文件读写

一、项目背景

海盐商贸学校刚进行了Python测验,成绩记录在一张csv表中,但是有的同学发挥失利,成绩不太理想,如果进行公布,势必会伤及自尊。因此,需要把这张csv表进行拆分,每位同学一张表,每张表只有一位同学的成绩。

二、CSV文件读取

1.with open() as 变量名

with open() as 变量名open()函数的优化,这种方法最大的不同就是不需要使用 close()函数关闭文件,因为我们总是会忘记关闭文件,导致占用大量系统资源,推荐使用这种方法。

2.读取为列表

render()函数是csv模块内的一个函数,用于读取csv文件对象,得到一个可迭代对象,该对象里面的每一个元素都是一个列表,每一个列表都对应了csv文件中的一行。

newline='' 告诉Python在处理CSV文件时自动检测并使用正确的行结束符。(否则会有空行)

utf-8-sig: 这是一种特殊的 utf-8 编码,主要用于 Microsoft Office 文件,否则excel打开会乱码,如果是wps就无所谓了。

import csv
# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
    # 读取文件对象,得到reader对象,reader对象是一个可迭代的列表
    csv_reader = csv.reader(csv_file)
    for csv_row in csv_reader:
        print(csv_row)

3.读取为字典

render()函数不同的是,DictReader()实例化之后得到一个字典,字典的键就是表头,这个表头可以通过fieldnames属性得到。

import csv
# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
    # 读取文件对象,得到DictReader对象,DictReader对象是一个可迭代的字典,字典的键就是表头
    csv_reader = csv.DictReader(csv_file)
    # 可通过fieldnames属性获取表头
    headers = csv_reader.fieldnames
    print(f'表头:{headers}')
    for csv_row in csv_reader:
        print(csv_row)

三、CSV文件写入

1.写入列表数据

写入文件需要先把文件对象转换为writer对象,然后调用writer对象writerow()方法将数据写入文件,不过要注意数据必须是一个可迭代的对象,推荐使用列表。

import csv
student_list = [
    ['小虎','55'],
    ['小老虎', '75'],
    ]
# 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建
with open('./平时成绩.csv', 'w', encoding='utf-8-sig', newline='') as csv_file:
    # 将文件对象转换为writer对象
    csv_writer = csv.writer(csv_file)
    # 将列表中的元素写入csv文件中
    for student in student_list:
        csv_writer.writerow(student)
	# 还有一种方法是writerows(),自己对比区别吧
    # csv_writer.writerows(student_list)

2.写入字典数据

如果要写入字典类型的数据,需要先将文件对象转换为DictWriter对象
不过需要设置字典的键,也就是表头。
设置方法就是在实例化DictWriter对象时传入参数fieldnames,再调用writeheader()方法。

import csv
student_list = [{'姓名':'小虎','成绩':'65'},{'姓名':'小老虎','成绩':'85'}]
# 设置表头
headers = ['姓名', '成绩']
# 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建
with open('./平时成绩.csv', 'w', encoding='utf-8-sig', newline='') as csv_file:
    # 将文件对象转换为DictWriter对象
    csv_writer = csv.DictWriter(csv_file, fieldnames=headers)
    # 写入表头
    csv_writer.writeheader()
    # 将列表中的元素写入csv文件中
    for student in student_list:
        csv_writer.writerow(student)
    # 还有一种方法是writerows(),自己对比区别吧
    # csv_writer.writerows(student_list)

四、完成项目

1.用列表类型完成

from asyncore import write
import csv

result_path = './拆分结果/'

# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
    csv_reader = csv.reader(csv_file)
    for csv_row in csv_reader:
        save_path =result_path + csv_row[0] + '.csv'
        print(save_path)
        # 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建(注意文件夹不会自动创建)
        with open(save_path, 'w', encoding='utf-8', newline='') as save_file:
            # 将文件对象转换为DictWriter对象
            save_file_writer = csv.writer(save_file)
            # 将列表中的元素写入csv文件中
            save_file_writer.writerow(csv_row)

2.用字典类型完成(推荐)

import csv

result_path = './拆分结果/'

# newline=''可避免空行
with open('./Python期末成绩.csv', 'r', encoding='utf-8-sig', newline='') as csv_file:
    # 读取文件对象,得到DictReader对象,DictReader对象是一个可迭代的字典,字典的键就是表头
    csv_reader = csv.DictReader(csv_file)
    # 可通过fieldnames属性获取表头
    headers = csv_reader.fieldnames
    print(f'表头:{headers}')
    for csv_row in csv_reader:
        save_path =result_path + csv_row['姓名'] + '.csv'
        print(save_path)
        # 打开'./平时成绩.csv'文件,获取文件对象,如果没有会自动创建(注意文件夹不会自动创建)
        with open(save_path, 'w', encoding='utf-8', newline='') as save_file:
            # 将文件对象转换为DictWriter对象
            save_file_writer = csv.DictWriter(save_file, fieldnames=headers)
            # 写入表头
            save_file_writer.writeheader()
            # 将列表中的元素写入csv文件中
            save_file_writer.writerow(csv_row)

项目完成🐱‍🚀😎

项目三:openpyxl库

一、基础知识

1.安装

openpyxl是用来处理Excel电子表格的Python第三方库,使用前需要现安装,pip install openpyxl

2.新建工作簿

from openpyxl import Workbook

# 新建工作簿
new_wb = Workbook()
# 将新建的工作簿保存为【新的Excel工作表.xlsx】
new_wb.save('./新的Excel工作表.xlsx')

3.读取工作簿

  1. openpyxl.load_workbook()可读取工作簿对象。
  2. 工作簿对象['工作表']可读取工作表。
  3. 工作表对象[行数]工作表对象['列名']可读取行和列,得到一个元祖。
  4. 工作表对象[行列]得到一个单元格对象Cell
  5. 单元格对象.value得到这个单元格对象具体的值。
from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 循环打印出第2行所有单元格的值
for cell_2 in ws_21J3[2]:
    print(cell_2.value)

# 循环打印出第2列(B列)所有单元格的值
for cell_B in ws_21J3['B']:
    print(cell_B.value)

# 打印出B1单元格的值
print(ws_21J3['B1'].value)
  • 工作表对象还有iter_rows()方法,可以获得表中指定范围的数据。
  • 参数min_rowmax_row分别表示最小行索引和最大行索引,参数min_colmax_col分别表示最小列索引和最大列索引。最小行索的值默认为1,最大索引的值默认为表格中有数据的最下面一行的行数。
  • 参数values_only决定是否返回单元格的值,如果为True则返回单元格的值,如果为False则返回单元格对象
from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 返回第2行至第12行,第2列(B列)至第3列(C列)这个范围的单元格内的所有数据
for row in ws_21J3.iter_rows(min_row=2, max_row=4, min_col=2, max_col=3, values_only=True):
    print(row)

单元格属性:

  1. row:单元格所在的行号。
  2. column:单元格所在的列号。
  3. value:单元格中存储的值。
  4. coordinate:单元格的坐标,表示为字符串形式的列字母和行号,例如”A1”。
  5. row_start:单元格开始行的行号。
  6. row_end:单元格结束行的行号。
  7. column_start:单元格开始列的列号。
  8. column_end:单元格结束列的列号。

4.添加数据

from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 按整行添加,添加数据只能是列表和元祖类型
ws_21J3.append(['31','新同学','男','55'])

# 按单元格添加
ws_21J3['A1'] = '你好'

# 添加完成后必须保存
wb.save('./Python成绩表.xlsx')

# 关闭文件,释放系统资源
wb.close()

注意,如果要保存文件,别把工作簿打开,会报错。

二、制作查询功能

查询可以用字典的键值对来实现。

from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 创建学生信息字典
student_info = {}

# 从第二行开始读取工作表中的信息
for row in ws_21J3.iter_rows(min_row=2, values_only=True):
    # 取出学号
    student_number = row[0]
    # 将信息存入学生信息字典
    student_info[student_number] = {
        '学号':row[0],
        '姓名':row[1],
        '性别':row[2],
        '成绩':row[3],
    }
    
print(student_info)
print(student_info[16]['姓名'])

完善一下交互体验吧。

from openpyxl import load_workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

# 创建学生信息字典
students_info = {}

# 从第二行开始读取工作表中的信息
for row in ws_21J3.iter_rows(min_row=2, values_only=True):
    # 取出学号
    student_number = row[0]
    # 将信息存入学生信息字典
    students_info[student_number] = {
        '学号':row[0],
        '姓名':row[1],
        '性别':row[2],
        '成绩':row[3],
    }

while True:
    try:
        # 输入你想查询的员工的工号
        student_number = int(input('请输出你想要查询的学号:'))
    except:
        print('请输入数字啊!!!')
        continue
    try:
        # 根据学号(键)找到学生信息(值)
        student_info = students_info[student_number]
    except:
        print('数据表中没有这个学号')
        continue

    search_info = input('请输出你想查询的信息(如:姓名/性别/成绩):')
    # 判断该员工信息是否存在
    if student_info.get(search_info):# dict.get()返回指定键的值,如果键不在字典中返回默认值 None 或者设置的默认值。  
        print(f'经查询,该学生的{search_info}{student_info[search_info]}')
    else:
        print('输入错误,只能查询姓名/性别/成绩')

三、筛选迟到同学信息

现需要筛选出迟到时间超过50分钟,并且迟到次数超过3次的同学,并将信息写入一张新的表格。

from openpyxl import load_workbook,Workbook

# 打开【21计3成绩表.xlsx】工作簿
wb = load_workbook('./Python成绩表.xlsx')

# 获取【'21计3'】工作表
ws_21J3 = wb['21计3']

#获得表头
header = []
for row in ws_21J3[1]:
    header.append(row.value)

# 新建工作簿,存储迟到人员信息
new_wb = Workbook()
new_ws = new_wb.active  # 获得活动工作表(第一张表)

# 先写入表头
new_ws.append(header)

# 从第二行开始依次读取
for row in ws_21J3.iter_rows(min_row=2,values_only=True):
    name = row[1]
    late_time = row[4]
    late_number = row[5]
    if late_time > 50 and late_number > 3:
        print(f"{name}迟到了{late_time}分钟,迟到了{late_number}次。")
        new_ws.append(row)  # 将迟到人员的信息写入新表

# 保存文件
new_wb.save('./迟到同学信息.xlsx')

四、找出悄悄改成绩的同学

在录入成绩之前,有同学趁办公室没人,悄悄修改了自己的成绩,为预防这种情况,成绩单还留了一份旧表,现需要对比两张表格,找出那个悄悄改成绩的同学。

from openpyxl import load_workbook,Workbook

# 打开原来的工作簿、工作表
old_wb = load_workbook('./Python成绩表.xlsx')
old_ws = old_wb['21计3']

# 将旧表的信息做成一个字典,字典格式为{姓名:成绩}
score_dict = {}
for row in old_ws.iter_rows(min_row=2,values_only=True):
    score_dict[row[1]] = row[3]

# 打开被改动之后工作簿、工作表
new_wb = load_workbook('./Python成绩表(被悄悄改动过).xlsx')
new_ws = new_wb['21计3']

# 将新表中的数据一行行的拿出来对比
for row in new_ws.iter_rows(min_row=2,values_only=True):
    name = row[1]
    score = row[3]
    if score != score_dict[name]:
        print(f"{name}的成绩不对,和旧表匹配不上")

五、其他实际案例

1.成绩录入

今天遇到个问题,要把一张表中的学生成绩,导入到另一张表中,所不同的,另一张表是按照学号进行排序的,一个个找起来非常累。

import openpyxl

# 读取学生成绩
wb_score = openpyxl.load_workbook('./学生成绩.xlsx')
ws_store = wb_score['Sheet1']

# 写入学生名单
wb_student = openpyxl.load_workbook('./学生名单.xlsx')
ws_student = wb_student['Sheet1']

# 遍历学生名单
for cell_student in ws_student['B']:
    # 遍历学生成绩
    for cell_score in ws_store.iter_rows(min_row=6,max_row=44,min_col=2,max_col=6,values_only=True):
        # 如果找到名字相同
        if cell_student.value == cell_score[0]:
            # 则在该行添加成绩
            ws_student[f'E{cell_student.row}'] = cell_score[3]

# 保存文件
wb_student.save('./学生名单.xlsx')
wb_student.close()

文章作者: 彭韦浩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭韦浩 !
  目录