當前位置:首頁>職場>excel如何讀取csv文件(想提高工作效率)
發布時間:2024-01-24閱讀(16)
不管小白也好,還是剛學有成,這篇文章一定對你有用。只要跟著以下實現的步驟流程,能耐心的看下去,即使是小白,也能學會這項技能。因為這些都是很基礎的知識,不需要太多的邏輯實現,更談不到什么數據結構算法,所以學習起來不枯燥、不會感到辛苦和吃力,能讓學了馬上學有所成,同樣能獲得成就感爆棚的一項技能。在此學習之前,建議至少先安裝好運行代碼的工具,比如純小白學習的話,這款VSCode編輯器工具更為推薦,原因就是它兼容性算比較好,不用下載安裝各種模塊包,而且直接下載安裝搞定。
如果遇到安裝問題不知道怎么處理的,免得在網上到處找資料,到處碰壁,有興趣的可以看下我的這篇文章,是專講Python工具的安裝教程(超詳細),包括pycharm、anaconda這兩款硬核工具,如果還是不能解決的,「 可以通過評論,看到,會第一時間解決」:
小白都能看得懂的Python軟件安裝教程和配置,很詳細,值得收藏
對于正在工作中的白領也好還是正在上大學的大學生也好,學好一門編程語言,尤其是Python這門語言,在職場上是很有價值的,一來可以提高職場競爭力,二來可以提升工作效率。語言的本質它就是一個工具,我們得會用它,畢竟“工欲善其事必先利其器”。

每個打工者都知道,在工作上,本來要加班到很晚或者是要忙到幾天幾夜才能完成的工作報表,因為哪天會了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 ospath = "D:\" #為了測試的,這個隨意,文章所寫要做的是在F盤下filenames = os.listdir(path)print(filenames)# 打印所有文件名稱
結果就把D盤所有文件的名稱都打印出來了,如下圖所示:

步驟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 "
")# 寫入文件
步驟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 "
") # 把讀取到的文件寫入要保存的文件當中,并且換行顯示result_melon.close() # 關閉文件
通過在pycharm編輯器上運行之后,結果如下圖所示:

說明代碼方面沒有任何問題,這時而在目錄下也多了一個result_melon.txt的文件,文件打開可以看到,這里面的文件路徑“F:TEST343.txt”是存放了包含“西瓜”關鍵詞的文件完整路徑,只有包含“西瓜”關鍵詞的才會保存在這個文件里,如下圖所示:

有一天,你的上司同樣發了一封郵件給你,在還沒來得及下載打開,這時leader并帶著微笑向你走來,告訴你說:“好同志,我發給你的一份csv表格里,是咱們公司幾萬員工的職位表都包含在里面,現在急要,麻煩你把每個員工做成單獨的csv表格放到一個文件夾,壓縮后發給我”。幾萬份,聽著很夸張,于是你打開看看,類似這樣的表格。

而上司的要求是這樣的:

如果換做是你,你會怎么辦?幾萬份不是個小數目,難道要每個都新建新的一張表格,然后復制粘貼嗎?這樣不僅效率低下,或容易導致輸錯或疏漏等情況,也容易讓人崩潰到極點的地步。按幾萬份的量來說,靠著復制粘貼的方法,幾個晚上也難免能完成得了,而如果通過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 IdleJohn 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 cant decode byte 0xc3 in position 0: invalid continuation byte

正確的這么寫即可:
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)
結果如下圖所示:

步驟3:
有了表頭信息之外,通過遍歷除了表頭之外的每一行數據,這里用到for循環,代碼如下所示:
for data_row in employee_csv:
遍歷之后,我們要先獲取它的文件名稱 .csv后綴格式,所以這里需要用到拼接處理?!懊睘椤?strong>filename”的文件來保存這些.csv文件名稱,代碼如下所示:
filename = data_row[名稱] .csv # 拼接處理
最后要將獲取到的這些數據進行拼接成新的且完整的文件路徑,命名為“filepath”的文件來保存獲取到的所有文件的完整路徑,代碼如下所示:
filepath = employees_path filename # 設置新的且完整的文件路徑
為了確認可行性,打印輸出信息看看:
print(filepath) # 打印文件所在的完整地址
結果如下圖所示:

得到了我們想要的數據。
步驟4:
到這里一步很關鍵,因為我們要把所有員工的csv表格文件都寫入到這個新的文件中,所以要對這個文件進行以寫的方式打開文件,代碼如下圖所示:
with open(filepath, w, newline=) as employees_file: # 以寫的方式打開文件
步驟5:
到了這一塊知識點很重點,以寫方式打開文件是要將文件對象轉換為DictWriter對象;跟上面以讀取打開文件的方式是要將文件對象轉換為DictReader對象,這一點需要記住。
參考:在實例化DictWriter的時候,我們需要將一個列表傳給參數fieldnames,而且必須要傳入該參數,如果要問為什么,死記硬背它即可,就是需要,這是一種約定。目的是因為在設置csv文件的第一行表頭數據,當我們要將字典通過DictWriter對象寫入csv文件時,通常會把字典的鍵存入一個列表,再把這個列表傳給參數fieldnames。用命名為target_files保存DictReader對象,長這樣:

代碼如下所示:
target_files = csv.DictWriter(employees_file, fieldnames = headers)
步驟6:
寫入表頭,這里使用writeheader()的方法即可實現,代碼如下所示:
target_files.writeheader() # 寫入表頭
步驟7:
到了這一步,也是最后一步,完成上司交代任務的關鍵點,就是寫入數據這塊了,將數據寫入到目標文件中。寫入csv表格的數據有幾種方法,比如:writerow()和writerows()這兩種方法。
1、writerow()方法:
先看這段代碼:
import csvmy_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)

從得到的表圖中看到,writerow()方法作用是將一個列表全部寫入csv的同一行中。
2、writerows()方法:
先看這段代碼:
import csvmy_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)

從表圖中看到,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是空的文件夾,什么都沒有,現在,運行上面的整體代碼:

發現pycharm編輯器終端上顯示的信息已經全部打印出來:

再看看剛才那個demo文件有何變化?發現有csv表格文件存進去了:


上面的兩個任務總體完成了,這兩個要求要實現的代碼除注釋除外,代碼量很少,僅僅幾十行而已,卻能讓你提高工作效率,提早完成上司的要求。說不準,反而還更容易受到上司的愛戴,認為你真的可行,交代事情很靠譜,辦事快。所以類似這種簡單的要求,這些技巧多少還是得學會的。知識和技能是一點點長進的,追求每天都學一點,吸收-實踐-溫故...彼此循環。
對于學習編程語言,下面的這句話很是有道理,和大家共勉之。學到很多東西的訣竅,就是一下子不要學很多。——洛克
歡迎分享轉載→http://m.avcorse.com/read-235254.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