IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python xlrd xlwt pandas openxyl导入方法对比 N/A -> 正文阅读

[Python知识库]python xlrd xlwt pandas openxyl导入方法对比 N/A

操作目的:
通过对比两个EXCEL表格 对比数据 相同部分和不同部分区分开来 并生成新的EXCEL
两者表格形式如下 原理是通过读取B表格的参数编号和申报内容作为字典,在A表格中对应的进行查询 是否相同并作出标识
在这里插入图片描述
在这里插入图片描述

先说第一版使用openxyl做的代码
一地板openxyl写的代码本身没有问题 也很快 定位也很简单
但是有个致命性的问题 他不支持XLS文件格式

然后尝试了第二版的pandas 做代码导入
我说下pandas遇到的问题
其中比较难理解的是out of range的问题
相对于openxyl pandas是在读取文件的时间预先选定好文件的范围,比如4*4 那么超过这个范围的第5行你就选择不到 就会报这个错误 但是openxyl则不会有这个问题 openxyl相当于在一个excel的副本上进行操作 没有范围限制

其中还有一个pandas目前无法解决的问题 如果文件中出现N/A这个字符串时 他会默认识别为Nan 不会当做字符串而是空进行识别 这个也是我为什么会尝试第三种方法的原因
但Pandas的读取范围确实比openxyl要大
再说下xlrd 和xlwt的问题
相对于前面两种方式 他们的操作性好在于他的操作模式 相当于是复制了一个副本进行操作,如果某一个值不满意直接变更掉就可以了
但是xlrd则不是这样
他是对于EXCEL的直接操作,我这里是想要输出一个副本,那么操作起来就麻烦了不少
需要先读 对比 然后循环输出
就不是更改完后一把输出的模式
但是好处是他不会将N/A读错,字符串之间的转换也没有问题
对于写入来说 是有限将需要写入的字段拼成一个字符组
循环写入那一行 然后通过FILE输出 得到的效果和前面是一样的

row=df.index.size
    d = dict()
    for i in range(0, row):  # 最大行数
        lp = df.loc[i][1]
        np = df.loc[i][2]
        if not lp is None  :
            d[df.loc[i][0]] = df.loc[i][2]
            # print(df.loc[i][0],df.loc[i][2])
    # for key in d:
    #     print(key + ':' + str(d[key]))
    row2 = df2.index.size  # 获取最大的 行数
    col_name = df2.columns.tolist()
    col_name.insert(6,'状态')
    df3=df2.reindex(columns=col_name)
    for i in range(0, row2):  # 最大行数
        lp = df3.loc[i][1]
        if not lp is None:
            # d[df.loc[i][0]] = df.loc[i][2]
            # print(df3.loc[i][0], df3.loc[i][5])
            if d.get(df3.loc[i][0]) == df3.loc[i][5]:
                df3.iloc[i,4] = df3.loc[i][5]

            else:
                df3.iloc[i,4] = d.get(df3.loc[i][0])

                df3.iloc[i,6]='数据异常'
                # print(str(d.get(df3.loc[i][0]))+"|"+str(df3.loc[i][5]))
            # if d.get(df2.loc[i][0]) == df2.loc[i][3]:
            #     df2.loc[i][2] = df2.loc[i][3]
            # else:
            #     df2.loc[i][2] = d.get(df2.loc[i][1]+"参数不同")

    a = os.path.basename(selectFileName1)  # 带后缀的文件名
    b = a.split('.')[0]  # 不带后缀的文件名
    # print(b)
    writer=pd.ExcelWriter('./'+b+'.xlsx')
    df3.to_excel(writer)
    writer.save()
    writer.close()
    result = tkinter.messagebox.showwarning(title='执行成功', message='文件已生成')
    print (result)
    df3.to_excel(selectFileName1,sheet_name='备案参数')

在贴下 xlrd的代码

import pandas as pd
import tkinter
from tkinter import *
import tkinter.filedialog
import tkinter.messagebox
import os

import xlrd
import xlwt



def upload_files():
    global selectFileName
    selectFileName = tkinter.filedialog.askopenfilename(title='选择文件')  # 选择文件
    p.set(selectFileName)
    global df
    df = pd.read_excel(selectFileName)



def upload_files1():
    global selectFileName1
    selectFileName1 = tkinter.filedialog.askopenfilename(title='选择文件')  # 选择文件
    f.set(selectFileName1)
    global df2
    df2 = pd.read_excel(selectFileName1,sheet_name='备案参数')



def zh26():
    data = xlrd.open_workbook(selectFileName1)

    table = data.sheets()[1]
    nrows = table.nrows
    d=dict()
    for i in range(1, nrows):
        d[table.cell_value(i, 0)]=table.cell_value(i, 5)

    data2=xlrd.open_workbook(selectFileName)
    table2=data2.sheets()[0]
    nrows2=table2.nrows
    file = xlwt.Workbook()
    table3 = file.add_sheet('info', cell_overwrite_ok=True)
    rowX=table3.row(0)
    spam = ['参数编号', '参数名称', '原参数申报内容','参数申报内容','状态']
    for i in range(0, 5):
        rowX.write(i, spam[i])
    for i in range(1,nrows2):
        rowX = table3.row(i)
        lp = table2.cell_value(i, 0)

        if not lp is None:

            if d.get(lp)==table2.cell_value(i, 2):
                # print('相同'+lp+str(table2.cell_value(i, 1))+str(table2.cell_value(i, 2)))
                spam = [lp,table2.cell_value(i, 1),table2.cell_value(i, 2),table2.cell_value(i, 2)]
                for t in range(0, 4):
                    rowX.write(t, spam[t])

            else:
                # print('不相同')
                spam = [lp, table2.cell_value(i, 1), table2.cell_value(i, 2), d.get(lp),'参数不同']
                for t in range(0, 5):
                    rowX.write(t, spam[t])


    a = os.path.basename(selectFileName1)  # 带后缀的文件名
    b = a.split('.')[0]  # 不带后缀的文件名

    file.save('./'+b+'.xls')


class LoginScreen():

    root = Tk()
    root.title("参数对比")
    global p

    p = StringVar()
    global f
    f = StringVar()
    b_pwd = Button(root, text='选择数据源', command=upload_files)
    b_pwd.grid(row=1, column=0, sticky=E)

    bt_pwd = Entry(root, textvariable=p)
    bt_pwd.grid(row=1, column=1, sticky=E)

    b_pwd = Button(root, text='选择数据源2', command=upload_files1)
    b_pwd.grid(row=1, column=2, sticky=E)

    bt_pwd = Entry(root, textvariable=f)
    bt_pwd.grid(row=1, column=3, sticky=E)

    bt_pwd = Button(root, text='对比', command=zh26)
    bt_pwd.grid(row=2, column=0, sticky=W)


    root.mainloop()


    # 方法主入口
if __name__ == '__main__':
        # 加启动配置

    LoginScreen()
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:26:58  更:2022-02-26 11:28:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:49:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码