前言及工具安装:

不管小白也好,还是刚学有成,这篇文章一定对你有用。只要跟着以下实现的步骤流程,能耐心的看下去,即使是小白,也能学会这项技能。因为这些都是很基础的知识,不需要太多的逻辑实现,更谈不到什么数据结构算法,所以学习起来不枯燥、不会感到辛苦和吃力,能让学了马上学有所成,同样能获得成就感爆棚的一项技能。在此学习之前,建议至少先安装好运行代码的工具,比如纯小白学习的话,这款VSCode编辑器工具更为推荐,原因就是它兼容性算比较好,不用下载安装各种模块包,而且直接下载安装搞定。

如果遇到安装问题不知道怎么处理的,免得在网上到处找资料,到处碰壁,有兴趣的可以看下我的这篇文章,是专讲Python工具的安装教程(超详细),包括pycharm、anaconda这两款硬核工具,如果还是不能解决的,「 可以通过评论,看到,会第一时间解决」:

小白都能看得懂的Python软件安装教程和配置,很详细,值得收藏

对于正在工作中的白领也好还是正在上大学的大学生也好,学好一门编程语言,尤其是Python这门语言,在职场上是很有价值的,一来可以提高职场竞争力,二来可以提升工作效率。语言的本质它就是一个工具,我们得会用它,毕竟“工欲善其事必先利其器”。

excel如何读取csv文件(想提高工作效率)(1)

每个打工者都知道,在工作上,本来要加班到很晚或者是要忙到几天几夜才能完成的工作报表,因为哪天会了python这门技术,会利用这个工具,结果还能提早下班,可以留出那么多的时间去做自己喜欢做的事情。同时还更能让老板看重和同事们的羡慕。不管做运营的,还是财务部门的,还是人力资源部的等等行业,善于利用Python做些自动化办公的技术活岂不是很吃香?(不仅加薪升职,更是精神上的解脱)

工作中碰到最多的无非就是Excel表格和一些普通文件的处理,尤其数量庞大且数据复杂的情况,整理起来会有让人有种快疯狂的节奏。真的是神累、心更累,为了能够解决工作上,对这些问题的困扰,以下谈两个场景,说不定哪天就派上用场了。

一、实现.txt文件要求:

比如,有一天,老板发给了你一个邮件,邮件里面有一个压缩文件,通过下载到电脑之后,你高高兴兴的对文件解压并点开一看,发现文件打开来是成千上万的文件,文件类型也很多,包括了.txt后缀的普通文档,图片(png,jpg,jpeg等格式).csv,.xlsx,压缩包,配置文件等等类型文件,你除了叹气还是叹气。

这时候,比如老板要求叫你,给我找到文件内容信息中要包含有“西瓜”这个关键词的文件,而且要求是.txt文件的,给我整理出来,同时并把这个文件的路径地址一同做成文件发给我。

想想,成千上万的文件,而且要求里面的内容包含老板想要的关键词(西瓜),这时候,难道要对.txt的文件一个一个打开,然后不断去搜索,做复制粘贴的重复性工作吗?如果几千几万个文件,估计加一两个晚上的班,这样的效率不太可能完成,就算可以,也会有出错,或者少漏等情况,毕竟是人工审核。既然如此,我们得想到最好的方法,用工具代替人工,实现更准更快的方法,代替我们双手和精神上的解放吧。

实现步骤流程:

对于这个问题,其实很简单,说了那么多的介绍,接下来干货开始吧,具体看步骤。对于文件的操作,首先是需要先导入“os”这个包,在Python里,os是个标准库,不需要安装,直接拿来使用即可。python的格式,如下所示

步骤1:

import os# 导入os模块

步骤2:

设置保存文件路径,先把老板发的文件存放到任何一个盘符下,如果是在工具上操作,可以放在工具的同一个文件中,这个就取相对路径即可 ./xxxxx格式 的,也可以放在任何盘符,这个就需要取它的绝对路径。在python中,绝对路径的书写方式常用的有两种:

第1种:"C:/Users/zhangSan/Desktop/1.csv"

第2种:"C:\\Users\\zhangSan\\Desktop\\1.csv"

我保存的是在F盘下,所以我就创建一个文件:

path = "F:\\TEST\\"# 创建文件路径

步骤3:

