Python PDF讀取&處理

python PDF處理資料

如何使用Python玩轉PDF各種騷操作?

在Python中使用PDF:閱讀和拆分

pdfplumber讀取

pdf文本和表格處理——pdfplumb

PDFPlumber:從PDF文件提取文字和表格的Python庫

python讀取pdf文件

使用pdfplumber讀取PDF

用python 將PDF中的表格轉化爲Excel

用python解析pdf中的文本與表格【pdfplumber的安裝與使用】

pypdf2分割合併

Python:使用pypdf2合併、分割

自定義函數:分割PDF文件函數

手把手教你用Python分割與合併PDF

pdfquery文檔查找

pdfquery, 一種快速友好的PDF

Camelot表格讀取

github

python庫Camelot從pdf抽取表格數據

Camelot:從pdf中提取表格數據

pdfminer\pdfminer3k底層庫(複雜)

python讀取pdf中的文本

Python讀取PDF文檔(或TXT)

Python_讀取PDF文件內容

深入學習python解析並讀取PDF文件內容的方法

python 提取pdf文件中的信息

對比

Python解析PDF表格——PDFPlumber vs Camelot

Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及對比

附:存儲方式

pd.DataFrame()函數解析(最清晰的解釋)

python寫入csv文件的幾種方法

pandas用法總結

常見問題

Python csv生成文件 純數字文本格式,會生成科學計數

  • 在代碼端將這個字段分離出來,改變成字符串,並加上" \t" 就可以解決這個問題

實例

import pdfplumber
import os
from tqdm import tqdm
import pandas as pd

columnsTitle = ['股票代碼', '年份', '經營情況討論與分析', '開始頁', '終止頁', '總字數', '總句子數']
sentence_signs = ['。', '!', '?', '!', '?']
pd.DataFrame(columns=columnsTitle).to_csv("text.csv", index=False)

def walkFile(root):
	dirs = os.listdir(root)
	return dirs

def csvWriter(dataForm):
	dataframe = pd.DataFrame(dataForm, columns = columnsTitle)
	dataframe.to_csv("text.csv", mode='a', index=False, header=False, sep=',')

# 每一頁正文範圍
def pageContentRange(pageText):
	firstEnter = pageText.find('\n')  # 第一個\n
	# 查找page開始位置
	if pageText.find("年度報告", 0, firstEnter) or pageText.find("經營情況討論與分析", 0, firstEnter):
		pageStartIndex = firstEnter+1

	# 查找頁碼位置
	numberIndex = pageText.rfind('\n', -20)
	return pageStartIndex, numberIndex

# 文件名處理
def extractSocksYear(file):
	fileName = (file.split('.')[0]).split('_',1)
	fileName = list(map(str, fileName))
	# print(fileName)
	try:
		sockName = fileName[0]+'\t'
		year = fileName[1][:4]
		# print(sockName, " ", year)
		# input()
		return sockName, year
	except:
		print(file, "文件名不合規範!")
	

def getTotalSentenceWords(pageContent):
	totalWords = 0
	totalSentence = 0
	for sign in sentence_signs:
			totalSentence += pageContent.count(sign)

	totalWords = len(pageContent)
	return totalSentence, totalWords

def readFile(path):
	# pdf: 第一節:27
	with pdfplumber.open(path) as pdf:
		# print(len(pdf.pages))
		# print((pdf.pages[17].extract_text())[-10:-5], "***")
		# print(pdf.pages[17].extract_words())
		
		pos1 = 0
		pos2 = 0
		flag = 0
		pageContent = ""
		
		for page in pdf.pages:
			# print("-------第[%d]頁-------" % page.page_number)
			# print(page.extract_text())
			
			pageNumber = page.page_number
			pageText = page.extract_text()

			if not pageText:
				continue

			pageStartIndex, numberIndex = pageContentRange(pageText)

			textStr = pageText[:80]
			#for character in :
			#	textStr += character['text']

			# print(textStr,"****")
			pageStart = textStr.find("經營情況討論與分析")
			if flag == 0 and pageStart != -1:
				# print(textStr)
				pos1 = pageNumber
				firstPageStart = pageStart+9
				flag = 1
			elif flag == 1 and textStr.find("重要事項") != -1:
				pos2 = pageNumber
				break

			if flag:
				if pageText:
					if pageNumber == pos1:
						pageStartIndex = firstPageStart
					if pageStartIndex < numberIndex:
						pageContent += pageText[pageStartIndex:numberIndex]
						# print(pageStartIndex, "*********", pageText[pageStartIndex:numberIndex])
	# print(pos1," ",pos2)
	return pos1, pos2, pageContent

def cnt_func(root):
	files = walkFile(root)
	
	fileLen = len(files)

	fileStart = 0
	fileEnd = 50

	while fileStart < fileLen:
		if fileEnd > fileLen:
			fileEnd = fileLen

		dataForm = []
		for file in tqdm(files[fileStart:fileEnd]):
			path = os.path.join(root, file)
			# print(path)

			pos1, pos2, pageContent = readFile(path)
			
				
			totalSentence, totalWords = getTotalSentenceWords(pageContent)

			sockName,year = extractSocksYear(file)

			dataForm.append([sockName, year, pageContent, pos1, pos2-1, totalWords, totalSentence])
			# print(dataForm)


		# print(dataForm)
		csvWriter(dataForm)
		# first_page = pdf.pages[1]
		# print(first_page.chars[-2])
		# print(first_page.chars[27])
		fileStart = fileEnd
		fileEnd += 50


def main():
	root = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'pdf')
	cnt_func(root)
	

if __name__ == '__main__':
	main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章