python怎么提取出文件里的指定内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python怎么提取出文件里的指定内容相关的知识,希望对你有一定的参考价值。
python读取文件内容的方法:
一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中:
all_the_text = open('thefile.txt').read( )
# 文本文件中的所有文本
all_the_data = open('abinfile','rb').read( )
# 二进制文件中的所有数据
为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用内存。举个例子,对文本文件读取:
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
不一定要在这里用Try/finally语句,但是用了效果更好,因为它可以保证文件对象被关闭,即使在读取中发生了严重错误。
二.最简单、最快,也最具Python风格的方法是逐行读取文本文件内容,并将读取的数据放置到一个字符串列表中:list_of_all_the_lines = file_object.readlines( )
这样读出的每行文本末尾都带有"\\n"符号;如果你不想这样,还有另一个替代的办法,比如:
list_of_all_the_lines = file_object.read( ).splitlines( )
list_of_all_the_lines = file_object.read( ).split('\\n')
list_of_all_the_lines = [L.rstrip('\\n') for L in file_object]
1、Python
Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。
2、基本概念
Python(KK 英语发音:/'paɪθɑn/, DJ 英语发音:/ˈpaiθən/)是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明。
参考技术A python读取文件内容的方法:一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中:
all_the_text = open('thefile.txt').read( )
# 文本文件中的所有文本
all_the_data = open('abinfile','rb').read( )
# 二进制文件中的所有数据
为了安全起见,最好还是给打开的文件对象指定一个名字,这样在完成操作之后可以迅速关闭文件,防止一些无用的文件对象占用内存。举个例子,对文本文件读取:
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
不一定要在这里用Try/finally语句,但是用了效果更好,因为它可以保证文件对象被关闭,即使在读取中发生了严重错误。
二.最简单、最快,也最具Python风格的方法是逐行读取文本文件内容,并将读取的数据放置到一个字符串列表中:
list_of_all_the_lines = file_object.readlines( )
这样读出的每行文本末尾都带有"\n"符号;如果你不想这样,还有另一个替代的办法,比如:
list_of_all_the_lines = file_object.read( ).splitlines( )
list_of_all_the_lines = file_object.read( ).split('\n')
list_of_all_the_lines = [L.rstrip('\n') for L in file_object]
最简单最快的逐行处理文本文件的方法是,用一个简单的for循环语句:
for line in file_object:
process line
这种方法同样会在每行末尾留下"\n"符号;可以在for循环的主体部分加一句:
lineline = line.rstrip('\n')
或者,你想去除每行的末尾的空白符(不只是'\n'\),常见的办法是:
lineline = line.rstrip( )本回答被提问者采纳
实用脚本!Python 提取 PDF 指定内容生成新文件!
大家好,我是启航。
在之前的「Python办公自动化」案专题中,我们已经介绍了如何有选择的提取某些页面进行合并。
但是很多时候,我们并不会预知希望提取的页号,而是希望将包含指定内容的页面提取合并为新PDF,本文就以两个真实需求为例进行讲解。
01需求描述
数据是一份有286页的上市公司公开年报PDF,大致如下
现在需要利用 Python 完成以下两个需求
“需求一:提取所有包含 战略 二字的页面并合并新PDF
需求二:提取所有包含图片的页面,并分别保存为 PDF 文件
”
02前置知识和逻辑梳理
2.1 PyPDF2
模块实现合并
PyPDF2
导入模块的代码常常是:
from PyPDF2 import PdfFileReader, PdfFileWriter
这里导入了两个方法:
-
PdfFileReader
可以理解为读取器 -
PdfFileWriter
可以理解为写入器
利用 PyPDF2
实现合并运用的一下逻辑:
-
读取器将所有pdf读取一遍
-
读取器将读取的内容交给写入器
-
写入器统一输出到一个新pdf
隐含知识点:读取器只能将读取的内容一页一页交给写入器
2.2 获取与添加页面
之前我们的推文中提到这两个代码,下面列出作为复习:
-
.getPage
获取特定页 -
.addPage
添加特定页
2.3 图片和文字的处理
要实现本文的需求还要做到很重要的一个判断:确定页面中有无包含的文字或图片
判断是否包含特定的文字比较简单,遍历每一页的时候都将包含的文本抽提出,做字符串层面的判断即可,代码思路:
-
利用
pdfplumber
打开PDF 文件 -
获取指定的页,或者遍历每一页
-
利用
.extract_text()
方法提取当前页的文字 -
判断 “战略” 是否在提取的文字中
判断是否包含图片,思路和上面是类似的,但方法不同。图片考虑用正则的方法识别,用 fitz
和 re
配合,具体见下文代码
03代码实现
3.1 需求一的实现
首先来完成需求一的任务,导入需要用到的库:读取写入PDF文件的 PyPDF2
以及抽提文本的 pdfplumber
from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber
指定文件所在的路径,同时初始化写入器,将文件交给读取器:
path = r'C:\\xxxxxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\\公司年报.PDF')
以上下文管理器形式通过 pdfplumber
打开文件,同时用 .getNumPages
获取读取器的最大页利于遍历每一页来抽提文字:
with pdfplumber.open(path + r'\\公司年报.PDF') as pdf:
for i in range(pdf_reader.getNumPages()):
page = pdf.pages[i]
print(page.extract_text())
我们抽提文字的目的是用来判断,将符合要求的页码作为读取器 .getPage
的参数,最后用 .addPage
交给写入器:
with pdfplumber.open(path + r'\\公司年报.PDF') as pdf:
for i in range(pdf_reader.getNumPages()):
page = pdf.pages[i]
print(page.extract_text())
if '战略' in page.extract_text():
pdf_writer.addPage(pdf_reader.getPage(i))
print(i + 1, page.extract_text())
完成识别后让写入器输出为需要的文件名:
with open(path + r'\\new_公司年报.pdf', 'wb') as out:
pdf_writer.write(out)
至此,我们就完成了包含特定文字内容页面的提取,并整合成一个PDF。所有的页面均包含“战略”二字:
需求一完整代码如下,感兴趣的读者可以自行研究
from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber
path = r'C:\\xxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\\公司年报.PDF')
with pdfplumber.open(path + r'\\公司年报.PDF') as pdf:
for i in range(pdf_reader.getNumPages()):
page = pdf.pages[i]
print(page.extract_text())
if '战略' in page.extract_text():
pdf_writer.addPage(pdf_reader.getPage(i))
print(i + 1, page.extract_text())
with open(path + r'\\new_公司年报1.pdf', 'wb') as out:
pdf_writer.write(out)
3.2 需求二的实现
接下来完成需求二的任务。首先导入需要的库:
from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os
指定文件所在的路径:
path = r'C:\\xxxxxx'
正则识别图片的部分不细讲,之前的推文已经介绍过,我们直接看代码:
page_lst = []
checkImg = r"/Subtype(?= */Image)"
pdf = fitz.open(path + r'\\公司年报.PDF')
lenXREF = pdf._getXrefLength()
for i in range(lenXREF):
text = pdf._getXrefString(i)
isImage = re.search(checkImg, text)
if isImage:
page_lst.append(i)
print(page_lst)
获取到所有包含图片的页面后,再结合读取器和写入器的配合就能完成新 PDF 的产生。注意本需求是所有图片单独输出,因此获取到页面后交给写入器直接输出成文件:
pdf_reader = PdfFileReader(path + r'\\公司年报.PDF')
for page in page_lst:
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(path + r'\\公司年报_{}.pdf'.format(page + 1), 'wb') as out:
pdf_writer.write(out)
至此也完成了第二个需求。需要说明的是目前没有非常完美提取PDF图片的方法,本案例介绍的方法识别图片也并不稳定。读者可以利用自己的数据多做尝试。完整代码如下:
from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os
path = r'C:\\xxx'
page_lst = []
checkImg = r"/Subtype(?= */Image)"
pdf = fitz.open(path + r'\\公司年报.PDF')
lenXREF = pdf._getXrefLength()
for i in range(lenXREF):
text = pdf._getXrefString(i)
isImage = re.search(checkImg, text)
if isImage:
page_lst.append(i)
print(page_lst)
pdf_reader = PdfFileReader(path + r'\\公司年报.PDF')
for page in page_lst:
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(page))
with open(path + r'\\公司年报_{}.pdf'.format(page + 1), 'wb') as out:
pdf_writer.write(out)
实现这两个单个需求后,就可以将相关代码封装并结合os等模块实现批量操作,解放双手。
文章到这里就结束了,感谢你的观看
说实在的,每次在后台看到一些读者的回应都觉得很欣慰,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python所有知识点汇总(可以弄清楚Python的所有方向和技术)
*如果你用得到的话可以直接拿走,在我的QQ技术交流群里,可以自助拿走,群号是857113825。*
以上是关于python怎么提取出文件里的指定内容的主要内容,如果未能解决你的问题,请参考以下文章