目的是要找到.txt类型的文件,前提我们要先提取出来文件的名称,这个提取方法,咱们用filenames用来保存所有文件名称的,看代码

filenames = os.listdir(path)# 获取读取文件的名称

通过三个步骤,就可以取到所有文件的名称了,整个代码如下所示

import os path = "D:\\" #为了测试的,这个随意,文章所写要做的是在F盘下 filenames = os.listdir(path) print(filenames)# 打印所有文件名称

结果就把D盘所有文件的名称都打印出来了,如下图所示

excel如何读取csv文件(想提高工作效率)(2)

步骤4:

咱们把老板要求文件里要有西瓜关键词的这个问题,让用户自己去输入的方式来实现,这里要用到一个函数,"input",代码即如下

key_word = input("请输入你要查找的关键词:")

步骤5:

到了这一步,需要创建一个命名为 result_melon.txt随便命名)的文件来保存含有西瓜关键词的“.txt后缀”的文件,这里以追加方式打开文件:

result_melon = open("F:\\result_melon.txt",'a',encoding="utf-8")

步骤6:

通过遍历读取到所有的文件名称,用for循环,代码如下所示

for fliename in filenames: # fro循环遍历

步骤7:

因为我们要的是".txt"后缀的文件,所以这里需要用一个if判断语句,来判断在文件名称中是否存在后缀名为.txt的文件,代码如下所示

if ".txt" in filename:# 判断在文件名称中是否存在后缀名为.txt的文件

为了确定是否正确,可以先让其在终端上显示出来,可以输入打印以下信息

print("找到文件了:" filename)#如果.txt文件存在,就打印出来

到了这里,仅仅是找到了文件而已,而我们要的是这个文件的整个文件路径,所以需要做拼接处理,拼接成完整的文件相对路径,保存到为“target”命名(命名随意)的的目标文件中,代码如下所示

target = path filename # 拼接成完整的文件相对路径

步骤8:

这一步需要打开读取文件,编码格式为“utf-8”,代码如下所示

file = open(target,"r",encoding="utf-8")# 打开文件

文件的读取,用read()函数,假设用contents来保存.txt文件中包含的所有信息内容,代码如下所示

contents = file.read()# 读文件

最后,有打开文件,就必须要记得关闭文件代码如下所示

file.close()# 关闭文件

步骤9:

知道了所有.txt文件包含的信息,要求是要找到“西瓜”关键词的,所以很好办,还是利用if判断语句就能解决了。即判断输入的关键词是否存在.txt的文件内容当中,因为我们的关键词是通过用户输入的,代码可以这么写

if key_word in contents:# 判断输入的关键词是否在内容中

为了能够确认是否合乎要求,可以将信息打印出来看看,比如

print("真给力,目标文件{}中,包含了{}这个关键词。".format(target,key_word))

其中的 .format()函数 是用来格式化处理,它增强了字符串格式化的功能,代替以前的“%”形式,可以接受不限个参数,位置可以不按顺序,这些了解一下即可。

最后,确定了存在西瓜关键词存在.txt文件当中,那么为了要求的目的,将这个目标文件写入到result_melon中,写入文件用到 write()函数,把读取到的文件写入要保存的文件当中,并且以换行显示,代码如下所示

result_melon.write(target "\n")# 写入文件

步骤10:

这也是最后一步,因为在一开始时,创建并打开了一个命名为result_melon.txt的文件,在完成所有需求操作后,需要关闭文件的操作。

result_melon.close()# 关闭文件

好了,到这里,所有的要求条件就都满足了,接下来,看看整体代码是怎么写的?如下所示

import os # 导入标准库 path = "F:\\TEST\\" # 创建文件路径 filenames = os.listdir(path) # 获取读取文件的名称 # 用户输入信息 key_word = input("请输入你要查找的关键词:") # 创建一个命名为result_melon.txt的文件,以追加方式打开文件 result_melon = open("F:\\result_melon.txt", 'a', encoding="utf-8") # 遍历读取到的文件名称 for filename in filenames: # 判断在文件名称中是否存在后缀名为.txt的文件 if ".txt" in filename: # 找到则打印以下信息 print("找到文件了:" filename) # 拼接成完整的文件相对路径,保存到为target的目标文件中 target = path filename file = open(target, "r", encoding="utf-8") # 打开并读取文件 contents = file.read() # contents为.txt文件中包含的所有信息内容 file.close() # 关闭文件 # 判断输入的关键词是否存在.txt的文件内容当中 if key_word in contents: # 存在则打印以下信息 print("真给力,目标文件{}中,包含了{}这个关键词。".format(target, key_word)) result_melon.write(target "\n") # 把读取到的文件写入要保存的文件当中,并且换行显示 result_melon.close() # 关闭文件

