手上有一些.xls
、.doc
、 .docx
以及.wps
后缀的格式文件需要解析,知道python-docx
和xlrd
可以分别读取.doc
和.xls
,但是.doc
python却无法读取,通过上网查找到了textract
。下面我对其可行性进行了测试:
textract
这是一个号称可以解析任何形式文件的库,实际上就是利用了特定的库来解析,下面是其可以解析的文件类型,以及其凭借的包:
.csv
via python builtins.doc
via antiword.docx
via python-docx2txt.eml
via python builtins.epub
via ebooklib.gif
via tesseract-ocr.jpg
and.jpeg
via tesseract-ocr.json
via python builtins.html
and.htm
via beautifulsoup4.mp3
via sox, SpeechRecognition, and pocketsphinx.msg
via msg-extractor.odt
via python builtins.ogg
via sox, SpeechRecognition, and pocketsphinx.pdf
via pdftotext (default) or pdfminer.six.png
via tesseract-ocr.pptx
via python-pptx.ps
via ps2text.rtf
via unrtf.tiff
and.tif
via tesseract-ocr.txt
via python builtins.wav
via SpeechRecognition and pocketsphinx.xlsx
via xlrd.xls
via 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 |