. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』 » 专题:办公邮件

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 回复
 
主题工具
nh_wzg
 
nh_wzg 的头像
核心会员
 
资 料:
注册日期: Jul 2000
帖子: 3,632 声望值: 3
精华: 5,解答: 10
#1 旧 2021-03-11, 22:18:10 默认 【讨论】python_变量名在循环中的动态命名_docx文档表格_pdf文档表格_提取模块功能
nh_wzg 当前在线  

把Python当作一个顺序脚本运行的工具,在学习中。

对样式例子的语句中,pandas模块,读入一个excel文件的19张表后,进行数据处理的过程的片断。

逐条语句为进行操作的结果,是可以完成整个处理操作,现在在学习改良的操作语句与方式。

表名取名有一定的规格,用循环结构来进行动态命名表示,读入正常。但在其他进一步的与表名相关的变量名,需要动态命名时,不一定能够正常运行。

行28开始的循环是前面行24开始,多行语句,做注释处理后的变更写法,可以正常运行。
行57开始的循环是前面行47开始,多行语句,做注释处理后的变更写法,包含有两处对变量名进行动态变化的处理,可以正常运行。
行60到63的循环是后面行64-79 ,多行语句,想作循环处理的语句,需要对两处变量名进行动态处理,按这个表达式,不能正常运行。

请对Python 有经验的朋友,不吝指点一下。

查个半天找不到相关信息,留下个可能有关联的:

https://stackoverflow.com/questions/...gic-using-exec

Creating dynamically named variables from user input [duplicate]
https://stackoverflow.com/questions/...rom-user-input

Why you don't want to dynamically create variables
https://stupidpythonideas.blogspot.c...ly-create.html

How do I create variable variables?
https://stackoverflow.com/questions/...able-variables
===

python基础(pass占位符、del、exec、eval)
https://blog.csdn.net/jamfiy/article/details/87937605

代码:
##--20210113-0952

a4='e:/天水观邸项目高低压配电工程/天水观邸项目高低压-清单2021.0205.xlsx'
import pandas as pd
f4=pd.ExcelFile(a4)
fs4=f4.sheet_names

## 读入数据
# f400=f4.parse(sheet_name=fs4[0],header=None) #有数据
# ......
# f418=f4.parse(sheet_name=fs4[18],header=None) #

## P02 -B //这个是前面逐条读入19张表的操作,改用循环方式进行读入为DataFram的操作,正常运行
for i in range(19):
    exec("f4%s=f4.parse(sheet_name=fs4[i],header=None)"%i)

## 把各表的columns进行统一
## 0:序号
## 1:名称
## 2:规格
## 3:单位
## 4:数量
## 5:单价
## 6:合计
## 7:备注
## 8:品牌
## 9:时间戳 / 类别?

#原:0,1,2,3,...共有约20列
#新:0,1,2,4,5,6,15,a,b,c #a备注 #b:9时间戳 / 类别? #c:品牌
## 补齐列数
# f402=f402.assign(a=None,b=None,c=None)
# f402=f402[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
# ......
# f417=f417.assign(a=None,b=None,c=None)
# f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
# f418=f418.assign(a=None,b=None,c=None)
# f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同

## P03 -B //这个是前面对19张表内,其中要处理的17张表的columns进行规整处理操作,改用循环方式来操作。

for i in range(18):
    exec("f4%s=f4%d.assign(a=None,b=None,c=None)"%(i,i))

## 下面的无法循环运行  //下面这个语句运行出错,与上面同样的两个参变量方式,下面这个出错。需要请教指点!
# for i in range(18):
#     exec("f4%s=f4%d[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
   