通过在pycharm编辑器上运行之后,结果如下图所示:

excel如何读取csv文件(想提高工作效率)(3)

说明代码方面没有任何问题,这时而在目录下也多了一个result_melon.txt的文件,文件打开可以看到,这里面的文件路径“F:\TEST\343.txt”是存放了包含“西瓜”关键词的文件完整路径,只有包含“西瓜”关键词的才会保存在这个文件里,如下图所示

excel如何读取csv文件(想提高工作效率)(4)

二、实现csv文件要求:

有一天,你的上司同样发了一封邮件给你,在还没来得及下载打开,这时leader并带着微笑向你走来,告诉你说:“好同志,我发给你的一份csv表格里,是咱们公司几万员工的职位表都包含在里面,现在急要,麻烦你把每个员工做成单独的csv表格放到一个文件夹,压缩后发给我”。几万份,听着很夸张,于是你打开看看,类似这样的表格。

excel如何读取csv文件(想提高工作效率)(5)

而上司的要求是这样的:

excel如何读取csv文件(想提高工作效率)(6)

如果换做是你,你会怎么办?几万份不是个小数目,难道要每个都新建新的一张表格,然后复制粘贴吗?这样不仅效率低下,或容易导致输错或疏漏等情况,也容易让人崩溃到极点的地步。按几万份的量来说,靠着复制粘贴的方法,几个晚上也难免能完成得了,而如果通过python,仅前提写好十几二十行代码量,就能分分钟搞定,这样的效率且高,不易出错或疏漏的问题。好,咱们开始看如何来实现的吧。

实现步骤流程:

步骤1:

同样的需要导入 csv模块,Python自带了csv模块,提供用户对csv文件进行读写的操作,命令如下所示

import csv #导入csv模块

下面这是一张测试实验的csv表格,感兴趣的可以拿来一样来测试下,如下表

名称

编号

职位

工资

刘一

1

程序员

20000

陈二

2

程序员

20000

张三

3

程序员

20000

李四

4

程序员

20000

王五

5

程序员

20000

赵六

6

程序员

20000

孙七

7

程序员

20000

周八

8

程序员

20000

吴九

9

程序员

20000

郑十

10

程序员

20000

何十一

11

程序员

20000

祝十二

12

程序员

20000

黄十三

13

程序员

20000

柯十四

14

销售员

15000

冯十五

15

销售员

15000

余十六

16

销售员

15000

曾十七

17

销售员

15000

邹十八

18

销售员

15000

袁十九

19

销售员

15000

董二十

20

销售员

15000

熊二十一

21

销售员

15000

章二十二

22

分析师

25000

蒋二十三

23

分析师

25000

杨二十四

24

分析师

25000

连二十五

25

分析师

25000

左二十六

26

分析师

25000

肖二十七

27

分析师

25000

林二十八

28

分析师

25000

钱二十九

29

分析师

25000

朱三十

30

主管

30000

秦三十一

31

主管

30000

吕三十二

32

主管

30000

曹三十三

33

经理

30000

魏三十四

34

经理

30000

金三十五

35

经理

30000

姜三十六

36

财务

20000

谢三十七

37

总监

70000

可以将保存到csv表格文件当中,将这个文件保存到任意盘符都行,我的是放在电脑桌面,设置保存文件路径

employee_path = 'C:/Users/80491/Desktop/员工职位表.csv' # 设置保存文件路径

因为还有制作一份文件夹来保存这所有员工的csv表格,所以还需要再设置存放所有员工表的文件路径,这里我同样存放在电脑桌面,将文件夹命名为demo

employees_path = 'C:/Users/80491/Desktop/demo/' # 设置存放所有员工表的文件路径

步骤2:

