Files
jupyter/文件操作.ipynb
2025-08-13 20:36:47 +08:00

1669 lines
75 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 数字文件名转换为文本文件名"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import os,sys,shutil\n",
"import openpyxl\n",
"import math\n",
"\n",
"fi_xls = os.getcwd()+'/file/北海石化监测花名册2022 .xlsx'\n",
"fi_name = {}\n",
"fi_path = os.getcwd()+'/file/221103'\n",
"old = []\n",
"new = []\n",
"dict1 = {}\n",
"\n",
"wb = openpyxl.load_workbook(fi_xls)\n",
"sheet = wb.active\n",
"depart = []\n",
"for n in range(2,sheet.max_row+1):\n",
" if sheet.cell(n,3).value is not None: \n",
" m_name = sheet.cell(n,6).value.strip()\n",
" m_depart = sheet.cell(n,3).value.strip() \n",
" depart.append(m_depart) \n",
" dict1[int(sheet.cell(n,4).value)] = [m_name,m_depart]\n",
" #print()\n",
"# 创建部门办公室 \n",
"m_path = os.getcwd()+'/file/221103/new'\n",
"for pn in depart:\n",
" if not os.path.exists(m_path + '/' + pn):\n",
" os.mkdir(m_path + '/' + pn)\n",
"#print(dict1)\n",
"\n",
"\n",
"fl=os.listdir(fi_path)\n",
"for fn in fl:\n",
" if os.path.isfile(fi_path + '/' + fn):\n",
" ofn = int(fn.split('.')[0])\n",
" old.append(ofn)\n",
" #print(fn)\n",
"old.sort()\n",
" #print(str(nfn)+'.pdf')\n",
"\n",
"for n in old:\n",
" \n",
" o_name = f'{fi_path}/{n}.pdf'\n",
" n_name = f'{fi_path}/new/{dict1[n][1]}/{str(n).rjust(5,\"0\")}-{dict1[n][0]}.pdf'\n",
" if not os.path.exists(n_name):\n",
" shutil.copyfile(o_name,n_name)\n",
" print(n_name)\n",
"#print(old)\n",
"\n",
"#print(dict1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 目录文件按照文件名排序"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"\n",
"import os,sys\n",
"\n",
"\n",
"fi_xls = 'test1.xlsx'\n",
"fi_name = {}\n",
"#fi_path = 'drive/My Drive/Colab Notebooks'+'/data'\n",
"fi_path = os.getcwd()+'/data'\n",
"old = []\n",
"new = []\n",
"\n",
"fl=os.listdir(fi_path)\n",
"fl.sort()\n",
"n = 0\n",
"for i in fl:\n",
" oldname=fl[n]\n",
" name, suffix = os.path.splitext(oldname)\n",
" if name in old:\n",
" new_name = fi_path+ os.sep + fi_name[name]+suffix\n",
" old_name = fi_path+ os.sep + fl[n]\n",
" os.rename(old_name,new_name)\n",
" n+= 1\n",
"fl"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"## 将pdf文件转为图片"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from pdf2image import convert_from_path, convert_from_bytes\n",
"import os,sys\n",
"import tempfile\n",
"from pdf2image.exceptions import (\n",
" PDFInfoNotInstalledError,\n",
" PDFPageCountError,\n",
" PDFSyntaxError\n",
")\n",
"#images = convert_from_path('1.pdf',dpi=200,fmt='jpg', output_folder='./sample_data')\n",
"with tempfile.TemporaryDirectory() as path:\n",
" images_from_path = convert_from_path('./data/普通高等学校本科专业目录.pdf', dpi=300,fmt='jpg', output_folder='./data/pic')\n",
"print(path)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 新建二维码图片pdf文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from fpdf import FPDF\n",
"import warnings\n",
"\n",
"\n",
"warnings.filterwarnings(\"ignore\")\n",
"pdf = FPDF()\n",
"# compression is not yet supported in py3k version\n",
"pdf.compress = False\n",
"pdf.add_page()\n",
"# Unicode is not yet supported in the py3k version; use windows-1252 standard font\n",
"pdf.add_font('ali-regular', '', r\"fonts/AlibabaPuHuiTi-2-55-Regular.ttf\", uni=True)\n",
"pdf.set_font('ali-regular', '', 14) \n",
"#pdf.ln(10)\n",
"#pdf.write(5, '欢迎')\n",
"pdf.text(20,280,'欢迎来到中国,中国欢迎您!')\n",
"pdf.image(\"data/water/平和体质.png\", 50, 250,20)\n",
"\n",
"pdf.output('py3k.pdf', 'F')"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"## 图像文件夹打包"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import zipfile\n",
"from pdf2image import convert_from_path, convert_from_bytes\n",
"import os,sys\n",
"import tempfile\n",
"import shutil\n",
"import time\n",
"\n",
"from pdf2image.exceptions import (\n",
" PDFInfoNotInstalledError,\n",
" PDFPageCountError,\n",
" PDFSyntaxError\n",
")\n",
"def compress_file(zipfilename, dirname): # zipfilename是压缩包名字,dirname是要打包的目录\n",
" if os.path.isfile(dirname):\n",
" with zipfile.ZipFile(zipfilename, 'w') as z:\n",
" z.write(dirname)\n",
" else:\n",
" with zipfile.ZipFile(zipfilename, 'w') as z:\n",
" for root, dirs, files in os.walk(dirname):\n",
" for single_file in files:\n",
" if single_file != zipfilename:\n",
" filepath = os.path.join(root, single_file)\n",
" z.write(filepath)\n",
"\n",
"def addfile(zipfilename, dirname):\n",
" if os.path.isfile(dirname):\n",
" with zipfile.ZipFile(zipfilename, 'a') as z:\n",
" z.write(dirname)\n",
" else:\n",
" with zipfile.ZipFile(zipfilename, 'a') as z:\n",
" for root, dirs, files in os.walk(dirname):\n",
" for single_file in files:\n",
" if single_file != zipfilename:\n",
" filepath = os.path.join(root, single_file)\n",
" z.write(filepath)\n",
"\n",
"#images = convert_from_path('1.pdf',dpi=200,fmt='jpg', output_folder='./sample_data')\n",
"def make_path(p):\n",
" if os.path.exists(p): # 判断文件夹是否存在\n",
" shutil.rmtree(p) # 删除文件夹\n",
" os.mkdir(p) \n",
"pdf_file = '2.pdf'\n",
"output_folder='./pic1'\n",
"zip_file = 'ribenweiqishihua.zip'\n",
"make_path(output_folder)\n",
"print (time.strftime(\"%a %b %d %H:%M:%S %Y\", time.localtime()))\n",
"with tempfile.TemporaryDirectory() as path:\n",
" images_from_path = convert_from_path(pdf_file, dpi=300,fmt='jpg', output_folder=output_folder)\n",
"compress_file(zip_file, output_folder) # 执行函数\n",
"print (time.strftime(\"%a %b %d %H:%M:%S %Y\", time.localtime()))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from opencc import OpenCC\n",
"\n",
"cc = OpenCC('t2s')\n",
"cc.convert(\"此亦寶力菱成上所不可缺者兹舉其基本變化十\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## PDF文本替换"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import fitz\n",
"doc = fitz.open(\"data/19524.pdf\")\n",
"page = doc.load_page(0)\n",
"# 遍历文本块,找到对应的文本块\n",
"def find_textbox(page:fitz.Page,keyword:str)->dict:\n",
"\tinfo = page.get_text('dict')\n",
"\tfor block in info['blocks']:\n",
"\t\tfor line in block['lines']:\n",
"\t\t\tfor span in line['spans']:\n",
"\t\t\t\ttext = span.get('text','').replace(' ','')\n",
"\t\t\t\tif text == keyword:\n",
"\t\t\t\t\treturn span\n",
"target = find_textbox(page,'北海炼化员工健康提示卡')\n",
"page.add_redact_annot(target['bbox'],'青海炼化员工健康提示卡',fontname='china-s',fontsize=40)\n",
"page.apply_redactions()\n",
"doc.save(\"19524.pdf\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"## 文本文件操作"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 基本读取"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import re\n",
"file_name = 'data/2012.txt'\n",
"with open(file_name,'r') as fl,open('new_2012_1.txt','w') as fl1:\n",
" for l in fl:\n",
" l = re.sub('[\\r\\n\\f ]{1,}', '', l)\n",
" if l.split():\n",
" print(l)\n",
" fl1.write(l)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 读取csv文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import csv\n",
"import re\n",
"\n",
"filename = 'data/130.csv'\n",
"with open(filename,'r',newline='') as csv_file:\n",
" fl = csv.reader(csv_file,delimiter=',')\n",
" header = next(fl) \n",
" for line in fl:\n",
" #line = re.sub('[\\r\\n\\f ]{1,}', '', line)\n",
" print(line)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 读取分隔符分割文件,导入MongoDB"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pymongo\n",
"import re\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"gaokao\"]\n",
"mycol = mydb[\"city\"]\n",
"m_mongo = {}\n",
"m_xx = []\n",
"fl_name = 'china-city-list.txt'\n",
"n = 0\n",
"with open(fl_name,'r') as fl:\n",
" for l in fl:\n",
" n += 1\n",
" if n >6:\n",
" m_mongo = {}\n",
" m_xx = re.sub('[ ]{1,}', '', l).split('|')\n",
" #print(m_xx[1],m_xx[3],m_xx[8],m_xx[10])\n",
" m_mongo['name'] = m_xx[3]\n",
" m_mongo['code'] = m_xx[1]\n",
" m_mongo['sheng'] = m_xx[8]\n",
" m_mongo['shi'] = m_xx[10]\n",
" m_mongo['jing'] = m_xx[11]\n",
" m_mongo['wei'] = m_xx[12]\n",
" mycol.insert_one(m_mongo) \n",
" #print(m_mongo)\n",
"print('ok!')\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 整理文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import re\n",
"file_name = 'file/三国演义.txt'\n",
"list1 = []\n",
"with open(file_name,'r') as fl:\n",
" for l in fl:\n",
" if len(l.strip())>0:\n",
" list1.append(l.strip()+'\\n')\n",
"with open('file/三国演义_new.txt','w') as fl1:\n",
" fl1.writelines(list1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 读取html文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from bs4 import BeautifulSoup\n",
"import re\n",
"from pathlib import Path\n",
"\n",
"def get_html_title(html_file_path):\n",
" with open(html_file_path, 'r', encoding='utf-8') as f:\n",
" html_content = f.read()\n",
" \n",
" soup = BeautifulSoup(html_content, 'html.parser')\n",
" title_tag = soup.title\n",
" \n",
" if title_tag and hasattr(title_tag, 'string'):\n",
" return title_tag.string.strip()\n",
" else:\n",
" return None # 标签不存在或内容为空\n",
"\n",
"\n",
"path = Path('./file/guzi')\n",
"markdown_content = []\n",
"files = [file for file in path.iterdir() if file.is_file()]\n",
"sorted_files = sorted(files, key=lambda f: f.name)\n",
"print(type(sorted_files))\n",
"for file in sorted_files:\n",
" if file.suffix=='.html':\n",
" markdown_content.append('## '+get_html_title(file))\n",
" with open(file, 'r', encoding='utf-8') as f:\n",
" html_content = f.read() \n",
" soup = BeautifulSoup(html_content, 'html.parser')\n",
" div = soup.find('div', class_=\"show-content\")\n",
" p_elements = div.find_all('p') \n",
" for div in p_elements:\n",
" markdown_content.append(div.get_text(strip=True))\n",
" #markdown_content.append('\\n')\n",
" if file.suffix=='.md':\n",
" with open(file, 'r', encoding='utf-8') as f:\n",
" txt_content = f.read()\n",
" lines = txt_content.splitlines()\n",
" for line in lines:\n",
" line = line.strip()\n",
" markdown_content.append(line)\n",
" \n",
"markdown_content = '\\n'.join(markdown_content)\n",
"with open('guzi.md', 'w', encoding='utf-8') as file:\n",
" file.write(markdown_content)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from bs4 import BeautifulSoup\n",
"import re\n",
"from pathlib import Path\n",
"\n",
"\n",
"def get_html_title(html_file_path):\n",
" with open(html_file_path, 'r', encoding='utf-8') as f:\n",
" html_content = f.read()\n",
" \n",
" soup = BeautifulSoup(html_content, 'html.parser')\n",
" title_tag = soup.title\n",
" \n",
" if title_tag and hasattr(title_tag, 'string'):\n",
" return title_tag.string.strip()\n",
" else:\n",
" return None # 标签不存在或内容为空\n",
"\n",
"\n",
"file='file/guzi/1-01.html'\n",
"markdown_content = []\n",
"markdown_content.append('## '+get_html_title(file))\n",
"with open(file, 'r', encoding='utf-8') as f:\n",
" html_content = f.read()\n",
" \n",
" soup = BeautifulSoup(html_content, 'html.parser')\n",
" div = soup.find('div', class_=\"show-content\")\n",
" p_elements = div.find_all('p')\n",
" \n",
" for div in p_elements:\n",
" markdown_content.append(div.get_text(strip=True))\n",
" markdown_content.append('\\n')\n",
"markdown_content = '\\n'.join(markdown_content)\n",
"with open('1-01.md', 'w', encoding='utf-8') as file:\n",
" file.write(markdown_content)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Excel文件修改"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import openpyxl\n",
"import json\n",
"\n",
"filename = 'data/122.json'\n",
"with open(filename,'r') as fl:\n",
" dict1 = json.load(fl)\n",
"dict2 = {}\n",
"for k, v in dict1.items():\n",
" for item in v:\n",
" bh = item['avatar_id']\n",
" dict2[bh] = item\n",
"print(dict2) \n",
" \n",
"wb = openpyxl.load_workbook('data/济南炼化职工分组表.xlsx')\n",
"sheet = wb.active\n",
"person = {}\n",
"for n in range(2, sheet.max_row+1):\n",
" if sheet.cell(n, 14).value is not None and sheet.cell(n, 14).value in dict2.keys():\n",
" code = sheet.cell(n, 14).value\n",
" sheet[f'F{n}']=dict2[code]['birth']\n",
"wb.save('data/济南炼化职工分组表1.xlsx') \n",
"print('ok!') \n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Excel文件内容生成markdown格式文本"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"\n",
"fi_xls = 'data/对局目录.xlsx'\n",
"\n",
"wb = openpyxl.load_workbook(fi_xls)\n",
"sheet = wb['卷18'] \n",
"\n",
"\n",
"for n in range(sheet.max_row - 1,sheet.max_row+1): \n",
" print('## 第'+sheet.cell(n,1).value+'局 ')\n",
" print(sheet.cell(n,2).value+' ')\n",
" print(sheet.cell(n,3).value+' ')\n",
" print('共'+sheet.cell(n,4).value+'着 ')\n",
" if sheet.cell(n,5).value is not None:\n",
" print(sheet.cell(n,5).value+' ')\n",
" print(sheet.cell(n,6).value+' ')\n",
" print('\\n')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"\n",
"fi_xls = 'data/对局目录.xlsx'\n",
"\n",
"wb = openpyxl.load_workbook(fi_xls)\n",
"sheet = wb['卷24'] \n",
"\n",
"\n",
"for n in range(50,562): \n",
" print(sheet.cell(n,1).value+' ')\n",
" if sheet.cell(n,2).value is not None:\n",
" print(sheet.cell(n,2).value+' ')\n",
" if sheet.cell(n,3).value is not None:\n",
" print(sheet.cell(n,3).value+' ')\n",
" print('\\n')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"\n",
"fi_xls = 'data/对局目录.xlsx'\n",
"\n",
"wb = openpyxl.load_workbook(fi_xls)\n",
"sheet = wb['卷22'] \n",
"\n",
"\n",
"for n in range(2,sheet.max_row+1): \n",
" print('## 第'+sheet.cell(n,1).value+'局 ')\n",
" print('第'+sheet.cell(n,2).value+'局 ')\n",
" print('共'+sheet.cell(n,3).value+'着 ')\n",
" print(sheet.cell(n,4).value+' ')\n",
" print(sheet.cell(n,5).value+' ')\n",
" print('\\n')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"\n",
"fi_xls = 'data/对局目录.xlsx'\n",
"\n",
"wb = openpyxl.load_workbook(fi_xls)\n",
"sheet = wb['卷24'] \n",
"\n",
"\n",
"for n in range(50,562): \n",
" #print(sheet.cell(n,1).value+' ')\n",
" if sheet.cell(n,2).value is not None:\n",
" print(sheet.cell(n,1).value+' '+sheet.cell(n,2).value+' '+sheet.cell(n,3).value+'局')\n",
" else:\n",
" print(sheet.cell(n,1).value+' ')\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import openpyxl\n",
"\n",
"fi_xls = 'data/对局目录.xlsx'\n",
"\n",
"wb = openpyxl.load_workbook(fi_xls)\n",
"sheet = wb['Sheet2'] \n",
"\n",
"\n",
"for n in range(2,sheet.max_row+1): \n",
" #print(sheet.cell(n,1).value+' ')\n",
" if sheet.cell(n,2).value is not None:\n",
" print(sheet.cell(n,1).value+' '+sheet.cell(n,2).value)\n",
" else:\n",
" print(sheet.cell(n,1).value+' ')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## YALM文件操作"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### YALM文件读取转存JSON文件"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import yaml\n",
"import json\n",
"\n",
"filename = 'data/全维健康中医体质检测问卷.yaml'\n",
"with open(filename, 'r', encoding='utf-8') as f:\n",
" result = yaml.load(f.read(), Loader=yaml.FullLoader)\n",
"i = 1\n",
"#print(result)\n",
"filename = 'data/全维健康中医体质检测问卷.json'\n",
"with open(filename, 'w') as fl:\n",
" json.dump(result, fl, ensure_ascii=False)\n",
"print('ok')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 按照年龄分组生成心理问卷"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import json\n",
"import os,sys,shutil\n",
"import openpyxl\n",
"\n",
"list1 = [\n",
" [1,'完全不正确','有点正确','多数正确','完全正确'],\n",
" [2,'从不','极少','偶尔','经常','频繁','非常频繁','每天'],\n",
" [3,'不符合','有时符合','常常符合','总是符合'],\n",
" [4,'从不','很少','有时','经常','总是'],\n",
" [5,'非常不满意','不满意','一般','满意','非常满意'],\n",
" [6,'没有或很少时间(少于1天)','一部分时间(1-2天)','相当多时间(3-4天)','绝大部分时间(5-7天)'],\n",
" [7,'从来没有这种感觉','很少有这种感觉','有时有这种感觉','经常有这种感觉'],\n",
" [8,'完全不同意','不同意','同意','完全同意'], \n",
" [10,'晚多了','晚一点','差不多','早一点','早多了']\n",
"]\n",
"dict1 = {}\n",
"for item in list1:\n",
" #dict1.setdefault(item[0],[])\n",
" list2 =[]\n",
" for i in range(1,len(item)):\n",
" list2.append(item[i])\n",
" dict1[item[0]] = list2\n",
"dict_choiced = {}\n",
"print(dict1)\n",
"wj = {}\n",
"wj[\"login\"] = \"phone\"\n",
"wj[\"locale\"] = \"zh-cn\"\n",
"wj[\"title\"] = '社区心理测评问卷'\n",
"list2 =[]\n",
"dict2 = {\n",
" \"type\": \"radiogroup\",\n",
" \"name\": \"Gender\",\n",
" \"title\": {\n",
" \"zh-cn\": \"您的性别\"\n",
" },\n",
" \"isRequired\": True,\n",
" \"choices\": [\n",
" {\n",
" \"value\": \"m\",\n",
" \"text\": \"男性\"\n",
" },\n",
" {\n",
" \"value\": \"f\",\n",
" \"text\": \"女性\"\n",
" }\n",
" ] \n",
"}\n",
"list2.append(dict2)\n",
"dict2 = {}\n",
"dict3 = {}\n",
"dict2 = {\n",
" \"type\": \"radiogroup\",\n",
" \"name\": \"Age\",\n",
" \"title\": {\n",
" \"zh-cn\": \"您的年龄\"\n",
" },\n",
" \"isRequired\": True,\n",
" \"choices\": [\n",
" {\n",
" \"value\": \"Y\",\n",
" \"text\": \"8-17岁\"\n",
" },\n",
" {\n",
" \"value\": \"M\",\n",
" \"text\": \"15-59岁\"\n",
" },\n",
" {\n",
" \"value\": \"O\",\n",
" \"text\": \"60岁及以上\"\n",
" }\n",
" ] \n",
"}\n",
"list2.append(dict2)\n",
"\n",
"wb = openpyxl.load_workbook('data/心理问卷.xlsx')\n",
"sheet = wb.active\n",
"data1 =list(sheet.values)\n",
"del data1[0]\n",
"for item in data1:\n",
" \n",
" dict2 = {} \n",
" dict2['type'] = item[4] \n",
" dict2['name'] = 'q'+str(item[0])+item[3]\n",
" dict2['visibleIf'] = '{Age}=\"'+item[3]+'\"'\n",
" dict3 = {}\n",
" dict3[\"zh-cn\"] = item[1]\n",
" dict2['title'] =dict3 \n",
" dict2['isRequired'] = True\n",
" if item[4] == 'rating':\n",
" dict2['rateMin'] = 0\n",
" dict2['rateMax'] = 7\n",
" dict2['minRateDescription'] = { 'zh-cn':'没有'}\n",
" dict2['maxRateDescription'] = { 'zh-cn':'非常同意'}\n",
" else:\n",
" if int(item[2]) in dict_choiced.keys():\n",
" dict2['choicesFromQuestion'] = dict_choiced[int(item[2])]\n",
" else:\n",
" list3 = []\n",
" i = 1\n",
" for xm in dict1[int(item[2])]:\n",
" dict3 = {}\n",
" dict3 = {'value': i,'text' : xm}\n",
" list3.append(dict3)\n",
" i+=1\n",
" dict2['choices'] = list3\n",
" dict_choiced[int(item[2])] = dict2['name']\n",
" list2.append(dict2)\n",
"dict3 = {}\n",
"dict3[\"elements\"] = list2\n",
"wj[\"pages\"] =[]\n",
"\n",
"wj[\"pages\"].append(dict3)\n",
"#filename = 'data/心理问卷1.json'\n",
"#with open(filename, 'w') as fl:\n",
"# json.dump(wj, fl, ensure_ascii=False)\n",
"#print('ok')\n",
"with open('心理问卷.yml', 'w', encoding='utf-8') as f:\n",
" yaml.dump(data=wj, stream=f, allow_unicode=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import yaml\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 邮件管理"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用网易邮箱群发邮件"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from email.mime.text import MIMEText\n",
"from email.mime.multipart import MIMEMultipart\n",
"from email.mime.application import MIMEApplication\n",
"from email.header import Header\n",
"import smtplib\n",
"import requests\n",
"import time\n",
"import re\n",
"import json\n",
"\n",
"\n",
" \n",
"\n",
"fl_name = 'data/低碳院报告.json'\n",
"\n",
"with open(fl_name,'r') as fl:\n",
" m_xx = json.load(fl)\n",
"for k, v in m_xx.items():\n",
" m_bh = str(k).rjust(5,\"0\")\n",
" fl_name = f'file/220724/new/{m_bh}-{v[0]}.pdf'\n",
" fl = f'{m_bh}-{v[0]}.pdf'\n",
" m_rec = v[2]+'@ceic.com'\n",
" \n",
" from_addr = 'kmingedu@163.com' #发件邮箱\n",
" password = 'GKWUZXMVYKSSUSSL' #邮箱密码\n",
" smtp_server = 'smtp.163.com' #SMTP服务器,以新浪为例\n",
" server = smtplib.SMTP(smtp_server,25) #第二个参数为默认端口为25,有些邮件有特殊端口\n",
" msg = MIMEMultipart()\n",
" msg['Subject'] = Header(\"低碳清洁能源研究院体质监测报告\",'utf-8')\n",
" msg['From'] = Header('北京坤铭体质监测评估中心')\n",
" msg['To'] = Header(m_rec)\n",
"\n",
" from_addr = 'kmingedu@163.com' #发件邮箱\n",
" password = 'GKWUZXMVYKSSUSSL' #邮箱密码\n",
" to_addr = m_rec #收件邮箱\n",
" att1 =MIMEApplication(open(fl_name, 'rb').read())\n",
" #att1[\"Content-Type\"] = 'application/octet-stream'\n",
" # 这里的filename可以任意写,写什么名字,邮件中显示什么名字\n",
" att1.add_header('Content-Disposition','attachment',filename=fl)\n",
" msg.attach(att1)\n",
" try:\n",
" server.login(from_addr,password) #登录邮箱\n",
" server.sendmail(from_addr,to_addr,msg.as_string()) #将msg转化成string发出\n",
" server.quit\n",
" time.sleep(5)\n",
" print(f'{fl}邮件发送成功!')\n",
" except smtplib.SMTPException:\n",
" print (\"Error: 无法发送邮件\")\n",
" \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用网易邮箱群发测试链接"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from email.mime.text import MIMEText\n",
"from email.mime.multipart import MIMEMultipart\n",
"from email.mime.application import MIMEApplication\n",
"from email.header import Header\n",
"import smtplib\n",
"import requests\n",
"import time\n",
"import re\n",
"import json\n",
"import jwt\n",
"\n",
"key = \"Xixi1234\"\n",
"encoded = jwt.encode({\"email\": \"eygsoft@gmail.com\"}, key, algorithm='HS256')\n",
"#print(encoded)\n",
"\n",
"\n",
" \n",
"list1 = [\n",
" {'name':'lillianwong','E_mail':'lillianwong73@gmail.com'},\n",
" {'name':'杨玉冰','E_mail':'lkyyb@126.com'}]\n",
"\n",
"\n",
"for item in list1:\n",
" m_mail = item['E_mail']\n",
" m_name = item['name']\n",
" encoded = jwt.encode({\"email\": m_mail}, key, algorithm='HS256')\n",
" lianjie = f'https://www.forraid.com/survey/token/{encoded}/tcm0'\n",
" mail_msg = f\"\"\"\n",
"<p>欢迎参加北京坤铭体质监测评估中心中医体质检测</p>\n",
"<p><a href=\"{lianjie}\">点击参加测试</a></p>\n",
"\"\"\"\n",
" from_addr = 'kmingedu@163.com' #发件邮箱\n",
" password = 'GKWUZXMVYKSSUSSL' #邮箱密码\n",
" smtp_server = 'smtp.163.com' #SMTP服务器,以新浪为例\n",
" server = smtplib.SMTP(smtp_server,25) #第二个参数为默认端口为25,有些邮件有特殊端口\n",
" msg = MIMEText(mail_msg, 'html', 'utf-8')\n",
" msg['Subject'] = Header(\"中医体质检测测试链接\",'utf-8')\n",
" msg['From'] = Header('北京坤铭体质监测评估中心')\n",
" msg['To'] = Header(m_mail)\n",
"\n",
" \n",
" to_addr = m_mail #收件邮箱\n",
" try:\n",
" server.login(from_addr,password) #登录邮箱\n",
" server.sendmail(from_addr,to_addr,msg.as_string()) #将msg转化成string发出\n",
" server.quit\n",
" time.sleep(5)\n",
" print('邮件发送成功!')\n",
" except smtplib.SMTPException:\n",
" print (\"Error: 无法发送邮件\")\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"try:\n",
" server.login(from_addr,password) #登录邮箱\n",
" server.sendmail(from_addr,to_addr,msg.as_string()) #将msg转化成string发出\n",
" server.quit\n",
" time.sleep(5)\n",
" print(f'{fl}邮件发送成功!')\n",
" except smtplib.SMTPException:\n",
" print (\"Error: 无法发送邮件\")\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"# Twilio使用"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"from twilio.rest import Client\n",
"\n",
"\n",
"# Your Account Sid and Auth Token from twilio.com/console\n",
"# and set the environment variables. See http://twil.io/secure\n",
"account_sid = 'AC1aac8c18078bf371992fda0f924860c8'\n",
"auth_token = '956199d0f1b724d00ef8bb934fcaefe9'\n",
"client = Client(account_sid, auth_token)\n",
"\n",
"message = client.messages \\\n",
" .create(\n",
" body=\"I'm back.\",\n",
" from_='+12056066931',\n",
" to='+8613793180751'\n",
" )\n",
"\n",
"print(message.sid)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import time\n",
"\n",
"localtime = time.localtime(time.time())\n",
"#type(localtime)\n",
"print (\"本地时间为 :\", localtime)\n",
"jyr = '12345'\n",
"if time.strftime(\"%w\", time.localtime()) in jyr:\n",
" print('ok')\n",
"else:\n",
" print('今日不是交易日!')\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from email.mime.text import MIMEText\n",
"from email.header import Header\n",
"import smtplib\n",
"import requests\n",
"import time\n",
"import re\n",
"\n",
"def sendmail(message):\n",
" msg = MIMEText(message,'plain','utf-8')\n",
" msg['Subject'] = Header(\"外汇价格已经到达预期价位!\",'utf-8')\n",
" msg['From'] = Header('512song@sina.com')\n",
" msg['To'] = Header('songyi@yeah.net','utf-8')\n",
"\n",
" from_addr = '512song@sina.com' #发件邮箱\n",
" password = '409fe5d8471da663' #邮箱密码\n",
" to_addr = 'songyi@yeah.net' #收件邮箱\n",
" smtp_server = 'smtp.sina.com' #SMTP服务器,以新浪为例\n",
" server = smtplib.SMTP(smtp_server,25) #第二个参数为默认端口为25,有些邮件有特殊端口\n",
" server.login(from_addr,password) #登录邮箱\n",
" server.sendmail(from_addr,to_addr,msg.as_string()) #将msg转化成string发出\n",
" server.quit() \n",
" \n",
" \n",
"\n",
"pattern = re.compile(r'\\\"(.*)\\\"')\n",
"url = 'http://hq.sinajs.cn/list=USDCAD'\n",
"strhtml = requests.get(url)\n",
"data = strhtml.text\n",
"if pattern.findall(data):\n",
" for data1 in pattern.findall(data):\n",
" data2 = data1.split(',')\n",
"#print(data2)\n",
"with open('price.txt','r') as fl:\n",
" for line in fl:\n",
" p_high = line.split(',')[0]\n",
" p_low = line.split(',')[1]\n",
"m_message = '当前美元加元买入价:{}'.format(data2[1])\n",
"while time.strftime(\"%w\", time.localtime()) in '12345':\n",
" \n",
" print(p_high,p_low)\n",
" time.sleep(10)\n",
" strhtml = requests.get(url)\n",
" data = strhtml.text\n",
" if pattern.findall(data):\n",
" for data1 in pattern.findall(data):\n",
" data2 = data1.split(',')\n",
" if float(data2[1]) > float(p_high):\n",
" m_message = '当前美元加元买入价:{}'.format(data2[1])\n",
" sendmail(m_message)\n",
" p_high = str(float(p_high) + 0.04) \n",
" if float(data2[1]) > float(p_high):\n",
" m_message = '当前美元加元卖出价:{}'.format(data2[2])\n",
" p_low = str(float(p_low) - 0.04)\n",
" sendmail(m_message)\n",
" time.sleep(900)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"toc-hr-collapsed": true,
"toc-nb-collapsed": true
},
"source": [
"# AWS应用"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## AWS获取sns信息"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"\n",
"# Create an SNS client\n",
"sns = boto3.client('sns')\n",
"\n",
"# Call SNS to list topics\n",
"response = sns.list_topics()\n",
"\n",
"# Get a list of all topic ARNs from the response\n",
"topics = [topic['TopicArn'] for topic in response['Topics']]\n",
"\n",
"# Print out the topic list\n",
"print(\"Topic List: %s\" % topics)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## AWS操作DynamoDB"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"\n",
"# Get the service resource.\n",
"dynamodb = boto3.resource('dynamodb')\n",
"\n",
"# Create the DynamoDB table.\n",
"table = dynamodb.create_table(\n",
" TableName='waihui',\n",
" \n",
" AttributeDefinitions=[ \n",
" {\n",
" 'AttributeName': 'code',\n",
" 'AttributeType': 'S'\n",
" }\n",
" \n",
" \n",
" ],\n",
" KeySchema=[\n",
" {\n",
" 'AttributeName': 'code',\n",
" 'KeyType': 'HASH'\n",
" }\n",
" \n",
" ],\n",
" ProvisionedThroughput={\n",
" 'ReadCapacityUnits': 5,\n",
" 'WriteCapacityUnits': 5\n",
" }\n",
" \n",
")\n",
"\n",
"# Wait until the table exists.\n",
"table.meta.client.get_waiter('table_exists').wait(TableName='waihui')\n",
"\n",
"# Print out some data about the table.\n",
"print(table.item_count)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"import decimal\n",
"# Get the service resource.\n",
"dynamodb = boto3.resource('dynamodb')\n",
"\n",
"table = dynamodb.Table('waihui')\n",
"\n",
"table.put_item(\n",
" Item={\n",
" 'code': 'USDCAD',\n",
" 'high': Decimal('1.3200'),\n",
" 'low': Decimal('1.3000'),\n",
" }\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"# Get the service resource.\n",
"dynamodb = boto3.resource('dynamodb')\n",
"\n",
"table = dynamodb.Table('waihui')\n",
"\n",
"response = table.get_item(\n",
" Key={\n",
" 'code': 'USDCAD' \n",
" }\n",
")\n",
"item = response['Item']\n",
"print(item)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"# Get the service resource.\n",
"dynamodb = boto3.resource('dynamodb')\n",
"\n",
"table = dynamodb.Table('waihui')\n",
"\n",
"table.delete_item(\n",
" Key={\n",
" 'code': 'USDCAD' \n",
" }\n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"import decimal\n",
"# Get the service resource.\n",
"dynamodb = boto3.resource('dynamodb')\n",
"\n",
"table = dynamodb.Table('waihui')\n",
"table.update_item(\n",
" Key={\n",
" 'code': 'USDCAD'\n",
" },\n",
" UpdateExpression='SET low = :val1',\n",
" ExpressionAttributeValues={\n",
" ':val1': decimal.Decimal('1.2900')\n",
" }\n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"\n",
"# Create SQS client\n",
"sqs = boto3.client('sqs')\n",
"\n",
"queue_url = 'https://sqs.us-east-1.amazonaws.com/915521803346/MySqs1'\n",
"\n",
"# Receive message from SQS queue\n",
"response = sqs.receive_message(\n",
" QueueUrl=queue_url,\n",
" AttributeNames=[\n",
" 'SentTimestamp'\n",
" ],\n",
" MaxNumberOfMessages=1,\n",
" MessageAttributeNames=[\n",
" 'All'\n",
" ],\n",
" VisibilityTimeout=0,\n",
" WaitTimeSeconds=0\n",
")\n",
"\n",
"message = response['Messages'][0]\n",
"receipt_handle = message['ReceiptHandle']\n",
"\n",
"# Delete received message from queue\n",
"sqs.delete_message(\n",
" QueueUrl=queue_url,\n",
" ReceiptHandle=receipt_handle\n",
")\n",
"print('Received and deleted message: %s' % message)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# MongoDB系统GridFS文件管理"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 文件上传"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import pymongo\n",
"from gridfs import GridFS\n",
"from bson.objectid import ObjectId\n",
"import os\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"gaokao\"]\n",
"mycol = mydb[\"college\"]\n",
"\n",
"UploadCache = \"uploadcache\"\n",
"dbURL = \"mongodb://localhost:27017\"\n",
"\n",
"#上传文件\n",
"def upLoadFile(file_coll,file_name,data_link):\n",
" client = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"\n",
" db = client[\"gaokao\"]\n",
"\n",
" filter_condition = {\"filename\": os.path.basename(file_name), \"url\": data_link}\n",
" gridfs_col = GridFS(db, collection=file_coll)\n",
" file_ = \"0\"\n",
" query = {\"filename\":\"\"}\n",
" query[\"filename\"] = file_name\n",
"\n",
" if gridfs_col.exists(query):\n",
" print('已经存在该文件')\n",
" else:\n",
"\n",
" with open(file_name, 'rb') as file_r:\n",
" file_data = file_r.read()\n",
" file_ = gridfs_col.put(data=file_data, **filter_condition) # 上传到gridfs\n",
"\n",
" print(file_)\n",
"\n",
"\n",
" return file_ \n",
"# 按文件名获取文档\n",
"def downLoadFile(self,file_coll,file_name,out_name,ver):\n",
" client = pymongo.MongoClient(self.dbURL)\n",
"\n",
" db = client[\"store\"]\n",
"\n",
" gridfs_col = GridFS(db, collection=file_coll)\n",
"\n",
" file_data = gridfs_col.get_version(filename=file_name, version=ver).read()\n",
"\n",
" with open(out_name, 'wb') as file_w:\n",
" file_w.write(file_data)\n",
"\n",
"# 按文件_Id获取文档 \n",
"def downLoadFilebyID(self,file_coll,_id,out_name):\n",
" client = pymongo.MongoClient(self.dbURL)\n",
"\n",
" db = client[\"store\"]\n",
"\n",
" gridfs_col = GridFS(db, collection=file_coll)\n",
"\n",
" O_Id = ObjectId(_id)\n",
"\n",
" gf = gridfs_col.get(file_id=O_Id)\n",
" file_data = gf.read()\n",
" with open(out_name, 'wb') as file_w:\n",
"\n",
" file_w.write(file_data) \n",
"\n",
"\n",
" return gf.filename \n",
"m_dir = './data/tmp'\n",
"fls=os.listdir(m_dir)\n",
"n = 0\n",
"for fl in fls:\n",
" #oldname=fl[n]\n",
" name, suffix = os.path.splitext(fl)\n",
" #if name in old:\n",
" # new_name = fi_path+ os.sep + fi_name[name]+suffix\n",
" # old_name = fi_path+ os.sep + fl[n]\n",
" # os.rename(old_name,new_name)\n",
" #print(os.path.basename(fl))\n",
" #print(fl,suffix[1:])\n",
" full_path = m_dir+ '/' + fl\n",
" upLoadFile(\"document\",full_path,\"\")\n",
"#a = MongoGridFS(\"\")\n",
"#a.upLoadFile(\"pdf\",\"MongoGridFS.py\",\"\")\n",
"#a.downLoadFile(\"pdf\",\"MongoGridFS.py\",\"out2.p\",2)\n",
"#ll = a.downLoadFilebyID(\"pdf\",\"5d70a5b283a3c5104cd39346\",\"out3.p\")\n",
"#print (ll)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pymongo\n",
"from gridfs import GridFS\n",
"from bson.objectid import ObjectId\n",
"import os\n",
"\n",
"myclient = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"mydb = myclient[\"gaokao\"]\n",
"mycol = mydb[\"college\"]\n",
"\n",
"UploadCache = \"uploadcache\"\n",
"dbURL = \"mongodb://localhost:27017\"\n",
"\n",
"#上传文件\n",
"def upLoadFile(file_coll,file_name,data_link):\n",
" client = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"\n",
" db = client[\"gaokao\"]\n",
"\n",
" filter_condition = {\"filename\": file_name, \"url\": data_link}\n",
" gridfs_col = GridFS(db, collection=file_coll)\n",
" file_ = \"0\"\n",
" query = {\"filename\":\"\"}\n",
" query[\"filename\"] = file_name\n",
"\n",
" if gridfs_col.exists(query):\n",
" print('已经存在该文件')\n",
" else:\n",
"\n",
" with open(file_name, 'rb') as file_r:\n",
" file_data = file_r.read()\n",
" file_ = gridfs_col.put(data=file_data, **filter_condition) # 上传到gridfs\n",
"\n",
" print(file_)\n",
"\n",
"\n",
" return file_ \n",
"# 按文件名获取文档\n",
"def downLoadFile(self,file_coll,file_name,out_name,ver):\n",
" client = pymongo.MongoClient(self.dbURL)\n",
"\n",
" db = client[\"store\"]\n",
"\n",
" gridfs_col = GridFS(db, collection=file_coll)\n",
"\n",
" file_data = gridfs_col.get_version(filename=file_name, version=ver).read()\n",
"\n",
" with open(out_name, 'wb') as file_w:\n",
" file_w.write(file_data)\n",
"\n",
"# 按文件_Id获取文档 \n",
"def downLoadFilebyID(file_coll,_id,out_name):\n",
" client = pymongo.MongoClient('mongodb://localhost:27017/')\n",
"\n",
" db = client[\"gaokao\"]\n",
"\n",
" gridfs_col = GridFS(db, collection=file_coll)\n",
"\n",
" O_Id = ObjectId(_id)\n",
"\n",
" gf = gridfs_col.get(file_id=O_Id)\n",
" file_data = gf.read()\n",
" with open(out_name, 'wb') as file_w:\n",
"\n",
" file_w.write(file_data) \n",
"\n",
"\n",
" return gf.filename \n",
"ll = downLoadFilebyID(\"pdf\",\"5fbf351b62452a56d7d16603\",\"out3.pdf\")\n",
"print (ll)\n",
"#a = MongoGridFS(\"\")\n",
"#a.upLoadFile(\"pdf\",\"MongoGridFS.py\",\"\")\n",
"#a.downLoadFile(\"pdf\",\"MongoGridFS.py\",\"out2.p\",2)\n",
"#ll = a.downLoadFilebyID(\"pdf\",\"5d70a5b283a3c5104cd39346\",\"out3.pdf\")\n",
"#print (ll)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 腾讯文字识别"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import types\n",
"from tencentcloud.common import credential\n",
"from tencentcloud.common.profile.client_profile import ClientProfile\n",
"from tencentcloud.common.profile.http_profile import HttpProfile\n",
"from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException\n",
"from tencentcloud.ocr.v20181119 import ocr_client, models\n",
"import base64\n",
" \n",
"cred = credential.Credential(\"AKIDoZHHEB2lHbluEZvN8uYHwcdvacqfmDeJ\",\"fEkr2VucwEQXXVN8jCd0CFBxdAe6Xny9\")\n",
"httpProfile = HttpProfile()\n",
"httpProfile.endpoint = \"ocr.tencentcloudapi.com\" \n",
"clientProfile = ClientProfile()\n",
"clientProfile.httpProfile = httpProfile \n",
"client = ocr_client.OcrClient(cred, \"ap-beijing\", clientProfile) \n",
"req = models.GeneralAccurateOCRRequest()\n",
"with open(\"001.jpg\",\"rb\") as f:\n",
" img_data = f.read()\n",
"img_base64 = base64.b64encode(img_data)\n",
"params = {\n",
" \"ImageBase64\": img_base64.decode('utf-8')\n",
"}\n",
"req.from_json_string(json.dumps(params))\n",
"\n",
"# 返回的resp是一个GeneralAccurateOCRResponse的实例,与请求对象对应\n",
"resp = client.GeneralAccurateOCR(req)\n",
"print(resp.to_json_string())\n",
"\n",
"#except TencentCloudSDKException as err:\n",
"# print(err)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pymupdf4llm\n",
"#md_text = pymupdf4llm.to_markdown(\"data/1782596-唐荣.pdf\")\n",
"llama_reader = pymupdf4llm.LlamaMarkdownReader()\n",
"llama_docs = llama_reader.load_data(\"data/1782596-唐荣.pdf\")\n",
"\n",
"print(llama_docs)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pymupdf4llm\n",
"md_text = pymupdf4llm.to_markdown(\"data/1782596-唐荣.pdf\")\n",
"#llama_reader = pymupdf4llm.LlamaMarkdownReader()\n",
"#llama_docs = llama_reader.load_data(\"data/1782596-唐荣.pdf\")\n",
"\n",
"print(md_text)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2025-08-05T04:13:25.191718Z",
"iopub.status.busy": "2025-08-05T04:13:25.191013Z",
"iopub.status.idle": "2025-08-05T04:13:26.589724Z",
"shell.execute_reply": "2025-08-05T04:13:26.589155Z",
"shell.execute_reply.started": "2025-08-05T04:13:25.191654Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[{'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 1}, 'toc_items': [], 'tables': [], 'images': [{'number': 4, 'bbox': Rect(233.94000244140625, 713.0, 375.66998291015625, 854.72998046875), 'transform': (141.72999572753906, 0.0, -0.0, 141.72999572753906, 233.94000244140625, 713.0), 'width': 190, 'height': 190, 'colorspace': 3, 'cs-name': 'DeviceRGB', 'xres': 96, 'yres': 96, 'bpc': 8, 'size': 15730, 'has-mask': False}, {'number': 11, 'bbox': Rect(251.69000244140625, 279.6000061035156, 353.739990234375, 387.32000732421875), 'transform': (102.05000305175781, 0.0, -0.0, 107.72000122070312, 251.69000244140625, 279.6000061035156), 'width': 137, 'height': 145, 'colorspace': 3, 'cs-name': 'DeviceRGB', 'xres': 96, 'yres': 96, 'bpc': 8, 'size': 7001, 'has-mask': False}], 'graphics': [], 'text': '```\\n 医保卡号:\\n\\n 体检号:325031000089\\n 检查类型:在岗期间\\n\\n# **`南京江北医院`** **`职业健康检查表`**\\n\\n```\\n\\n#### `体检编号` `姓 名`\\n\\n\\n#### `325031000089` `唐荣`\\n\\n\\n#### `身 份 证 32011219771117****`\\n\\n\\n#### `用人单位`\\n\\n\\n```\\n南化公司苯化工部\\n\\n```\\n\\n#### `联系电话 13382785142`\\n\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 2}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '## **`职业健康检查表说明`**\\n\\n#### `一、本单位保证职业健康检查的科学性、公正性和准确性。` `二、本单位职业健康检查活动依据国家《职业健康检查管理办法》、《` `职业健康监护技术规范》等规定进行。` `三、本单位《江苏省职业健康检查机构备案回执》的编号:苏卫职检` `备字[2021]BG第016号` `四、本检查表涂改、增删无效,未加盖单位印章无效。` `五、未经本单位同意,不得部分复制本检查表。` `六、用人单位和劳动者应确保一般项目、职业史、接触的职业病危害` `因素、既往病史等项目的真实性。` `七、发现健康损害或者疑似职业病病人时,用人单位应根据本单位的` `主检意见及国家法律法规要求安排复查或医学观察或进行职业病` `诊断。` `八、对检查结果若有异议,可直接向本单位进行咨询。` `地址(Address):南京市化工园区葛关路552号` `邮政编码(Post Coad):210048` `电话(Tel):025-57067000`\\n\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 3}, 'toc_items': [], 'tables': [{'bbox': (57.689998626708984, 206.18099975585938, 562.260009765625, 297.70001220703125), 'rows': 2, 'columns': 6}, {'bbox': (57.689998626708984, 315.7010192871094, 562.260009765625, 367.9800109863281), 'rows': 2, 'columns': 5}], 'images': [], 'graphics': [], 'text': '```\\n 中华人民共和国预防性健康检查用表\\n\\n### **`有害作业人员健康检查表`**\\n\\n```\\n\\n```\\n单位名称:\\n\\n```\\n\\n```\\n南化公司苯化工部\\n\\n```\\n\\n```\\n1977年11月17日\\n\\n```\\n\\n```\\n姓 名: 唐荣 性 别:男\\n\\n```\\n\\n```\\n出生年月:\\n\\n```\\n\\n```\\n国 籍:中华人民共和国\\n\\n```\\n\\n```\\n民 族:汉族 婚 否: /\\n\\n```\\n\\n```\\n0 月 接害工龄:20 年 0 月\\n\\n```\\n\\n```\\n体检日期:\\n\\n```\\n\\n```\\n总 工 龄: 29 年 0 月 接害工龄:\\n\\n```\\n\\n```\\n年 0 月 接害工龄:20 年\\n\\n```\\n\\n```\\n2025年03月10日\\n\\n```\\n\\n```\\n29 0 20\\n\\n```\\n\\n```\\n接触有害因素:\\n\\n```\\n\\n```\\n苯,苯胺,硝基苯,硫酸及三氧化硫,硝酸,氮氧化物,氢氧化钠,氢气\\n\\n```\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n|一、职业史|Col2|Col3|Col4|Col5|Col6|\\n|---|---|---|---|---|---|\\n|`起止日期`|`工作单位`|`部门`|`工种`|` 有害因素种类、`<br>`名称`|`防护措施`|\\n|`2005-03-10-`<br>`至今`|`南化公司苯化工部`|`苯胺作业区`|`有机合成工`|`苯,苯胺,硝基苯,`<br>`硫酸及三氧化硫,`<br>`硝酸,氮氧化物,氢`<br>`氧化钠,氢气`|`口罩,手套,耳塞`|\\n\\n\\n\\n|二、既往病史|Col2|Col3|Col4|Col5|\\n|---|---|---|---|---|\\n|`疾病名称`|`诊断日期`|`诊断单位`|`治疗经过`|`转归`|\\n|`无`|`/`|`/`|`/`|`/`|\\n\\n```\\n三、月经史 初潮: / 岁 经期: / 天 周期: / 天 停经年龄: / 岁\\n\\n 是否经期: /\\n\\n四、生育史 现有子女 / 人、流产 / 次、早产/ 次、死产/ 次、异常胎/ 次\\n\\n五、烟酒史 现在每天吸 10 支/天、共 29 年;\\n\\n 不饮酒 / ml/日、共 / 年。\\n\\n六、其他 无特殊情况\\n\\n七、自觉症状\\n\\n症状 症状 症状 症状\\n\\n目前无不适症状\\n\\n问诊者: 录入日期:2025年03月10日\\n\\n 第1页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 4}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第4页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n八、临床\\n\\n体重视力检查\\n\\n项目 结果 项目 结果\\n\\n身高 173cm 体重 86kg\\n\\n体重指数(BMI) 28.73↑ 裸眼视力左 4.5\\n\\n裸眼视力右 4.5 矫正视力(左) \\n矫正视力(右) \\n检查者: 体检日期:2025年03月10日\\n\\n内科检查\\n\\n项目 结果 项目 结果\\n\\n肺 双肺呼吸音清晰,未闻及干湿性啰音 心律 正常\\n\\n杂音 正常 腹部压痛 正常\\n\\n心率 96次/分 内科其它 \\\\\\n\\n医生: 体检日期:2025年03月10日\\n\\n血压\\n\\n项目 结果 项目 结果\\n\\n收缩压 155mmHg↑ 脉搏 96次/分\\n\\n舒张压 99mmHg↑\\n\\n医生: 体检日期:2025年03月10日\\n\\n耳鼻喉科\\n\\n项目 结果 项目 结果\\n\\n扁桃体 扁桃体Ⅱ度 咽喉 慢性咽炎\\n\\n鼻腔 正常 听力(右) 正常\\n\\n听力(左) 正常 耳疾 无\\n\\n嗅觉 正常\\n\\n医生: 体检日期:2025年03月10日\\n\\n眼科常规检查\\n\\n项目 结果 项目 结果\\n\\n辨色力 正常 眼结膜 正常\\n\\n眼部病变 \\\\\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第2页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 5}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第5页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n医生: 体检日期:2025年03月10日\\n\\n外科检查\\n\\n项目 结果 项目 结果\\n\\n皮肤 未见明显异常 淋巴结 未见明显异常\\n\\n甲状腺 未见明显异常 四肢 未见明显异常\\n\\n脊椎 未见明显异常 腋下 未见明显异常\\n\\n指甲 未见明显异常 骨关节 未见明显异常\\n\\n外科其它 /\\n\\n医生: 体检日期:2025年03月10日\\n\\n口腔检查\\n\\n项目 结果 项目 结果\\n\\n口腔粘膜 正常 唇腭 正常\\n\\n舌体 正常 牙周 正常\\n\\n牙齿 龋齿、残根 口腔科其它 /\\n\\n医生: 体检日期:2025年03月10日\\n\\n神经科\\n\\n项目 结果 项目 结果\\n\\n膝腱反射 正常反射 病理反射 未引出\\n\\n肌力 Ⅴ级 三颤 阴性\\n\\n皮肤划痕症 阴性 跟腱反射 正常反射\\n\\n前庭功能检查 阴性 肌张力 阴性\\n\\n共济运动 未见明显异常 感觉异常 未见明显异常\\n\\n运动功能 未见明显异常\\n\\n医生: 体检日期:2025年03月10日\\n\\n尿常规\\n\\n项目 结果 项目 结果\\n\\n结晶 0.00/μl 尿白细胞脂酶(LEU) 阴性Cell/uL\\n\\n医生: 体检日期:2025年03月10日\\n\\n九、器械类检查\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第3页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 6}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第6页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n彩超\\n\\n项目 结果\\n\\n彩超(双肾) 左肾强光点多个\\n\\n彩超(甲状腺) 甲状腺右叶囊性结节一个,大小约3.0*1.8*2.3毫米,TI-RADS 2类\\n\\n彩超(前列腺) 前列腺大小约44*33毫米,内见部分增强光斑(前列腺稍大伴部分钙化)\\n\\n肝 轻-中度脂肪肝;肝内低回声区一个,大小约10*10毫米,考虑低脂区可能\\n\\n胆囊 未见明显异常\\n\\n胰 未见明显异常\\n\\n脾 未见明显异常\\n\\n```\\n\\n```\\n小结:\\n\\n```\\n\\n```\\n彩超(双肾):左肾强光点多个;彩超(甲状腺):甲状腺右叶囊性结节一个,大小约3.0*1.8*2.3毫米,T\\nI-RADS\\n2类;彩超(前列腺):前列腺大小约44*33毫米,内见部分增强光斑(前列腺稍大伴部分钙化);肝\\n:轻-中度脂肪肝;肝内低回声区一个,大小约10*10毫米,考虑低脂区可能。\\n\\n```\\n\\n```\\n医生: 体检日期:2025年03月10日\\n\\n心电图\\n\\n项目 结果\\n\\n心电图 窦性心律;\\n\\n 小结: 窦性心律\\n\\n医生: 体检日期:2025年03月10日\\n\\n肺功能\\n\\n项目 结果 参考值\\n\\nFVC% 80.1 % ≥80\\n\\nFEV1% 81.7 % ≥70\\n\\nFEV1/FVC% 90.07 % 70-100\\n\\n 小结: 无明显异常\\n\\n检查者: 体检日期:2025年03月10日\\n\\n胸部平扫CT\\n\\n项目 结果\\n\\n胸部平扫CT 胸廓对称,纵隔气管居中。两侧肋骨走行自然,胸壁肌间隙清晰,胸壁软组织形态如常,未\\n 见异常密度影。右肺中叶外侧段(IM35)、左肺上叶前段(IM18、IM20)、左肺上叶下舌段\\n (IM41)见多发实性小结节,较大者位于右肺中叶外侧段(IM35),大小约为5mm×4mm。余\\n 肺未见异常密度影。两侧肺门未见增大。气管、支气管通畅。胸腺区呈脂肪密度影,未见增\\n 宽。两侧肺门及纵隔内未见明显肿大淋巴结影。两侧胸腔未见积液影,两侧胸膜未见增厚。\\n 心脏形态、大小如常,主动脉壁见钙化影。所及肝实质密度稍减低。\\n\\n 小结:\\n\\n医生: 体检日期:2025年03月10日\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第4页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 7}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第7页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n十、化验室项目\\n\\n血常规\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n\\n白细胞计数 7.1 3.5-9.5 10^9/L 红细胞计数 4.70 4.3-5.8 10^12/L\\n\\n血红蛋白 139.00 130-175 g/L 红细胞压积 42.1 40-50 %\\n\\n红细胞平均体积 89.50 82-100 fL 平均血红蛋白量 29.70 27.00-34.00 pg\\n\\n平均血红蛋白浓度 330.00 316-354 g/L 血小板计数 340.00 125-350 10^9/L\\n\\n淋巴细胞百分数 34.40 20-50 % 淋巴细胞绝对值 2.44 1.1-3.2 10^9/L\\n\\n中性粒细胞绝对值 4.11 1.8-6.3 10^9/L 中性粒细胞百分数 57.90 40-75 %\\n\\n血小板比积 0.33↑ 0.11-0.28 % 红细胞分布宽度(SD) 44.10 39-46 fl\\n\\n平均血小板体积 9.80 6.00-14.00 fL 血小板分布宽度 16.40 9.00-18.00 fl\\n\\n单核细胞绝对值 0.38 0.1-0.6 10^9/L 单核细胞百分数 5.40 3.0-10.0 %\\n\\n嗜酸性粒细胞 0.15 0.02-0.52 10^9/L 嗜碱性粒细胞 0.01 0-0.06 10^9/L\\n\\n嗜酸性粒细胞百分数 2.10 0.5-5 % 嗜碱性粒细胞百分数 0.20 0-1 %\\n\\n检验员: 复核员: 报告日期: 2025年03月10日\\n\\n尿常规\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n\\n尿维生素C +3 阴性 mmol/L 尿比重(SG) 1.030↑ 1.003-1.03\\n\\n尿胆原(URO) 正常 正常 umol/L 尿胆红素 阴性 阴性 umol/L\\n\\n尿酮体(KET) 阴性 阴性 mmol/L 尿隐血(BLD) +- 阴性 Cell/ul\\n\\n尿蛋白(PRO) +1 0.03-0.14 g/L 亚硝酸盐 阴性 阴性\\n\\n尿葡萄糖(GLU) 阴性 阴性 mmol/L 尿酸碱度测定 5.00 4.60-8.00\\n\\n微白蛋白 150.00↑ 0.00-20.00 mg/L 尿钙 1.00↓ 2.50-7.50 mmol/L\\n\\n尿肌酐 17.60 2.00-22.00 mmol/L 尿红细胞 2.50 0-10 /μl\\n\\n透明度 透明 清晰透明 鳞状上皮 0.00 0-23 /μl\\n\\n非鳞状上皮细胞 0.00 0-3 /uL 草酸钙结晶 0.00 0-10 /ul\\n\\n颜色 淡黄色 淡黄色 管型 0.00 0-1 /ul\\n\\n透明管型 0.00 0-1 /μl 细菌 0.00 0-33 /ul\\n\\n酵母菌 0.00 0-0 粘液丝 +- 0-118 /ul\\n微量蛋白/肌酐(ACR +1 正常 尿酸结晶 0.00 0-3 /ul\\n)\\n\\n尿白细胞 阴性 阴性 Cell/uL\\n\\n检验员: 复核员: 报告日期: 2025年03月10日\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第5页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 8}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第8页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n生化\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n\\n谷丙转氨酶 24 9-50 U/L 谷草转氨酶 17 15-40 U/L\\n\\n总胆红素 3.1 0-26 μmol/L 总蛋白 80.9 65-85 g/L\\n\\n白蛋白 48.4 40-55 g/L 球蛋白 32.5 20-45 g/L\\n\\nγ-谷氨酰转肽酶 48 10-60 U/L 肌酐 75 57-97 μmol/L\\n\\n尿素氮 5.2 2.76-8.07 mmol/L 尿酸 384.0 202.3-416.5 μmol/L\\n\\n总胆固醇 5.49↑ 0-5.2 mmol/L 甘油三酯 5.32↑ 0-1.7 mmol/L\\n\\n低密度脂蛋白 3.07 0-4.12 mmol/L 高密度脂蛋白 0.88↓ 1-2.0 mmol/L\\n\\n葡萄糖 5.70 3.89-6.1 mmol/L\\n\\n检验员: 复核员: 报告日期: 2025年03月10日\\n\\n甲状腺功能\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n游离三碘甲状腺原氨 5.79 3.1-6.8 pmol/L 游离甲状腺素 14.91 12-22 pmol/L\\n酸\\n\\n促甲状腺激素 4.95↑ 0.27-4.2 uIU/ml\\n\\n检验员: 复核员: 报告日期: 2025年03月10日\\n\\n肿瘤标志物\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n\\n癌胚抗原 3.47 0-4.7 ng/ml 甲胎蛋白 3.60 0-7.0 ng/ml\\n\\n检验员: 复核员: 报告日期: 2025年03月10日\\n\\n糖化血红蛋白(HbAIC)\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n\\n糖化血红蛋白测定(H\\n 6.05↑ 4-6.0 %\\nbAIC)\\n\\n检验员: 复核员: 报告日期: 2025年03月10日\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第6页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 9}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第9页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n幽门螺杆菌抗体\\n\\n项目 结果 参考值 计量单位 项目 结果 参考值 计量单位\\n\\n```\\n\\n```\\n幽门螺杆菌尿素酶抗\\n体检测\\n\\n```\\n\\n```\\n弱阳性(±\\n)\\n\\n```\\n\\n```\\n检验员: 复核员: 报告日期: 2025年03月11日\\n\\n十一、检查结论\\n\\n 检查结果:\\n (1)[体重视力检查]:体重指数偏高:28.73;裸眼视力左:4.5;裸眼视力右:4.5;\\n (2)[血压]:收缩压偏高:155mmHg;舒张压偏高:99mmHg;\\n (3)[耳鼻喉科]:扁桃体:扁桃体Ⅱ度;咽喉:慢性咽炎;\\n (4)[口腔检查]:牙齿:龋齿、残根;\\n (5)[彩超]:彩超(双肾):左肾强光点多个;彩超(甲状腺):甲状腺右叶囊性结节一个,大小约3.0*1.8*2.3\\n 毫米,TI-RADS\\n 2类;彩超(前列腺):前列腺大小约44*33毫米,内见部分增强光斑(前列腺稍大伴部分钙化);肝:轻 中度脂肪肝;肝内低回声区一个,大小约10*10毫米,考虑低脂区可能;\\n (6)[心电图]:窦性心律;\\n (7)[尿常规]:尿隐血(BLD):+-;尿蛋白(PRO):+1;微白蛋白偏高:150.00mg/L;尿钙偏低:1.00mmo\\n l/L;微量蛋白/肌酐(ACR):+1;\\n (8)[生化]:总胆固醇偏高:5.49mmol/L;甘油三酯偏高:5.32mmol/L;高密度脂蛋白偏低:0.88mmol/L;\\n (9)[甲状腺功能]:促甲状腺激素偏高:4.95uIU/ml;\\n (10)[胸部平扫CT]:胸部CT平扫:\\n 1、两肺多发微小结节,建议年度随访复查;\\n 2、主动脉硬化。\\n 附见:轻度脂肪肝;\\n (11)[糖化血红蛋白(HbAIC)]:糖化血红蛋白测定(HbAIC)偏高:6.05%;\\n (12)[幽门螺杆菌抗体]:幽门螺杆菌尿素酶抗体检测:弱阳性(±);\\n 其余所检项目未见明显异常。\\n\\n 主检结论:\\n 本次职业健康检查发现除目标疾病以外的其他疾病或某项指标异常。\\n 建议定期复查。\\n\\n 健康建议:\\n 1、糖化血红蛋白测定(HbAIC)偏高:\\n 糖化血红蛋白是血糖检查最常用的监测指标,能反应近2-3个月的平均血糖水平,因此,也是监测糖尿病血\\n 糖控制水平的指标\\n\\n 2、微白蛋白偏高:150.00:\\n 建议注意休息,多饮水,必要时肾内科就诊\\n\\n 3、尿蛋白(PRO):+1:\\n 尿内出现蛋白称为蛋白尿。引起蛋白尿的原因较多:剧烈运动、发热、寒冷、精神紧张时可出现暂时性蛋\\n 白尿,属于生理性蛋白尿。病理性蛋白尿多由急性肾炎、糖尿病肾病、系统性红斑狼疮、肾小管受炎症或\\n 药物刺激引起,膀胱炎、尿道炎、尿道出血及尿液内混入阴道分泌物也可出现假性蛋白尿。建议您肾内科\\n 专科就诊。\\n\\n 4、甲状腺右叶囊性结节:\\n 建议门诊内分泌科或甲乳外科诊疗。\\n\\n 5、两肺多发微小结节:\\n 建议定期复查\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第7页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 10}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '```\\n 第10页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n 6、促甲状腺激素偏高:\\n 建议内分泌科诊疗。\\n\\n 7、高密度脂蛋白偏低:\\n 当发生HDL降低时,动脉血管壁胆固醇沉积的机会增加,导致血管硬化,诱发冠心病,定期复查。\\n\\n 8、轻-中度脂肪肝:\\n 肝脏脂肪含量高于5%称为脂肪肝,引起脂肪肝的主要原因有:营养失调(营养过量)、饮酒、糖尿病、高\\n 脂血症、中毒和药物等。脂肪肝是可逆性的,合理饮食、运动及治疗后可恢复。\\n 建议:①低脂饮食,少吃动物内脏,多进食蔬菜、水果 ②严格限酒,适当运动\\n ③定期复查彩超及血脂,必要时肝病科诊疗。\\n\\n 9、甘油三酯偏高:\\n 甘油三酯测定是脂类代谢的重要指标之一。采血前2-3天尽可能少食含脂质类的食物,空腹12小时抽血,以\\n 排除和减少饮食的影响。血清甘油三脂水平受年龄、性别和饮食的影响。甘油三酯的增高与冠心病的发生\\n 有着重要的相关性。增高见于家族性高甘油三酯血症、饮食大量甘油三酯和继发于某些疾病如:糖尿病、\\n 甲状腺功能减退、肾病综合征、动脉硬化病等。\\n 建议:低脂饮食,多进食蔬菜、水果,增加体育锻炼;明显增高者,在医师指导下使用降脂药物。心内科门\\n 诊定期复查。\\n\\n 10、总胆固醇偏高:\\n 总胆固醇测定主要反映体内胆固醇的代谢情况,血清胆固醇受遗传、饮食、季节、生活方式、性别、年龄\\n 和环境诸多因素的影响,需多次检测并动态观察。\\n 建议\\n 1.胆固醇增高:见于脂肪肝、肝脏肿瘤、动脉粥样硬化、糖尿病、肾病综合症、甲状腺功能减退、阻塞性\\n 黄疸、原发性高胆固醇血症及高脂血症等。\\n 2.明显增高者,在医师指导下使用降脂药物治疗。\\n 3.低胆固醇饮食,少食动物内脏、蛋黄、蟹黄等食物,定期复查。\\n\\n 11、肝内低回声区:\\n 建议消化内科诊疗\\n\\n 12、体重指数偏高:\\n 体重指数(BMI)--即体重(公斤)除以身高(米)的平方,BMI正常是18.5~24.9。24.9~29.9\\n 视为超重;>30 视为肥胖。\\n 建议:①合理控制饮食量,合理搭配饮食,低盐、低脂和低糖饮食。②长期坚持体育锻炼,坚持自测体重\\n\\n 。\\n\\n 13、收缩压偏高:\\n 建议心血管内科专科诊疗\\n\\n 14、左肾强光点:\\n 建议:①多饮水排尿,多吃新鲜蔬菜水果,少吃油腻辛辣食物,多做下蹲动作。②定期复查彩超。\\n\\n 15、舒张压偏高:\\n 建议心血管内科专科诊疗\\n\\n 16、主动脉硬化:\\n 建议心内科诊疗\\n\\n 17、前列腺稍大:\\n 1.多吃新鲜蔬菜、水果,忌辛辣刺激性食物,忌酒。2.尽可能少骑自行车,忌长时间憋尿。3.保持心情舒\\n 畅,避免过度劳累,适度进行体育活动。建议定期复查彩超。\\n\\n 主检医师(签字):\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第8页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 11}, 'toc_items': [], 'tables': [], 'images': [{'number': 4, 'bbox': Rect(377.6499938964844, 142.2300262451172, 519.3800048828125, 283.96002197265625), 'transform': (141.72999572753906, 0.0, -0.0, 141.72999572753906, 377.6499938964844, 142.2300262451172), 'width': 190, 'height': 190, 'colorspace': 3, 'cs-name': 'DeviceRGB', 'xres': 96, 'yres': 96, 'bpc': 8, 'size': 15730, 'has-mask': False}, {'number': 3, 'bbox': Rect(355.3299865722656, 96.88002014160156, 463.04998779296875, 139.4000244140625), 'transform': (107.72000122070312, 0.0, -0.0, 42.52000045776367, 355.3299865722656, 96.88002014160156), 'width': 145, 'height': 58, 'colorspace': 3, 'cs-name': 'DeviceRGB', 'xres': 96, 'yres': 96, 'bpc': 8, 'size': 6109, 'has-mask': False}], 'graphics': [], 'text': '```\\n 第11页 共12页\\n\\n 姓名: 唐荣 性别: 男 年龄:47 体检编号:325031000089 体检日期: 2025-03-10\\n\\n备注:请仔细阅读体检总检和体检报告!!!\\n\\n 第9页\\n\\n```\\n\\n', 'words': []}, {'metadata': {'format': 'PDF 1.5', 'title': '', 'author': 'FastReport', 'subject': 'FastReport PDF export', 'keywords': '', 'creator': '', 'producer': '', 'creationDate': 'D:20250628093605', 'modDate': 'D:20250628093605', 'trapped': '', 'encryption': None, 'file_path': 'data/1782596-唐荣.pdf', 'page_count': 12, 'page': 12}, 'toc_items': [], 'tables': [], 'images': [], 'graphics': [], 'text': '', 'words': []}]\n"
]
}
],
"source": [
"from pathlib import Path\n",
"import json\n",
"import shutil\n",
"import pymupdf4llm\n",
"#md_text = pymupdf4llm.to_markdown(\"data/1782596-唐荣.pdf\")\n",
"#llama_reader = pymupdf4llm.LlamaMarkdownReader()\n",
"llama_docs = pymupdf4llm.to_markdown(\"data/1782596-唐荣.pdf\",page_chunks=True)\n",
"print(llama_docs)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}