自动化办公学习笔记(风变编程)


前言

(2021年1月24日)对之前买的风变编程中自动化办公的课程进行学习,清掉自己冲动消费后的遗留学习,为期六天,通过这里记录学习笔记,希望能够在6天内掌握基本知识,能够让自己用python解决一些实际问题,提高效率。风变编程学习网址:https://www.pypypy.cn/


第一天:获取文件名称

知识点

1.os(Operating System)全称是叫操作系统模块,它是属于标准库,也就是Python自带的库。它常用于处理文件和目录(文件夹)的操作。例如删除文件、判断文件目录是否存在等功能。
2.os.listdir()它的功能是将某文件夹中,所有文件夹名和文件名获取到。
3.模块是一个py文件,库是多个具有同类功能模块的集合

代码示例

#导入标准库
import os
#输入文件路径
path = r"E:\code\python_code\pandas_python\basic_class"
#获取路径下所有文件及文件夹的名称
filename = os.listdir(path)
print(filename)

文件内容:
在这里插入图片描述
运行结果:

['assets.csv', 'auto_email_send.py', 'auto_excel.py', 'heart.gif', 'qrcode.png', 'two_dimension_code.py', 'xinxin.gif']

第二天 txt和csv文件的读写处理

txt文件的筛选与读取

项目背景:将一个文件夹下的所有文件进行筛选,选择txt文件,并在寻找txt文件中是否有关键词,将存在关键词的txt文件路径写入另一个文档中。

绝对路径与相对路径

绝对路径就是文件的完整路径,可通过os模块下的getcwd()获取

import os
print(os.getcwd())

相对路径主要用到...
'./'表示当前路径
'../'表示上一级路径

读取文件

知识点

1.open()打开文件
file = open(filepath,mode,encoding='')
filepath是文件路径,可用绝对路径与相对路径
mode为模式,主要用到r,w,a(只读,只写,追加)
encoding为编码形式,编码形式可以自己查询
在这里插入图片描述

2.file.read()读取文件全部内容,返回为一个字符串
content = file.read()
3.file.close()关闭文件
file.close()

代码示例
import os
print(os.getcwd())
path = './data.txt'
file = open(path,'r',encoding='utf-8')
content = file.read()
print(content)
print(type(content))
file.close()

在这里插入图片描述
结果:

E:\code\python_code\pandas_python\Office_Automation
111 2222
333
444
555
<class 'str'>

写文件

知识点

1.write()
file.write(content)
可以将content中的内容写到文件中,需向读取文件中打开关闭文件,设置模式为aw

代码示例
path = './data.txt'
content = ['777 888','999']
#模式为追加
file = open(path,'a',encoding='utf-8')
for item in content:
	#注意换行
    file.write(item+'\n')
file.close()

在这里插入图片描述
由于原文件中的文件指针在555后面,因此下一行的内容直接追加在此行后,在写入之前加入’\n’即可换行

补充

1.readline()读取一行
2.readlines()按行读取,放入列表中
3.直接遍历file对象,可取出每一行内容
4.注意读取完一次文件后,文件指针默认到最后,可通过f.seek()修改

代码示例1
path = './data.txt'
file = open(path,'r',encoding='utf-8')

#可以直接读出每行内容,注意每行内容后都有\n
for item in file:
    print(item,end='')

print("距离文件头的距离:",file.tell())
#将文件指针移到文件头
file.seek(1,0)
content1 = file.read()
#content1是一个字符串,按字符进行遍历
for item in content1:
    print(item,end='')


file.seek(1,0)
content2 = file.readline()
#只能读取一行
print(content2,end='')
print(type(content2))

file.seek(1,0)
content3 = file.readlines()
#返回一个每行的列表,可以遍历输出每行的值
print(content3)
print(type(content3))

运行结果:

111 2222
333
444
555777 888
999
距离文件头的距离: 37
11 2222
333
444
555777 888
999
11 2222
<class 'str'>
['11 2222\n', '333\n', '444\n', '555777 888\n', '999\n']
<class 'list'>