以“”的方式打开员工职位表这个文件,这里利用:with open() as file:的格式,为什么要这么写,不像上面打开文件的写法,这样的写法主要是为了解决在读写打开文件后有时候忘记了close()关闭文件的操作。具体使用方法,如下是官方文档中给出的一个例子

>> import csv >>> with open('names.csv', newline='') as csvfile: ... reader = csv.DictReader(csvfile) ... for row in reader: ... print(row['first_name'], row['last_name']) ... Eric Idle John Cleese >>> print(row) OrderedDict([('first_name', 'John'), ('last_name', 'Cleese')])

有个值得注意的地方

在函数里面的参数书写格式里,还要注意编码的格式,如果保存的是“utf-8”的格式,就必须写上编码格式,但最好不要仅仅写“utf-8”:如这样:

with open('names.csv', encoding="utf-8", newline='') as csvfile:

最好是写"utf-8-sig",这样的写法:

with open('names.csv', encoding="utf-8-sig", newline='') as csvfile:

为什么utf-8编码后面要带个“-sig”?主要原因是为了解决多出了一个非法字符("\ufeff"),否则会造成读写失败。具体为什么就别管太多了,知道这么用就行了。

但是这个演示的csv表格文件,是没另存为utf-8格式的,所以不需要加上编码格式,否则会报这样的错误提示:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte

excel如何读取csv文件(想提高工作效率)(7)

正确的这么写即可:

with open(employee_path, 'r', newline='') as employee_file:# 以读的方式打开文件

到这一步,当然是读取文件了,将文件对象转换为DictReader对象。有人要问了,为什么不需要用read()函数了?不了,这里更推荐使用DictReader的用法。

原因何在?因为在Python的csv模块为我们提供了一种更好的读取方式,当csv文件中若存在映射关系,需要将字典类型的数据读取/写入csv文件时,就使用DictReader/DictWriter这两种方法。虽然read()和write()函数的用法也可以实现,但DictReader/Dictwriter可以更好地反映出表头与文件内容的映射关系。

以读的方式或者使用以只写的方式打开文件,都会使用到将文件对象转换为DictReader/DictWriter对象。DictReader和read()的区别就是:前者是个类,后者是个函数(带上"小括号()"),同理,DictWriter和writer()也是一样。

DictReader/DictWriter会将字典读取/写入(映射)到csv文件的行中,会将读取或写入到的信息转换为字典形式。和read()和writer()函数是有一定区别的。

好,介绍到这里,怎么写文件对象转换为DictReader对象?代码如下所示

employee_csv = csv.DictReader(employee_file)

因为我要先将csv对象的表头给读出来,里面用到一个fieldnames属性,其作用是设置csv文件的第一行表头数据,为了确认代码的可行性,把信息打印出来看看,代码如下所示

headers = employee_csv.fieldnames #打印表头信息 print("里面的表头信息为:{}".format(headers)

结果如下图所示:

excel如何读取csv文件(想提高工作效率)(8)

步骤3:

有了表头信息之外,通过遍历除了表头之外的每一行数据,这里用到for循环代码如下所示

for data_row in employee_csv:

遍历之后,我们要先获取它的文件名称 .csv后缀格式,所以这里需要用到拼接处理。“命名”为“filename”的文件来保存这些.csv文件名称,代码如下所示

filename = data_row['名称'] '.csv' # 拼接处理

最后要将获取到的这些数据进行拼接成新的且完整的文件路径,命名为“filepath”的文件来保存获取到的所有文件的完整路径,代码如下所示

filepath = employees_path filename # 设置新的且完整的文件路径

为了确认可行性,打印输出信息看看:

print(filepath) # 打印文件所在的完整地址

结果如下图所示:

excel如何读取csv文件(想提高工作效率)(9)

得到了我们想要的数据。

步骤4:

到这里一步很关键,因为我们要把所有员工的csv表格文件都写入到这个新的文件中,所以要对这个文件进行以写的方式打开文件,代码如下图所示

with open(filepath, 'w', newline='') as employees_file: # 以写的方式打开文件

步骤5:

到了这一块知识点很重点,以写方式打开文件是要将文件对象转换为DictWriter对象;跟上面以读取打开文件的方式是要将文件对象转换为DictReader对象,这一点需要记住

