项目介绍:使用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]的分享
— 翀逸言 计算法学