不管小白也好,還是剛學有成,這篇文章一定對你有用。隻要跟着以下實現的步驟流程,能耐心的看下去,即使是小白,也能學會這項技能。因為這些都是很基礎的知識,不需要太多的邏輯實現,更談不到什麼數據結構算法,所以學習起來不枯燥、不會感到辛苦和吃力,能讓學了馬上學有所成,同樣能獲得成就感爆棚的一項技能。在此學習之前,建議至少先安裝好運行代碼的工具,比如純小白學習的話,這款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 os
path = "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 "\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編輯器上運行之後,結果如下圖所示:
說明代碼方面沒有任何問題,這時而在目錄下也多了一個result_melon.txt的文件,文件打開可以看到,這裡面的文件路徑“F:\TEST\343.txt”是存放了包含“西瓜”關鍵詞的文件完整路徑,隻有包含“西瓜”關鍵詞的才會保存在這個文件裡,如下圖所示:
二、實現csv文件要求:
有一天,你的上司同樣發了一封郵件給你,在還沒來得及下載打開,這時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 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
正确的這麼寫即可:
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後綴格式,所以這裡需要用到拼接處理。“命名”為“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 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)
從得到的表圖中看到,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)
從表圖中看到,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表格文件存進去了:
總結:
上面的兩個任務總體完成了,這兩個要求要實現的代碼除注釋除外,代碼量很少,僅僅幾十行而已,卻能讓你提高工作效率,提早完成上司的要求。說不準,反而還更容易受到上司的愛戴,認為你真的可行,交代事情很靠譜,辦事快。所以類似這種簡單的要求,這些技巧多少還是得學會的。知識和技能是一點點長進的,追求每天都學一點,吸收-實踐-溫故...彼此循環。
對于學習編程語言,下面的這句話很是有道理,和大家共勉之。學到很多東西的訣竅,就是一下子不要學很多。——洛克
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!