Python批量读取csv(xlsx)文件指定表头获取内容(表头可乱序)

程序背景

我们在日常办公中经常会遇到去csv或者excel文件中去剪切自己需要的列,然后重新粘贴在新的文件中,但是这样的工作方式非常的耗时,且效率低下,那么是否有一种方法,只要我提供表头就可以快速将我需要的表头生成一个新的文件呢,这样就可以批量处理了

需求如图:

左边的原文件的表头太多,我只想要右边的表头文件,如果复制粘贴确实可以做到,但是如果文件量非常庞大的话,这是非常耗时的!!

那么今天我们利用python来实现,批量读取!

在这里插入图片描述

第 1 种 读取 xlsx的Excel文件

安装
pandas pip install pandas
openpyxl pip install openpyxl

目录结构

文件夹—【数据源】:存放你的数据源(可多个不限制数量)

文件夹—【结果】:保存后的结果

在这里插入图片描述

代码1

注意1:head = [‘姓名’,‘地址’,‘电话’],这是你想获取的表头(可乱序)

# -*- coding: utf-8 -*-
'''
@作者    :一晌小贪欢
'''
import os

import openpyxl
import pandas as pd


def read_excel():
    # 表头
    head = ['姓名','地址','电话']
    for f in os.listdir("./数据源/"):
    	wb = openpyxl.Workbook()
        ws = wb.active
        ws.append(head)
		row_1 = 0
        indexs = []
        reader = pd.read_excel("./数据源/"+os.listdir("./数据源/")[0],header=None)
        for row in reader.values.tolist():
            row_1 += 1
            if row_1 == 1:
                # print(row)
                for h in head:
                    if h in row:
                        # print(h,row.index(h))
                        indexs.append(row.index(h))
                continue
            res_data = []
            for i in range(len(head)):
                res_data.append(row[indexs[i]])
            ws.append(res_data)
            print(res_data)

    print(f"{
      
      f},已存储陈功!!")
    wb.save("./结果/res.xlsx")

read_excel()

## 第 2 种 读取 csv文件(都是内置库)

代码2:

注意1:head = [‘姓名’,‘地址’,‘电话’],这是你想获取的表头(可乱序)

注意2:注意数据源csv的编码方式,encoding=‘utf-8’,如果不是utf-8,可将csv文件用记事本打开,然后另存,另存的时候点击下面的编码——先择——UTF-8(如下图)

在这里插入图片描述

# -*- coding: utf-8 -*-
'''
@作者    :一晌小贪欢
'''

import csv
import os


def read_csv():
    # 表头
    head = ['姓名',	'地址','电话']
    for f in os.listdir("./数据源/"):
        # 打开 CSV 文件
        with open("./结果/" + '结果-' + f.split('.')[0] + '.csv', 'w', newline='', encoding='utf-8') as csv_w:
            csv_w = csv.writer(csv_w)
            csv_w.writerow(head)
            with open("./数据源/" + f, newline='', encoding='utf-8') as csvfile:
                # 读取 CSV 文件内容
                reader = csv.reader(csvfile, delimiter=',', quotechar='"')
                # 遍历 CSV 文件中的每一行数据
                row_1 = 0
                indexs = []
                for row in reader:
                    row_1 += 1
                    if row_1 == 1:
                        # print(row)
                        for h in head:
                            if h in row:
                                # print(h,row.index(h))
                                indexs.append(row.index(h))
                        continue
                    res_data = []
                    for i in range(len(head)):
                        res_data.append(row[indexs[i]])

                    csv_w.writerow(res_data)

        print(f"{
      
      f},已存储陈功!!")


read_csv()

进阶版(csv版)(可筛选每一列的内容),这里我换了一个数据源

注意1:head = [‘承运商’, ‘店铺名称’,‘交易平台’,‘订单类型’,‘平台付款时间’],这里依旧便是表头

lie_list:这个列表中的小列表与表头相匹配,如我的小列表[‘SF’,‘shunfeng’],表示:head中【‘承运商’】我只要选取为:‘SF’,以及‘‘shunfeng’’的,然后以此类推

如下代码

if res_data[0] in lie_list[0] and
res_data[1] not in lie_list[1] and
res_data[2] in lie_list[2] and
res_data[3] in lie_list[3] and
res_data[4] not in lie_list[4]:

上述代码只要你在lie_list中的小列表为空,你就在对应的索引下 加个not ,如上述代码中的第二条以及第五条,表示,我要选取【‘店铺名称’】中所有的数据 以及 选取【‘平台付款时间’】中所有的数据,依次类推

import csv
import os


def read_csv():
    # 表头
    head = ['承运商', '店铺名称','交易平台','订单类型','平台付款时间']
    lie_list = [

        ['SF','shunfeng'], # 第一个表头的内容
        [],# 第2个表头的内容
        ['JD'], # 第3个表头的内容
        ['销售出库'],
        [],
                ]
    for f in os.listdir("./数据源(CSV)/"):
        # 打开 CSV 文件
        with open("./结果/" + '结果-' + f.split('.')[0] + '.csv', 'w', newline='', encoding='utf-8') as csv_w:
            csv_w = csv.writer(csv_w)
            csv_w.writerow(head)
            with open("./数据源(CSV)/" + f, newline='', encoding='utf-8') as csvfile:
                # 读取 CSV 文件内容
                reader = csv.reader(csvfile, delimiter=',', quotechar='"')
                # 遍历 CSV 文件中的每一行数据
                row_1 = 0
                indexs = []
                for row in reader:
                    row_1 += 1
                    if row_1 == 1:
                        # print(row)
                        for h in head:
                            if h in row:
                                # print(h,row.index(h))
                                indexs.append(row.index(h))
                        continue
                    res_data = []
                    for i in range(len(head)):
                        res_data.append(row[indexs[i]])
                    # res_data = [row[indexs[0]], row[indexs[1]],row[indexs[2]]]
                    if res_data[0] in lie_list[0] and \
                       res_data[1] not in lie_list[1] and \
                       res_data[2] in lie_list[2] and \
                       res_data[3] in lie_list[3] and \
                       res_data[4] not in lie_list[4]:
                        # print(res_data)
                        # print(list(enumerate(row)))
                        csv_w.writerow(res_data)

        print(f"{
      
      f},已存储陈功!!")


read_csv()

希望对大家有帮助

致力于办公自动化的小小程序员一枚

都看到这了,关注+点赞+收藏=不迷路!!

如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!

猜你喜欢

转载自blog.csdn.net/weixin_42636075/article/details/131681770