“智能问诊”项目——数据处理(2)

来源:互联网 发布:淘宝无线端首页 编辑:程序博客网 时间:2024/05/01 08:24

这篇博客主要记录项目开发过程中遇到的两个问题


第一个问题是由于之前发现Python直接对数据库进行修改时受网络情况影响大,导致效率低下,所以改用本地Excel进行分词以及数据清洗的操作,这样明显比之前的效率高了不少,但是由于电脑本身的性能限制,仍然有些不理想,但已经比原来好很多了

之前对Excel进行操作主要用到了xlwt模块,这个模块主要功能是向Excel导入数据,而如果要实现本地分词,就要从Excel中读取数据,然后分词后填入另一个表格,这就用到了import xlrd模块

目前还没有更好的方法来追写Excel,在网上搜索到以及之后用到的方法就是使用第三方库xlutils来实现了这个功能,主体思想就是先复制一份Sheet然后再次基础上追加并保存到一份新的Excel文档中去。

Python中一般使用xlrd(excel read)来读取Excel文件,使用xlwt(excel write)来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用xlrd读 取excel是不能对其进行操作的:xlrd.open_workbook()方法返回xlrd.Book类型,是只读的,不能对其进行操作。而 xlwt.Workbook()返回的xlwt.Workbook类型的save(filepath)方法可以保存excel文件。因此对于读取和生成Excel文件都非常容易处理,但是对于已经存在的Excel文件进行修改就比较麻烦了。不过,还有一个xlutils(依赖于xlrd和xlwt)提供复制excel文件内容和修改文件的功能。其实际也只是在xlrd.Book和xlwt.Workbook之间建立了一个管道而已,如下图:


附源码

__author__='XJX'__date__='2017.07.26'# -*- coding: UTF-8 -*-  # How to read from an Excel using xlrd module  import xlrdimport xlwtimport jiebafrom xlutils.copy import copyimport os.path# 打开指定路径中的xls文件  xlsfile = r'/users/xujiaxing/desktop/data.xls'  book = xlrd.open_workbook(xlsfile,formatting_info=True)  # 得到Excel文件的book对象  # 得到sheet对象  sheet0 = book.sheet_by_index(0)     # 通过sheet索引获得sheet对象  sheet_name0 = book.sheet_names()[0]  # 获得指定索引的sheet名字  print (sheet_name0)  sheet0 = book.sheet_by_name(sheet_name0)     # 通过sheet名字来获取,当然如果知道sheet名字就可以直接指定  sheet1 = book.sheet_by_index(1)     # 通过sheet索引获得sheet对象  sheet_name1 = book.sheet_names()[1]  # 获得指定索引的sheet名字  print (sheet_name1)  sheet1 = book.sheet_by_name(sheet_name1)     # 通过sheet名字来获取,当然如果知道sheet名字就可以直接指定  wb = copy(book) sheet = wb.get_sheet(1)# 获得行数和列数  nrows = sheet0.nrows    # 行总数  print(nrows)k = 1for j in range(1nrows):    cell_value = sheet0.cell_value(j, 3)    print(cell_value)    word = list(jieba.cut(cell_value,cut_all=False))#精确模式    for n in word:        sheet.write(k,1,j)        sheet.write(k,2,n)        print(j)        print(n)        k += 1    j += 1    #book.save("/Users/xujiaxing/Desktop/data.xls")    wb.save("/Users/xujiaxing/Desktop/data.xls")
此外,在写入Excel的过程中还遇到了其他的问题,就是当写入行数超过65534时程序会报错,解决方法是无法写入时另起一行或新建一个sheet继续写入



第二个问题是我尝试将Excel数据导入到txt文件时遇到的,打开txt时如果不指定编码格式,像这样

f = open(in_text,'w')
那其默认编码格式为ASCII,这就导致从Excel提取到的UTF-8格式的数据无法写入到txt,会报错说f.write(value)中value应为str格式而不是bite格式,而将value强制转化为str格式后又发现写入的数据出现乱码

最后发现在打开txt时要指定编码格式,即在open函数中增加一个参数

f = open(in_text,'w',encoding='utf8')
这样指定了txt打开时即为UTF-8格式编码,再写入就无需转换value格式了

附源码:

# -*- coding: UTF-8 -*-  __author__='XJX'__date__='2017.07.28'# How to read from an Excel using xlrd module  import xlrdimport xlwtimport osimport codecs# 打开指定路径中的xls文件  xlsfile = r'/users/xujiaxing/desktop/data.xls'  book = xlrd.open_workbook(xlsfile,formatting_info=True)  # 得到Excel文件的book对象  # 得到sheet对象  sheet1 = book.sheet_by_index(1)     # 通过sheet索引获得sheet对象  sheet_name1 = book.sheet_names()[1]  # 获得指定索引的sheet名字  print (sheet_name1)  sheet1 = book.sheet_by_name(sheet_name1)     # 通过sheet名字来获取,当然如果知道sheet名字就可以直接指定  # 获得行数和列数  nrows = sheet1.nrows    # 行总数  print(nrows)in_text = r"/Users/xujiaxing/Downloads/temp.txt"f = open(in_text,'w',encoding='utf8')for j in range(1,nrows):    cell_value = sheet1.cell_value(j, 1)    print( cell_value)    f.write(cell_value+'\n')    j += 1f.close()

阅读全文
0 0
原创粉丝点击