手上有一些.xls、.doc、 .docx以及.wps后缀的格式文件需要解析,知道python-docx和xlrd可以分别读取.doc和.xls,但是.docpython却无法读取,通过上网查找到了textract。下面我对其可行性进行了测试:
textract
这是一个号称可以解析任何形式文件的库,实际上就是利用了特定的库来解析,下面是其可以解析的文件类型,以及其凭借的包:
.csvvia python builtins.docvia antiword.docxvia python-docx2txt.emlvia python builtins.epubvia ebooklib.gifvia tesseract-ocr.jpgand.jpegvia tesseract-ocr.jsonvia python builtins.htmland.htmvia beautifulsoup4.mp3via sox, SpeechRecognition, and pocketsphinx.msgvia msg-extractor.odtvia python builtins.oggvia sox, SpeechRecognition, and pocketsphinx.pdfvia pdftotext (default) or pdfminer.six.pngvia tesseract-ocr.pptxvia python-pptx.psvia ps2text.rtfvia unrtf.tiffand.tifvia tesseract-ocr.txtvia python builtins.wavvia SpeechRecognition and pocketsphinx.xlsxvia xlrd.xlsvia xlrd
使用方式:
pip install textract
1 | import textract |
解析.doc文件时会用到antiword包,但是该工具包早已停更了,目前没有windows64位的,无法使用。
解析.docx:
1 | import textract |
\x编码是将原来的字符串逐个字符进行处理,先将字符转化为ascii值,再将ascii码值转变成十六进制,然后再将0x中的0变成反斜杠\,最后将这些单个的字符拼接在一起。
下面是我写的简单的编码和解码方法:
1 | def decode_x(text): |
然而用上面写的解码的方法来解析textract返回的那一串却并不可行
1 | print(decode_x(r"\xe8\xa1\x8c\xe6\x94\xbf\xe5\xa4\x84\xe7\xbd\x9a\xe4\xbf\xa1\xe6\x81\xaf\xe5\x85\xac\xe7\xa4\xba\xe8\xa1\xa8")) |
这里算个问题,先记下。
后来得知,对于\x编码,python可以直接进行decode得到原来的值
1 | b'\x5f\x63\x68\x61\x6e\x67\x65\x49\x74\x65\x6d\x43\x72\x6f\x73\x73\x4c\x61\x79\x65\x72'.decode() |
其解析.docx文件时直接利用docx2txt提取文件中的所有的文字,缺少可以按照一定格式提取的方法,不利用后续按字段提取(除非就是写正则匹配),到这里基本可以告别这个库了。
python-docx库可以根据word文档中的表格,按单元格来提取。
安装pip install python-docx
1 | from docx import Document |
上述方法只能解析.docx文件,无法解析.doc文件,目前也没有其他的可以直接用的包,只能利用相关工具将.doc文件转为.docx文件,.wps后缀的文件也可以通过这种方式转为.docx文件。
安装:pip install pypiwin32,这个方法会安装pypiwin32,而这个模块就包含了win32com
1 | from win32com import client as wc |
解析xls:
1 | import textract |
尝试了一下,使用textract解析.xls文件也是返回全部的文字,虽然单元格之间有一定的空格或者换行符,但是还要手动去分隔,对于想直接提取所有文字的需求是最简单的,但是对于想格式化数据的需求,就无法满足需求了。
使用xlrd读取excel文件:
1 | import xlrd |
此外,还可以利用pandas和numpy,直接读取excel转换成二维数组
1 | import pandas as pd |
使用xlwt写excel:
1 | import xlwt |
excel时间格式问题
使用xlrd读取excel时,时间格式会被转化为浮点数,可以使用以下方法还原为标准时间格式:
1 | import xlrd |