注意问题:f.seek(0,0)为回到文件头,代码中写成了f.seek(1,0),因此出现从第1个字符后开始读,f.seek(offset,from_what)
1.seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
2. f.writelines()里的内容是一个列表,f.write()写入的内容必须为字符串

代码示例2
path = './data.txt'
file = open(path,'a',encoding='utf-8')
content1 = '112 335\n567 678\n'
content2 = ['111 333\n','222 333\n']
content3 = ['111 333','222 333']
file.writelines(content1)
file.writelines(content2)
file.writelines(content3)

结果:
在这里插入图片描述
发现还是需要在列表里的每一行后面手动加换行符的,而且字符串和列表都能当参数!

CSV文件的读取

项目背景:将csv文件中的每一行拆分出来,并复制进每个表中。

CSV文件

csv是"Comma-Separated Values(逗号分割的值)"的首字母缩写,和txt文件一样,是纯文本文件。但csv文件可以显示为电子表格的样式,所以可以把csv文件视为一种简化版的电子表格。常见的Excel表格,不仅有“居中”排版,表格边框等样式,还有各种Excel公式等其他功能,这些功能在csv文件中是不存在的。csv文件是纯文本文件,它只能存储数据。

读取CSV文件

python内置模块csv,可以完成数据的读入和写入,通过import csv导入模块

打开文件的更好方式

1.可以用open()打开,和txt文件类似,与打开txt文本文件稍有不同的地方是,需要在open()中传入新的参数newline=’’,这样可以避免一些不必要的空行
2.为了避免忘记关闭文件造成的错误,可以使用with open(·····) as variable: 打开文件,就不需要使用variable.close()

知识点

读取文件,使用函数reader()和类DictReader两种方式
1.reader()函数会返回一个reader对象,这是一个可迭代对象,该对象里面的每一个元素都是一个列表,每一个列表都对应了csv文件中的一行,语法为csv.reader(csvfile)
2.(1)DictReader类,使用这个类来读取第一行为表头的csv文件,可以更好地反映出表头与文件内容的映射关系。DictReader类的操作类似于常规的reader(),但DictReader会将读取到的信息转换为字典形式。
(2)实例化DictReader类后,会得到一个DictReader对象,这是一个可迭代对象,可以使用循环来遍历它的每一个元素。但不同于reader()的是,该对象里面的每一个元素都是一个字典,每一个字典的值都可以对应csv文件中的一行,键对应csv文件的表头。
(3)这个类还有个属性fieldnames,该属性可以将csv文件(表格)的表头(第一行)读取出来,返回值是列表。这个表头也就是字典的键(key)。

代码示例1
import csv

with open("./material/学生成绩.csv",'r',encoding='utf-8',newline='') as csvfile:
    grade = csv.reader(csvfile)
    print(type(grade))
    for i in grade:
        print(i)

在这里插入图片描述

<class '_csv.reader'>
['\ufeff姓名', '成绩']
['1', '37']
['2', '40']
['3', '43']
['4', '46']
['5', '49']
['6', '52']
['7', '55']
['8', '58']
['9', '61']
['10', '64']
['11', '67']
['12', '70']
['13', '73']
['14', '76']
['15', '79']
['16', '82']
['17', '85']

注意:文件头多了一个\ufeff字符,是因为UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序的问题,因此它实际上并不需要BOM(“ByteOrder Mark”);UTF-8 with BOM即utf-8-sig需要提供BOM。将编码方式变为utf-8-sig即可。

with open("./material/学生成绩.csv",'r',encoding='utf-8-sig',newline='') as csvfile:

>>>运行结果
['姓名', '成绩']
代码示例2
import csv

with open("./material/学生成绩.csv",'r',encoding='utf-8-sig',newline='') as csvfile:
    content = csv.DictReader(csvfile)
    print("用DictReader读出的类型是----->",type(content))
    #读取表头
    header = content.fieldnames
    print(header)
    print("读出表头的类型是:---->",type(header))
    #遍历
    for cvs_row in content:
        print(cvs_row)

