1. 程式人生 > 其它 >python資料分析&自動化辦公實戰(二):批量輸入輸出excel檔案

python資料分析&自動化辦公實戰(二):批量輸入輸出excel檔案

此篇起皆為實戰總結,以 程式碼+註釋+相關總結 為主,基礎語法請自行學習,注意各種資料型別間的不同就好。

任務目標 :給定一年中每個月每一筆訂單的詳細資訊(csv),需要輸出每個月的客戶名稱、業務型別、收入、成本並計算毛利(excel) 目標拆解 :獲取資料夾下所有csv檔案的檔案路徑,依照檔案路徑讀取csv檔案,摘取特定欄位並做簡單計算,輸出excel 用到的庫 :os,sys,numpy,pandas,csv,xlwt

程式碼展示:

   import os,sys
import numpy as np
import pandas as pd
import openpyxl
import csv
import xlwt

#遍歷資料夾,輸出資料夾下所有的檔案路徑及名稱
def walk(path):
if not os.path.exists(path):
return -1
for root,dirs,names in os.walk(path):
for filename in names:
if os.path.splitext(filename)[1] == '.csv':
doc = os.path.join(root,filename)
print(doc)
csvlist.append(doc)

#確定當前所在的資料夾路徑
csvlist = []
cur_path = os.getcwd()
walk(cur_path)

#讀取csv,選擇特定欄位,輸出為xlsx
for doc in csvlist:
df = pd.read_csv(doc,encoding = "gbk")
df[["月份","客戶名稱","業務型別","收入不含稅","成本"]]
df["毛利"] = df.apply(lambda df:df["收入不含稅"]-df["成本"],axis=1)
excel_name = os.path.splitext(doc)[0] + "-整理後.xlsx"
columns = {"月份","客戶名稱""業務型別",,"收入不含稅","成本","毛利"}
df.to_excel(excel_writer = excel_name,sheet_name = "商家損益資料",index = False,columns=columns)

接下來開始拆解一下程式碼: 首先是匯入所需要的庫,需要什麼匯入什麼即可; 第二部分是通過walk()函式遍歷資料夾並搜尋相關檔案,將檔名輸入到列表裡; 在此其中有些知識補充如下:

   for root,dirs,names in os.walk(path):
#root返回根目錄,dirs返回路徑,names返回檔名,有dirs在可以保證遍歷每個子資料夾
for filename in names:
if os.path.splitext(filename)[1] == '.csv':
#此項將檔名拆成了前後兩個部分,由於python的索引從0開始,截斷檔名後,索引為0的部分是名稱,1的部分是副檔名;
#副檔名由最後一個“.”後決定,在此之前的都是檔名,“123.456.csv.xlsx”的副檔名是“.xlsx”
doc = os.path.join(root,filename)
#doc是含檔案路徑和檔名在的絕對路徑,filename只是檔名
print(doc)
csvlist.append(doc)

第三部分是呼叫函式讀取檔案路徑;

   csvlist = []
#建立一個列表物件,用於儲存檔名
cur_path = os.getcwd()
#os.getcwd()是獲取當前檔案所在的檔案路徑

第四部分是通過for迴圈實現依次讀取批量操作:

   for doc in csvlist:
df = pd.read_csv(doc,encoding = "gbk")
#函式詳情見pandas官方說明文件,主要編碼格式有utf-8、gbk、gb2312等,可以在此指定讀取的列的資料型別;
#讀取excel檔案時函式為pd.read_excel(excel_name,sheet_name,encoding,usecols=use_cols)
df[["月份","客戶名稱","業務型別","收入不含稅","成本"]]
#摘取特定列,可以通過df[["客戶"]=="a"][["收入"]]等形式同時做行列篩選
df["毛利"] = df.apply(lambda df:df["收入不含稅"]-df["成本"],axis=1)
#新增新列,使用apply函式進行即時運算賦值,axis=1表示列間計算,axis=0為行計算
excel_name = os.path.splitext(doc)[0] + "-整理後.xlsx"
#規定輸出的檔案路徑和名稱,偷懶所以以原檔案所在的路徑、修改檔名輸出
columns = {"月份","業務型別","客戶名稱","收入不含稅","成本","毛利"}
#指定輸出的列及其順序
df.to_excel(excel_writer = excel_name,sheet_name = "sheet1",index = False,columns=columns)

一種可以快速合併csv檔案的方法,需要用到glob庫:

   import glob
import pandas as pd

csv_list = glob.glob('*.csv')

for i in csv_list:
fr = open(i,'rb').read()
with open('result.csv','ab') as f:
f.write(fr)

df = pd.read_csv("result.csv",encoding="gbk")
df.drop_duplicates(keep=False, inplace=False)
#去除多餘的標題行

利用tkinter庫選取檔案路徑:這個庫在新版的python中預設整合

   import tkinter
from tkinter import filedialog

#選擇所要上傳資料所在的資料夾
root = tkinter.Tk()
File_Path=tkinter.filedialog.askdirectory()
root.destroy()
#選取子資料夾
path_1 = os.path.join(File_Path, '訂單資料夾')
list_order = os.listdir(path_1)

for FileName in list_order: #遍歷資料夾所有檔案
Data=pd.read_excel(os.path.join(path_1,FileName))

以上,其餘總結等後續補充。