大家好,我是Python進階者无虚。
一边涕、前言
前幾天在Python白銀交流群【上海新年人】問了一個Python自動化辦公實戰(zhàn)的問題晤碘,問題如下:大佬們褂微,我有個難度高的問題,我有個文件夾园爷,里面呢有一堆文件宠蚂,然后我要尋找至少2個關(guān)鍵字相同的文件,然后提取文件中第二列中的數(shù)字童社,第一列名稱保留求厕,譬如圖片中,只要是有馬橋這兩個字,就分別打開這兩個文件扰楼,形成新的文件呀癣,第二列的數(shù)據(jù),依次放在B列C列這樣子弦赖。
直接把問題和文件项栏,截圖等都給全盤托出了,不過咋一看蹬竖,這個問題確實有點復(fù)雜沼沈,看文字確實不明所以。后來【瑜亮老師】要求他發(fā)語音補充下問題信息币厕。
二列另、實現(xiàn)過程
這里繼續(xù)補充下粉絲的需求:大哥們是這樣子,就是說文件里面不是有很多文件嘛劈榨,然后呢访递,原先呢,等于說是他這個文件名字呢同辣,當(dāng)時取的比方說是一月份馬橋拷姿,兩月份馬橋,三月份馬橋旱函。然后呢响巢,我只要找到有馬橋這兩個字的就是文件,然后分別打開棒妨,然后呢踪古,取第二列的那個數(shù)字。然后呢券腔,就是新形成一個新的文件伏穆,把第二列的數(shù)字呢,放在新文件那個里面的第二列纷纫,第三列枕扫,第四列第五列,這樣依次排列辱魁,這樣子方便我看他這個每個月的數(shù)字的有有哪些不同烟瞧。
然后呢诗鸭,第一列我是保留的,因為第一列等于說里面文件當(dāng)中的第一列都是相同的参滴,然后呢强岸,我只取要我只是我只需要提取一次就可以了,等于說第一列等于說是名字都一樣的砾赔。
語音補充后確實清晰很多了蝌箍,這里【瑜亮老師】給了一個具體的實現(xiàn)方法,具體如下所示:
對文件名中月份和報告前面的文字提取一下暴心,相同的就把數(shù)據(jù)橫向合并為兩行十绑。全部馬橋的拼接一個excel文件,全部磚橋的拼接一個excel文件酷勺,如果你有全部的這些地名的列表,做起來會更簡單扳躬,如果地名不多脆诉,可以手動寫個列表,把地名保存到里面贷币。如果地名有很多击胜,那可以用代碼提取一下。
【上海新年人】:不是役纹,就是能不能用這種形式偶摔,譬如文件名[2:5],只要是2:5完全相同就合同在一起促脉,合并在一起辰斋,然后能不能用pandas中的concat。
【瑜亮老師】:也可以瘸味,但是你要保證地名長度符合切片取值的范圍宫仗。例如你舉例是2:5,取3個字符旁仿,就要保證這三個字符能夠涵蓋所有的分類藕夫。
【上海新年人】:對呀,譬如2月馬橋枯冈,3月馬橋毅贮,我只取第2-4中的馬橋這兩字,然后用concat能行嗎尘奏?好久沒用pandas滩褥,忘記了怎么用法
【瑜亮老師】:可以的。最終還是遍歷文件名罪既,然后分類铸题,讀取文件铡恕,把df添加進數(shù)據(jù)列表中,然后concat合并列表丢间,to_excel探熔。
【上海新年人】:用if怎么用法?每個file_name[2:4]要完全相同烘挫!
for file_name in file_names:
if file_name[2:4] = ?
【瑜亮老師】:不能這么寫诀艰,存儲格式最好是用{“file_name[2:4]”:[df1,df2]}這樣的。
【上海新年人】:我不要這么找法饮六!
【瑜亮老師】:具體實現(xiàn)如下:
【上海新年人】:stem代表什么其垄?
【瑜亮老師】:文件名,不包括擴展名的文件名卤橄,你也可以用file.name绿满,意思是包含擴展名的文件名。但是這里都是不影響結(jié)果的窟扑。用哪個都行喇颁。
【上海新年人】:哦,我驗算下
【瑜亮老師】:這里切片只取了2個字符嚎货,如果你的文件名中的地名長度超過2個字符橘霎,就會出現(xiàn)問題。要么數(shù)據(jù)出現(xiàn)混亂殖属,要么生成的文件名不對姐叁。比如馬新橋,切片只能提取出來馬新洗显。主要是數(shù)據(jù)少外潜,只能按照你給的數(shù)據(jù)寫出代碼。
【上海新年人】:瑜亮老師墙懂,上面的代碼可行的橡卤,思路不錯,謝謝瑜亮老師K鸢帷碧库!難點在于那個字典那個操作,琢磨了好久巧勤。
順利地解決了自己的問題嵌灰。
如果你也有類似這種Python相關(guān)的小問題,歡迎隨時來交流群學(xué)習(xí)交流哦颅悉,有問必答沽瞭!
三、總結(jié)
大家好剩瓶,我是Python進階者驹溃。這篇文章主要盤點了一個Python自動化辦公實戰(zhàn)的問題城丧,文中針對該問題,給出了具體的解析和代碼實現(xiàn)豌鹤,幫助粉絲順利解決了問題亡哄。
最后感謝粉絲【上海新年人】提出的問題,感謝【瑜亮老師】給出的思路布疙,感謝【莫生氣】等人參與學(xué)習(xí)交流蚊惯。
【提問補充】溫馨提示,大家在群里提問的時候灵临〗匦停可以注意下面幾點:如果涉及到大文件數(shù)據(jù),可以數(shù)據(jù)脫敏后儒溉,發(fā)點demo數(shù)據(jù)來(小文件的意思)宦焦,然后貼點代碼(可以復(fù)制的那種),記得發(fā)報錯截圖(截全)顿涣。代碼不多的話赶诊,直接發(fā)代碼文字即可,代碼超過50行這樣的話园骆,發(fā)個.py文件就行。