运行结果:

用DictReader读出的类型是-----> <class 'csv.DictReader'>
['姓名', '成绩']
读出表头的类型是:----> <class 'list'>
{'姓名': '1', '成绩': '37'}
{'姓名': '2', '成绩': '40'}
{'姓名': '3', '成绩': '43'}
{'姓名': '4', '成绩': '46'}
{'姓名': '5', '成绩': '49'}
{'姓名': '6', '成绩': '52'}
················

写文件

csv模块准备了两种写入方式——函数writer()与类DictWriter。
1.writer()函数是csv模块内的一个函数
(1)当使用open()打开csv文件,得到文件对象后,可以把这个文件对象传入writer()函数。writer()函数会返回一个writer对象,可以调用该对象的方法将字符串文本写入csv文件。(要将内容写入csv文件,需要先把open()返回的文件对象转化为writer对象。)
(2)然后需要调用writer对象的方法writerow(row),该方法会将参数row当作一行内容写入csv文件中。参数row代表了想要写入csv文件的内容,它必须是一个可迭代对象,这里推荐使用列表。如果想通过这个方法写入多行数据。需要借助循环来实现。
2.DictWriter的操作类似于常规的writer(),但DictWriter会将字典写入(映射)到csv文件的行中。即通过DictWriter写入的行,都必须是字典形式,这点和writer()还是有区别的。
当需要将字典类型的数据写入csv文件时,使用DictWriter会是一种更好的选择。
(1)实例化DictWriter
语法:csv.DictWriter(file,fieldnames),fieldnames为表头,必须传入该参数。需要将一个列表传给参数fieldnames,它的作用是设置csv文件的第一行数据(即表头数据)。当我们要将字典通过DictWriter对象写入csv文件时,通常会把字典的键(key)存入一个列表,再把这个列表传给参数fieldnames。
(2)writeheader(),该方法可将表头(即字典中的键(key))写入csv的第一行。如果要写入表头,不仅要在DictWriter中传入参数fieldnames,还需要调用writeheader()方法。
(3)writerow(row),与writer对象调用writerow(row)不同的是,这里的参数row必须是字典形式的数据。在写入时,该方法会根据字典的键,找到相应的表头,然后再将此键对应的值写入表头对应的列。

代码示例1
import csv

list = [["1",400],['2',500]]
with open("./material/test.csv",'w',encoding='utf-8',newline='') as csvfile:
    #1.先将文件对象转为write对象
    csv_writer = csv.writer(csvfile)
    #2.用writerow写入文件
    for row in list:
        csv_writer.writerow(row)

结果:
在这里插入图片描述

代码示例2
import csv

dict = [
    {"姓名":1,"成绩":20},
    {"姓名":2,"成绩":30},
    {"姓名":3,"成绩":40},
    {"姓名":4,"成绩":50},
]
header = ["姓名","成绩"]
with open("./material/test.csv",'w',encoding='gbk',newline='') as csvfile:
    #1.先实例化DictWriter对象
    csv_writer = csv.DictWriter(csvfile,fieldnames=header)
    #2.用writeheader()写入文件头
    csv_writer.writeheader()
    #3.循环遍历将字典内容写入writerow(row)
    for row in dict:
        csv_writer.writerow(row)

结果:
在这里插入图片描述
注意事项:在这里编码使用的是gbk,最初使用的是utf-8,出现了乱码的现象;(编码还是有不清楚的地方,需要解决)

项目实战

将学生成绩中每一行拆分,保存为新的文件

注意

  1. 当想利用读出的csv内容的行数作为筛选条件时,出现以下错误
info[1+stage*76+video*15:1+stage*76+video*15+15]

报错信息:
TypeError: 'DictReader' object is not subscriptable

只需要把它转换成list就可以了

info = list(info)

就可以正常读取啦!

第三天 Excel文件的概念介绍

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl --user

总结

未完待续
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值