python PDF處理資料
pdfplumber讀取
PDFPlumber:從PDF文件提取文字和表格的Python庫
用python解析pdf中的文本與表格【pdfplumber的安裝與使用】
pypdf2分割合併
pdfquery文檔查找
Camelot表格讀取
pdfminer\pdfminer3k底層庫(複雜)
對比
Python解析PDF表格——PDFPlumber vs Camelot
Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及對比
附:存儲方式
常見問題
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()