Здесь я начал раздумывать о том, как сделать парсер pdf и попробовал осмыслить последовательность обработки папки с pdf файлами. Собрал сюда фрагманты работающего кода с os.listdir(path) subprocess.Popen(...) pdftotext , потом фильтры для трех таблиц (код фильтров надо переделать, не учел что в названии может быть несколько слов), потом великие открытия с sys.path.append(...) и прехватом сообщений дебаггера из консоли прямо в notebook...
Сначала я пытался решить общую задачу: спроектировать класс модуля парсера. Но по неопытности завяз в мелочах. Потом открыл Ninja и тупо навтыкал в класс подпрограммы из этих фрагментов. Но о результатах потом, здесь проверка работы фрагментов.
0. Код для организации цикла по именам файлов внутри папки [Фрагменты кода с os.listdir(path) и итерации по файлам в папке]()
# Задаем путь к папке с файлами
path = r'C:\abc\def\ghi' # remove the trailing '\'
Все файлы из папки считываем в список os.listdir(path) к каждому файлу добавляем слева полный путь. А потом открываем файл и весь его загоняем в элемент словаря с ключом = имени файла в папке.
import os
data = {}
for dir_entry in os.listdir(path):
dir_entry_path = os.path.join(path, dir_entry)
if os.path.isfile(dir_entry_path):
with open(dir_entry_path, 'r') as my_file:
data[dir_entry] = my_file.read()
- CMD команда для преобразования pdf to text
!dir C:\Program Files\Xpdf\bin64\pdftotext.exe
!dir C:\Users\kiss\Documents\Xpdf\aebru_2014_all
Вот такой должна быть команда для конвертера
pdftotext [options] [PDF-file [text-file]]
!"C:\Program Files\Xpdf\bin64\pdftotext.exe" -table C:\Users\kiss\Documents\Xpdf\aebru_2014_all\eng_car-sales-in-april-2014.pdf C:\Users\kiss\Documents\Xpdf\aebru_2014_all_txt\eng_car-sales-in-april-2014.txt
!chcp 65001
import subprocess
pdftotext=r'"C:\Program Files\Xpdf\bin64\pdftotext.exe" -table C:\Users\kiss\Documents\Xpdf\aebru_2014_all\eng_car-sales-in-april-2014.pdf C:\Users\kiss\Documents\Xpdf\aebru_2014_all_txt\eng_car-sales-in-april-2014.txt'
help('print')
#r'C:\Users\kiss\Documents\Xpdf\aebru_2014_all_txt\eng_car-sales-in-april-2014.txt.
myProcess = subprocess.Popen(
pdftotext,
shell=True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
out, error = myProcess.communicate()
out, error
pdftostdout=r'"C:\Program Files\Xpdf\bin64\pdftotext.exe" -table C:\Users\kiss\Documents\Xpdf\aebru_2014_all\eng_car-sales-in-april-2014.pdf stdout'
myProcess = subprocess.Popen(
pdftostdout,
shell=True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
out, error = myProcess.communicate()
out, error
2. Код для парсинга трех таблиц []()
Если у нас есть текстовый файл, в котором из строк исходной таблицы были сконвертированы строки текста с разделителями-мы пробелами, то эти тестовые строки уже можно парсит, используя для фильтров такие признаки, как количество "слов" в строке, наличие особых симсолов или слов на определенном месте.
# Первая - самые продаваемые марки (25 строк)
#Lada 151527 159490 -5% 44100 50102 -12%
#Renault* 67208 57217 17% 19178 17914 7%
#
with open('C:\\Users\\kiss\\Documents\\Xpdf\\AEB_2014_4.txt') as f1:
for line in f1:
if len(line.split())== 7: # number of columns
if line.split()[6].find('%') != -1: # last column like 7% (include '%')
if line.split()[0] != 'Total': # Filter out first row with column names
print ' '.join(line.split()) # Delimiter of columns is Spase, convert list to string
# Вторая - суммарные продажи по фирмам (25 строк)
#NISSAN 30,9 31,1 266169 274285 -3% 29,3 30,2 71977 80630 -12%
#AVTOVAZ 17,6 18,1 151527 159490 -5% 18,0 18,8 44100 50102 -12%
#
with open('C:\\Users\\kiss\\Documents\\Xpdf\\AEB_2014_4.txt') as f2:
for line in f2:
if len(line.split())== 11:
if line.split()[10].find('%') != -1:
if line.split()[3].isalnum():
print ' '.join(line.split())
list3=[] # We can write resuls to list of lists, instead of list of strings
#Третья должна состоять из 25 строк вида:
#1 Granta Lada 52765 26674 98% 15596 9798 59%
#2 Solaris Hyundai 35941 38051 -6% 10553 10979 -4%
#
with open('C:\\Users\\kiss\\Documents\\Xpdf\\AEB_2014_4.txt') as f3:
for line in f3:
if len(line.split())== 9:
if line.split()[8].find('%') != -1:
if line.split()[0].isalnum():
print ' '.join(line.split())
l3.append(line.split()) # To form list of lists
3. Как записать таблицы в файлы - есть в концеКак вырезать таблицы из текстового файла, который получился после pdftotext¶
out = open('C:\\Users\\kiss\\Documents\\Xpdf\\AEB_2014_4_tab3.csv', 'w')
for row in l3:
for column in row:
out.write('"%s",' % column)
out.write('\n')
out.close()
# First two rows
"1","Granta","Lada","52765","26674","98%","15596","9798","59%",
"2","Solaris","Hyundai","35941","38051","-6%","10553","10979","-4%",
import os
os.path
import sys
sys.path
sys.path.append('C:\\Users\\kiss\\SkyDrive\\Docs\\pdftotext\\AEB\\pdgtotext')
sys.path
!dir C:\Users\kiss\SkyDrive\Docs\pdftotext\AEB\pdgtotext
import aebto3tables
aebto3tables.OPTIONS
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий