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))

以上,其余总结等后续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值