# 上面的循环语句无法正常运行,只能继续逐行运行操作。
f42=f42[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f43=f43[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f44=f44[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f45=f45[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f46=f46[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f47=f47[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f48=f48[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f49=f49[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f410=f410[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f411=f411[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f412=f412[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f413=f413[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f414=f414[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f415=f415[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f416=f416[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2

f418=f418.assign(a=None,b=None,c=None)
f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同
OCR
https://bbs.huaweicloud.com/blogs/197554
https://stackoverflow.com/questions/...ther-programms
https://qa.1r1g.com/sf/ask/1531953531/

此帖于 2021-05-30 01:28:44 被 nh_wzg 编辑. .


平和精确简约应成为精品成员的三大基本要求!!!
nh_wzg
回复时引用此帖
nh_wzg
 
nh_wzg 的头像
核心会员
 
资 料:
注册日期: Jul 2000
帖子: 3,632 声望值: 3
精华: 5,解答: 10
#2 旧 2021-03-12, 15:55:28 默认
nh_wzg 当前在线  

小白,猜着碰巧通过了,仍然有不明白的地方。

1、原来没有在循环语句中使用globals导致无法正常调用的dataframe,在做了全局申明后,是否一直都是全局了?

2、发现在后面其他几个部分的loop + exec语句中,同样类似语句,没有加globals语句,同样已经可以正常运行了。

3、按网络文章提示,测试调试语句通过,但没有查到相应在官方文档中,准确的表达方法》》exec("f4%s=f4%s[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i)),
尤其是在其他部分的loop + exec语句中,最多有3个占位符的情况,也正常通过了。

4、在查loop + exec语句过程中,stackoverflow的大量作者都反对随便使用exec(),如果是在我上面样例的条件下面,不用exec(),有没有更好的编写方式?

代码:
## 下面的无法循环运行 // 增加globals语句,修改占位符%d为%s,语句中有n个占位符,在括号内就要有n个循环变量i列出。
for i in range(18):
    globals
    exec("f4%s=f4%s[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))

5、exec("for key in dic01_%s:\
ff.loc[ff[9].str.contains(key),a0]=dic01_%s[key]"%(i,i))

在jupyter notebook环境下面,可以通过运行。

》这个遇到个没有理解的地方:有几个在dic01_07字典里面的key-value对,无法正常运行,然后把他单独写成语句,在循环外来执行,又是能够正常执行的。
现在也就只能先在循环外以固定写好的语句来完成执行。

此帖于 2021-04-27 08:19:52 被 nh_wzg 编辑. .
回复时引用此帖
aspirer
 
aspirer 的头像
支柱会员
 
资 料:
注册日期: Feb 2011
帖子: 4,972 声望值: 4
精华: 1,解答: 22
#3 旧 2021-03-13, 10:03:24 默认
aspirer 当前离线  

手机无法细看。
但是自从py3.6起
可以直接format的类似这种。最前面的f可大写也可小写。
str1=f"f4{i}=f4{i} …"
回复时引用此帖
aspirer
 
aspirer 的头像
支柱会员
 
资 料:
注册日期: Feb 2011
帖子: 4,972 声望值: 4
精华: 1,解答: 22
#4 旧 2021-03-13, 10:10:01 默认
aspirer 当前离线  

或者不指定sheet name (即为None)直接read_excel一次性读取所有表。

后面在对它做进一步处理。
回复时引用此帖
nh_wzg
 
nh_wzg 的头像
核心会员
 
资 料:
注册日期: Jul 2000
帖子: 3,632 声望值: 3
精华: 5,解答: 10
#5 旧 2021-03-13, 10:27:43 默认
nh_wzg 当前在线  

引用:
作者: aspirer 查看帖子
手机无法细看。
但是自从py3.6起
可以直接format的类似这种。最前面的f可大写也可小写。
str1=f"f4{i}=f4{i} …"
先谢指点,

搜索后,可以参考阅读这个,f-strings

https://realpython.com/python-f-strings/

=== 类似在Word中提取表格并通常化为Dataframe的例子===
[python]读取word文档中的数据,整理成excel表
https://zhuanlan.zhihu.com/p/149413211

python读取docx中的表格形成三元组
https://blog.csdn.net/weixin_4439852...ails/114107029

python读取word 中指定位置的表格及表格数据
https://www.jb51.net/article/172631.htm

用python解析word文件(二):table
https://www.cnblogs.com/anpengapple/p/8372987.html

使用Python读取word文件里的表格信息
http://www.siyuanblog.com/?p=2109

python提取docx文档的信息(文本+表格)
https://blog.csdn.net/weixin_4208138...ails/108235948

===
python_docx 官方文档
https://python-docx.readthedocs.io/e...api/table.html

代码:
pip install python-docx
V0.8.10 在python 3.8.5环境下面import出错

Having problems installing python-docx 》实际是lxml安装版本的兼容性出错导致4.6.1
https://stackoverflow.com/questions/...ng-python-docx

Installing lxml, libxml2, libxslt for Python 3.5 on Windows 10
https://stackoverflow.com/questions/...-on-windows-10

Unofficial Windows Binaries for Python Extension Packages 》找到【lxml】分部,对应本地的python 版本及系统版本进行下载whl文件。
https://www.lfd.uci.edu/~gohlke/pyth...#libxml-python
比如:lxml-4.6.2-cp38-cp38-win32.whl
对应python 3.8.*,32bit Win OS,的lxml模块预编译文件

https://github.com/lxml/lxml

PIP环境安装whl文件的操作:
https://pip.pypa.io/en/latest/user_g...ng-from-wheels
代码:
[py -m ]pip install SomePackage-1.0-py2.py3-none-any.whl
pip install lxml-4.6.2-cp38-cp38-win32.whl
进入python 验证:

import docx
import lxml

不再有出错信息
====

how to create a dataframe from a table in a word document (.docx) file using pandas
https://stackoverflow.com/questions/...file-using-pan

python -docx to extract table from word docx
https://stackoverflow.com/questions/...from-word-docx

python-docx: Parse a table to Panda Dataframe
https://stackoverflow.com/questions/...anda-dataframe

下面代码是官方主页上面提供的样例代码,准备好一个monty-truth2.png文件在python代码目录下,
运行就可生成样例文件:demo.docx

代码:
from docx import Document
from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

document.add_picture('monty-truth2.png', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.add_page_break()

document.save('demo.docx')
下面的代码是对生成的demo.docx文档,提取表格数据的样例代码:

代码:
import pandas as pd
from docx import Document
# from docx.shared import Inches
a4="demo.docx"
document = Document(a4)

## tables=document.tables

## 这个是比较成形的读取docx文档内表格的语句
## 需要安装好python-docx 0.8.10 / lxml 4.6.1/2 模块
## 需要知晓导出的document.tables列表中的第几号表格
## 生成的是pandas dataframe格式数据结果

## for table in document.tables:
## len(document.tables)  #query tables numbers
table=document.tables[0] #提取0号表格的内容
# doctbls=[]
tbllist=[]
rowlist=[]
for i, row in enumerate(table.rows):
    for j, cell in enumerate(row.cells):
        rowlist.append(cell.text)
    tbllist.append(rowlist)
    rowlist=[]
# doctbls=doctbls+tbllist
# finaltables=pd.DataFrame(doctbls)
f5=pd.DataFrame(tbllist)

此帖于 2021-05-25 15:01:21 被 nh_wzg 编辑. .
回复时引用此帖
nh_wzg
 
nh_wzg 的头像
核心会员
 
资 料:
注册日期: Jul 2000
帖子: 3,632 声望值: 3
精华: 5,解答: 10
#6 旧 2021-03-17, 09:13:36 默认
nh_wzg 当前在线  

利用python第三方库提取PDF文件的表格内容 》PDF电子发票
https://www.cnblogs.com/new-june/p/11995496.html

Python骚操作,提取pdf文件中的表格数据!
https://www.jianshu.com/p/40a51aa77b7b

用python提取PDF文件中表格
http://www.360doc.com/content/19/031...21043896.shtml

用python提取PDF文件中表格 -知乎
https://www.zhihu.com/question/39799085

Python使用Tabula提取PDF表格数据 -比较三种库
https://www.cnblogs.com/jinhaolin/p/8268198.html

===
Python解析PDF表格——PDFPlumber vs Camelot
https://www.jianshu.com/p/dbce34122c2b

camelot与Ghostscript的关联:
https://blog.csdn.net/zhou7230/artic...ils/105421565/

关于Ghostscript的安装及报错的处理:
https://github.com/atlanhq/camelot/issues/282

camelot老家:
https://camelot-py.readthedocs.io/en/master/

安装:
代码:
pip install camelot-py[cv]
使用:
代码:
import camelot
tables = camelot.read_pdf('E:/2021-03/配电.pdf',flavor='stream',pages='1')
tables
如果把【,flavor='stream'】去掉,则为默认参数。需要先安装Ghostscript32

把提出后的第2个表格转换为dataframe格式,并显示出来:
代码:
tables[1].df
将Ghostscript的“bin”和“lib”路径都添加到路径中有效

C:\Program Files\gs\gs9.26\bin
C:\Program Files\gs\gs9.26\lib


code sample:
代码:
import pdfplumber
pdf_path="e:/设计与施工说明.pdf"

with pdfplumber.open(pdf_path) as pdf:
    p0 = pdf.pages[0]
    print("pdf名称:%s"%pdf_path)
    contents=p0.extract_text()
    print(contents)

此帖于 2021-04-30 01:17:23 被 nh_wzg 编辑. .
回复时引用此帖
nh_wzg
 
nh_wzg 的头像
核心会员
 
资 料:
注册日期: Jul 2000
帖子: 3,632 声望值: 3
精华: 5,解答: 10
#7 旧 2021-04-16, 11:40:16 默认
nh_wzg 当前在线  

昨天才发现,安装哪个camelot-py,和,pdfplumber,过程里面,把anaconda的基础环境都搞出错了,只能重新安装一次。

这个pdf的表格提取模块,现在还是玩不转。

还有就是附件中的pdf文件这种,体积很小,但在不同的PDF阅读器中(因为对文件内字体的处理方式不同,而导致)的效果不同的pdf文件,想处理成可导出正常的excel文档,有什么方便的途径不?

样例文件,同样是下载后,把【.7Z】后缀删除就是原来PDF文件。

===
》可能的解决工具muPDF的工具:mutool
当前版本:1.18
https://www.mupdf.com/docs/index.html

》搞定了,就是用mutool的convert功能来处理:
代码:
y:\>y:\mupdf-1.18.0-windows\mutool convert -O linearize  -o 工程样例2.pdf  工程样例.pdf
使用参考:
https://blog.csdn.net/Yubu_/article/details/84198971
上传的附件
文件类型: 7z 工程样例.PDF.7z (128.3 KB, 13 次查看)

此帖于 2021-05-25 17:43:17 被 nh_wzg 编辑. .
回复时引用此帖
nh_wzg
 
nh_wzg 的头像
核心会员
 
资 料:
注册日期: Jul 2000
帖子: 3,632 声望值: 3
精华: 5,解答: 10
#8 旧 2021-05-25, 17:31:07 默认
nh_wzg 当前在线  

嘿嘿,菜鸟初飞,大家不要笑,给自己做个脚印。

一般第一次处理表格,一定无法比用excel处理快,但一旦是可以利用上规则与循环,还有条件控制,可能就不太想再用excel.

另外因为pdf文档的普及,由pdf的内容提取表格,也成为一个突出的亮点。当然不是扫描型,这个现在是没有好的办法。
主要是规则库,一旦可以应用了,这个本身就可以进行经验的积累与迭代,非常吸引人。

jupyter notebook 这个工具,与《Think Python》作者倡导的,把程序分成小块,逐步调试与合并的方法完全一致。越早使用,越能体会到这个工具对初入门用户的帮助。

现在下面的处理过程:
1、收集项目对应的pdf/xls/xlsx/docx的表格文件到一个文件夹中。
2、在这个文件夹中生成source文件夹,专门用来供放置需要导入的数据文件用。
3、现在一般使用TC NTLinksMaker / Link Shell Extension 来方便地生成需要进行导入的数据文件的 softlink 到source文件夹中。
4、运行样例语句,把可以导入的表格导入进来,再做细化处理。
5、处理完,输出为一个excel文档进行分发。

表格内字段的内容处理,实际往往是目标数据的提取,也有个讨论贴:https://bbs.et8.net/bbs/showthread.php?t=1391095

代码:
jupyter notebook --no-browser
代码:
## --20210521-1941
## source/目录的读取方式
## 针对pdf/xls/xlsx/docx文件格式进行表格读取

## test_part_00
import os
import re
import numpy as np
import pandas as pd 
from pandas import DataFrame
import camelot
from docx import Document

filepath='E:/2021-05/风机/source/'
filelist=os.listdir(filepath)

## test_part_01
t_pdf=[]
t_xls=[]
t_doc=[]
for i in range(len(filelist)):
    if filelist[i][-3:].lower()=='pdf':
        t=camelot.read_pdf(filepath+filelist[i], pages='1-end')
        t_pdf.append(t)
        
    elif filelist[i][-3:].lower()=='xls' or filelist[i][-4:].lower()=='xlsx':
        s=pd.ExcelFile(filepath+filelist[i])
        ts=s.sheet_names
        df1=[]
        for j in range(len(ts)):
            df1.append(t.parse(sheet_name=ts[j],header=None))
        t_xls.append(df1)
            
    elif filelist[i][-4:].lower()=='docx':
#         pass
        document = Document(filepath+filelist[i])       
        for k in range(len(document.tables)):
            table=document.tables[k]
            doctbls=[]
            tbllist=[]
            rowlist=[]
            for m, row in enumerate(table.rows):
                for n, cell in enumerate(row.cells):
                    rowlist.append(cell.text)
                tbllist.append(rowlist)
                rowlist=[]
            doctbls=doctbls+tbllist
#             finaltables=pd.DataFrame(doctbls)
            t_doc.append(pd.DataFrame(doctbls))
        
    else:
        print('没有适合的数据文件供导入,仅处理pdf/xls/xlsx/docx格式文件!')

## 中间是表格处理

## 输出文档
## 传出excel文件
with pd.ExcelWriter('E:/2021-05/风机/报价文件20210524b.xlsx') as writer:
#     ff.to_excel(writer,sheet_name='ff',index=False)
#     ff1.to_excel(writer,sheet_name='ff1-A1702',index=False)
#     ff2.to_excel(writer,sheet_name='ff2-B07-01',index=False)
#     ff3.to_excel(writer,sheet_name='ff3-B07-01',index=False)
#     ff4.to_excel(writer,sheet_name='ff4-A1702',index=False)
#     ff5.to_excel(writer,sheet_name='ff5-B04-01',index=False)
    ff6.to_excel(writer,sheet_name='ff6-B04-01',index=False)

此帖于 2021-05-25 21:32:51 被 nh_wzg 编辑. .
回复时引用此帖
发表新主题 回复

标签
pdf处理工具, python

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 06:50:32.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号