python-Excel自动化|xlutils.copy库的使用 写入已有工作表

项目介绍:使用python将txt中的数据写入Excel表格

项目来源:表格转文字、格式化的字符串OCR之后不兼容表格格式,意在写简单的方法实现txt数据读取、txt数据导入Excel文件。能够应用于数据库的建立、简洁的数据库操作。

作者:[-1][2]

项目构成

一、txt文件中文本的读取和处理

A.函数:读取txt文本,按行存储为元数据list,返回包含txt所有行的list列表

B. 将元数据list转换为dict

二、写入Excel文件

C.python操作Excel的基础配置

D.函数:从列表嵌套字典中,根据给定的key依次输出所有values到数组value_list中

E.函数:遍历数组,将value根据名称写入指定列,默认从第2格开始写

项目讲解

最近在图书馆待得比较多,碰到了许多需要处理的字段,另一方面,之前也对图书馆和信息管理系统相关学科比较感兴趣。今天查找资源的时候发现要把检索结果导出整理非常费时间,希望能就这个方面进行改善。

1.对数据来源的分析

在图书馆的手机端页面进行资源检索,得到的数据无法导出;电脑端的操作也比较繁琐,所以在这里选择“截图+OCR”的方式获取数据源,并存储在txt文件中。经过简单的整理,得到分行的文本数据。

 

将数据存储到数组中,利用list的分片方法去除换行符"\n",返回数组对象。

#第一部分 读取txt,转换为字典
#-----------------------------------
#A 函数:读取txt文本,按行存储为list,返回包含txt所有行的list列表
def read_txt(txt_fileName):
    metadata=[] #元数据
    with open(txt_fileName,'r') as f:
        lines = f.readlines() #按行读取
        for line in lines: 
            find_rowMark = line.find('\n') 
            #print('换行符的位置为'+str(find_rowMark))
            metadata.append(line[0:find_rowMark]) #利用str分片,去除换行符\n
        print('从txt中读取的元数据metadata共有'+str(len(metadata))+'行文本。\n')
        #print(metadata)#将txt存入数组metadata
    return metadata

metadata = read_txt('图书数据导入.txt') #返回包含txt所有行的list列表

 

2.对数据格式进行进一步转换

因为考虑到后续会用到列数和字段名称,读取表头并存入对应的list数组。

#B 将list转换为dict
metalist=[]
for i in range(0,len(metadata)-1,6):
    #print('正在创建第'+str(i+1)+'个对象,读取metadata的位置在'+str(i))
    metakeys =[ '书名','作者','索书号','出版时间','出版社']
    metavalues = metadata[i:i+4]
    meta = dict(zip(metakeys,metavalues))
    #print(meta)
    metalist.append(meta)
print(metalist[0])
print('元数据列表中metalist中共有'+str(len(metalist))+'个meta字典对象。')

运行结果: 

 

这里补充一下,需要录入的表格已经制作了,字段比较完整,大概有13个左右,但是录入的数只有5个字段,就是这里的[ '书名','作者','索书号','出版时间','出版社']。

 

3.对python读写Excel文件作基本的配置

python读写Excel文件用到的数据库主要是xlrd和xlwt,仅支持.xls文件。

除此之外,xlwt写入数据通常只能利用workbook()方法新建表格。

为写入已有表格,此处使用xlutils.copy模块对原有数据进行复制,实现“修改”已有表格的效果。

#第二部分 将dict中的值写入Excel中的对应位置
#----------------------------------------
#C python操作Excel的基础配置
import xlrd
import xlwt
#注:只支持xls格式; .py和.xls可都存储在桌面上
#读取'你的文件名.xls',存为xl
xls_fileName = 'mulevel.xls'
sheetName = 'Sheet2'
xl=xlrd.open_workbook(xls_fileName)
mysheet = xl.sheet_by_name(sheetName)

#读取行数nrows,列数ncols
nrows = mysheet.nrows
ncols = mysheet.ncols
print()
print(xls_fileName+'的'+sheetName+'中共有',str(nrows),'行,',str(ncols),'列。')
print(sheetName+'表格的字段为:')
#value_titles={}
value_titles=[]
for i in range(0,ncols-1):
    #输出表头 第X列:标题
    #value_titles['第'+str(i)+'列']=mysheet.cell_value(0,i)
    value_titles.append(mysheet.cell_value(0,i))
print(value_titles)

运行结果: 

value_titles对象存储了表头字段,能够简化之后的写入步骤。

 

4.利用xlutils.copy模块定义简单的写入方法

xlutils.copy模块的基本方法是复制和写入,最后保存。方法定义如下:

#函数:从列表嵌套字典中,根据给定的key依次输出所有values到数组value_list中

#函数:从列表嵌套字典中,根据给定的key依次输出所有values到数组value_list中
def lead_out_values(metalist,value_title):
    value_list=[]
    for i in range(0,len(metalist)-1):
        value = metalist[i][value_title]
        value_list.append(value)
    #print(value_list)
    return value_list
    
book_names = lead_out_values(metalist,"书名")
author_names = lead_out_values(metalist,"作者")
book_indexes = lead_out_values(metalist,"索书号")
pubulish_time= lead_out_values(metalist,"出版时间")

#函数:遍历数组,将value根据名称写入指定列,默认从第2格开始写 

print(value_titles)

#函数:遍历数组,将value根据名称写入指定列,默认从第2格开始写
def lead_in_cols(content_list,target_col,started_row = 1):
    
    import xlutils.copy #可以写入已有文件,不必新建
    xls_fileName = 'mulevel.xls'
    rb = xlrd.open_workbook(xls_fileName,formatting_info=True)
    # 参数说明: formatting_info=True 保留原excel格式
    rs = rb.sheet_by_index(0) 
    wb = xlutils.copy.copy(rb) #复制,意思是使用xlutils.copy中的copy方法
    sheet = wb.get_sheet(0) #读取第一个工作表

    
    #根据target_col查询列数x
    x = value_titles.index(target_col)
    y = started_row
    #从content_list中取元素
    for i in range(0,len(content_list)):
        content = content_list[i]
        sheet.write(y,x,content) #在(x,y)位置修改数据为value
        y+=1
    x=1
    y=1
    wb.save(xls_fileName)

#target_col="作者" #在表格的第6列,从格5开始
lead_in_cols(author_names,'作者') 
lead_in_cols(book_names,'专著/翻译著作名称') 
lead_in_cols(book_indexes,'索书号') 
lead_in_cols(pubulish_time,'年份') 

最终效果: (格式美化后)

总结: 

1.获取数据,以txt形式保存

2.读取txt数据,存入数组

3.建立表格,编写写入数据的方法

4.调用方法,写入数据并保存

项目源码:

#将txt中的数据写入Excel表格

链接: https://pan.baidu.com/s/1QtIyQQKe1mGCwbo4uxwqVg 提取码: bpd6 
--来自作者 [-1][2]的分享

— 翀逸言 计算法学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值