参考:在实例化DictWriter的时候,我们需要将一个列表传给参数fieldnames,而且必须要传入该参数,如果要问为什么,死记硬背它即可,就是需要,这是一种约定。目的是因为在设置csv文件的第一行表头数据,当我们要将字典通过DictWriter对象写入csv文件时,通常会把字典的键存入一个列表,再把这个列表传给参数fieldnames。用命名为target_files保存DictReader对象,长这样

excel如何读取csv文件(想提高工作效率)(10)

代码如下所示

target_files = csv.DictWriter(employees_file, fieldnames = headers)

步骤6:

写入表头,这里使用writeheader()的方法即可实现,代码如下所示

target_files.writeheader() # 写入表头

步骤7:

到了这一步,也是最后一步,完成上司交代任务的关键点,就是写入数据这块了,将数据写入到目标文件中。写入csv表格的数据有几种方法,比如:writerow()和writerows()这两种方法。

1、writerow()方法:

先看这段代码:

import csv my_list = [10, 11, 12, 13, 14] with open("C:/Users/80491/Desktop/list.csv", "w", encoding="utf-8", newline='') as lists: files = csv.writer(lists) files.writerow(my_list)

excel如何读取csv文件(想提高工作效率)(11)

从得到的表图中看到,writerow()方法作用是将一个列表全部写入csv的同一行中

2、writerows()方法:

先看这段代码:

import csv my_lists = [[10], [11], [12], [13], [14]] with open("C:/Users/80491/Desktop/lists.csv", "w", encoding="utf-8", newline='') as lists: files = csv.writer(lists) files.writerows(my_lists)

excel如何读取csv文件(想提高工作效率)(12)

从表图中看到,writerows()方法作用是将一个二维列表中的每一个列表写为一行(即多行显示)。从这两个方法中看,writerow()接受一维数据,writerows()接受二维数据。

所以很清楚,现在我们的数据是一维数据,只需要用writerow()方法即可,代码如下所示

target_files.writerow(data_row) # 将数据写入到目标文件中

经过以上7个步骤,终于告一段落,完成上司安排的任务了,现在一起看看这整个实现代码是如何写的?

import csv # 导入csv模块 # 设置保存文件路径 employee_path = 'C:/Users/80491/Desktop/员工职位表.csv' # 设置存放所有员工表的路径 employees_path = 'C:/Users/80491/Desktop/demo/' # 以读的方式打开员工职位表这个文件 with open(employee_path, 'r', newline='') as employee_file: # 将文件对象转换为DictReader对象 employee_csv = csv.DictReader(employee_file) # 将csv对象的表头给读出来,fieldnames的作用是设置csv文件的第一行表头数据 headers = employee_csv.fieldnames # 打印表头信息 print("里面的表头为:{}".format(headers)) # 遍历除了表头之外的每一行数据 for data_row in employee_csv: filename = data_row['名称'] '.csv' # 获取文件名 filepath = employees_path filename # 获取新的文件路径 print(filepath) # 获取所有的csv文件路径并打印在终端上显示 # 以写的方式打开文件 with open(filepath, 'w', newline='') as employees_file: # 这一块很重点,是将文件对象转换为DictWriter对象 target_files = csv.DictWriter(employees_file, fieldnames=headers) # 然后写入表头中 target_files.writeheader() # 最后将数据写入到目标文件中 target_files.writerow(data_row)

目前,这个demo是空的文件夹,什么都没有,现在,运行上面的整体代码:

excel如何读取csv文件(想提高工作效率)(13)

发现pycharm编辑器终端上显示的信息已经全部打印出来:

excel如何读取csv文件(想提高工作效率)(14)

再看看刚才那个demo文件有何变化?发现有csv表格文件存进去了:

excel如何读取csv文件(想提高工作效率)(15)

excel如何读取csv文件(想提高工作效率)(16)

总结:

上面的两个任务总体完成了,这两个要求要实现的代码除注释除外,代码量很少,仅仅几十行而已,却能让你提高工作效率,提早完成上司的要求。说不准,反而还更容易受到上司的爱戴,认为你真的可行,交代事情很靠谱,办事快。所以类似这种简单的要求,这些技巧多少还是得学会的。知识和技能是一点点长进的,追求每天都学一点,吸收-实践-温故...彼此循环。

对于学习编程语言,下面的这句话很是有道理,和大家共勉之。学到很多东西的诀窍,就是一下子不要学很多。——洛克

,