parsed['content']
没问题,正常显示。但是中文文件名parsed['metadata']['resourceName']
全部显示为字节编码b’\xe6\x96\x87\xe6\xa1\xa301.docx’的形式,该文档实际名字为“文档01.docx"。网上试过很多方法都不行,包括在代码及pycharm中设置编码都没用。import tika
tika.initVM()
from tika import parser
parsed = parser.from_file('./文档01.docx')
print(parsed["metadata"]["resourceName"])
控制台输出入下
C:\pythonProject3\venv\Scripts\python.exe C:\pythonProject3\tika-python\cn.py
b'\xe6\x96\x87\xe6\xa1\xa301.docx'
Process finished with exit code 0
中文被编成了字节码,\xe6\x96\x87\xe6\xa1\xa3部分代表了"文档"两个字(实际上还是utf8编码被转成了字节码的形式),字节码又是以字符串的形式储存在parsed[“metadata”][“resourceName”]字段中,字符串没办法直接调用decode来进行解码的。
resourceName实际存储内容应该是一个字符串,内容为“b’\xe6\x96\x87\xe6\xa1\xa301.docx’”。
所以调用系统eval函数将字符串重新转为字节码,再调用decode进行解码,即可打印出中文文件名。
更改后的代码如下;
import tika
tika.initVM()
from tika import parser
parsed = parser.from_file('./文档01.docx')
filename = parsed["metadata"]["resourceName"]
filename = eval(filename).decode("utf-8")
print(filename)
控制台输出中文文件名:
C:\pythonProject3\venv\Scripts\python.exe C:\pythonProject3\tika-python\cn.py
文档01.docx
Process finished with exit code 0
总结:我们都知道,Python中的eval()函数是一个内置函数,其作用是将字符串作为代码来执行,并返回代码执行的结果。具体而言,eval()函数将传入的字符串参数解析为一个表达式,并返回表达式的结果。
例如,假设有一个字符串变量my_string,其值为"3 + 4",那么可以使用eval()函数将该字符串作为一个表达式来执行,如下所示:
my_string = “3+4”
result = eval(my_string)
print(result)
这将输出7,即表达式3 + 4的结果。
而在这部分中eval的作用在于将字符串中的字节码提取出来,然后进行解码。如果没有eval,“b’\xe6\x96\x87\xe6\xa1\xa301.docx’”被当作一个普通字符串处理,就无法完成解码。