tft每日頭條

 > 職場

 > excel如何讀取csv文件

excel如何讀取csv文件

職場 更新时间:2024-08-02 09:10:43
前言及工具安裝:

不管小白也好,還是剛學有成,這篇文章一定對你有用。隻要跟着以下實現的步驟流程,能耐心的看下去,即使是小白,也能學會這項技能。因為這些都是很基礎的知識,不需要太多的邏輯實現,更談不到什麼數據結構算法,所以學習起來不枯燥、不會感到辛苦和吃力,能讓學了馬上學有所成,同樣能獲得成就感爆棚的一項技能。在此學習之前,建議至少先安裝好運行代碼的工具,比如純小白學習的話,這款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

總結:

上面的兩個任務總體完成了,這兩個要求要實現的代碼除注釋除外,代碼量很少,僅僅幾十行而已,卻能讓你提高工作效率,提早完成上司的要求。說不準,反而還更容易受到上司的愛戴,認為你真的可行,交代事情很靠譜,辦事快。所以類似這種簡單的要求,這些技巧多少還是得學會的。知識和技能是一點點長進的,追求每天都學一點,吸收-實踐-溫故...彼此循環。

對于學習編程語言,下面的這句話很是有道理,和大家共勉之。學到很多東西的訣竅,就是一下子不要學很多。——洛克

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关職場资讯推荐

热门職場资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved