объединение таблиц PDF в одну таблицу Excel с использованием Python

#python #pandas #dataframe #pdf #tabula-py

#python #pandas #фрейм данных #PDF #tabula-py

Вопрос:

Я использую tabula для того, чтобы concat все tables в следующем файле PDF

Чтобы быть одной таблицей в excel формате.

Вот мой код:

 from tabula import read_pdf
import pandas as pd

allin = []
for page in range(1, 115):
    table = read_pdf("goal.pdf", pages=page,
                     pandas_options={'header': None})[0]
    allin.append(table)


new = pd.concat(allin)

new.to_excel("out.xlsx", index=False)
  

Также я попробовал следующее:

 from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf", pages='all', pandas_options={'header': None})

new = pd.concat(table, ignore_index=True)

new.to_excel("out.xlsx", index=False)
  

Текущий результат: проверка

Но проблема, с которой я сталкиваюсь, заключается в том, что со страницы # 91 я начинаю видеть данные, неправильно отформатированные в excel файле.

Я отлаживал страницу по отдельности и не мог понять, почему она неправильно отформатирована, особенно в том же формате.

 from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf", pages='91', pandas_options={'header': None})[0]


print(table)
  

введите описание изображения здесь

Пример:

 from tabula import read_pdf
import pandas as pd

table = read_pdf("goal.pdf", pages='90-91', pandas_options={'header': None})

new = pd.concat(table, ignore_index=True)

new.to_excel("out.xlsx", index=False)
  

Здесь я запустил код для двух страниц 90 и 91.

начиная со строки # 48, вы увидите разницу здесь

Где вы заметите проблему, связанную с тем, что имя и адрес помещены в одну ячейку. А также город и штат, помещенные в один вызов

Комментарии:

1. что означает «данные не отформатированы правильно»? Покажите, что вы получаете и чего ожидаете.

2. Вы проверили вывод, который я упомянул в моем посте, если вы только что запустили код на странице # 90, затем 91, чтобы вы его получили

3. Я проверил страницу по ссылке check , но я не вижу ничего особенного, и я не знаю, что искать, потому что я не знаю, что означает "data not formatted correctly" . И я слишком ленив, чтобы запускать код, чтобы увидеть результат.

4. @furas хорошо, теперь я отредактировал свой вопрос. надеюсь, теперь это лучше получить. поскольку я пытался избежать длинного вопроса 🙂

5. вы имеете в виду, что в некоторых строках у вас есть ["DENTON", "TX"] а в других ["DENTON TX", ""] ? Вы могли бы описать это в вопросе, потому что это не так просто увидеть. Вы можете объединить оба столбца и снова разделить на последний пробел.

Ответ №1:

Я покопался в исходном коде, и в нем есть опция столбцы, и вы можете вручную определить границы столбцов. Когда вы устанавливаете, columns тогда вы должны использовать guess=False .

tabula-py использует программу tabula-java, и в ее документации я обнаружил, что ей нужны значения в процентах или точках (не в пикселях). Итак, я использовал программу inkscape для измерения границ в точках.

введите описание изображения здесь

 from tabula import read_pdf
import pandas as pd

# display all columns in dataframe
pd.set_option('display.width', None)

columns = [210, 350, 420, 450]  # boundaries in points
#columns = ['210,350,420,450']   # boundaries in points

pages =  '90-92'
#pages = [90,91,92]
#pages = list(range(90,93))
#pages = 'all'  # read all pages 

tables = read_pdf("goal.pdf",
                  pages=pages,
                  pandas_options={'header': None},
                  columns=columns,
                  guess=False)

df = pd.concat(tables).reset_index(drop=True)
#df.rename(columns=df.iloc[0], inplace=True)  # convert first row to headers
#df.drop(df.index[0], inplace=True)           # remove first row with headers 

# display

#for x in range(0, len(df), 20):
#    print(df.iloc[x:x 20])
#    print('----------')

print(df.iloc[45:50])

#df.to_csv('output-pdf.csv')

#print(df[ df['State'].str.contains(' ') ])
#print(df[ df.iloc[:,3].str.contains(' ') ])
  

Результат:

                                       0                         1       2   3               4
45                        JARRARD, GARY      930 FORT WORTH DRIVE  DENTON  TX  (940) 565-6548
46                        JARRARD, GARY        2219 COLORADO BLVD  DENTON  TX  (940) 380-1661
47  MASON HARRISON, RATLIFF ENTERPRISES  1815 W. UNIVERSITY DRIVE  DENTON  TX  (940) 387-5431
48  MASON HARRISON, RATLIFF ENTERPRISES          109 N. LOOP #288  DENTON  TX  (940) 484-2904
49  MASON HARRISON, RATLIFF ENTERPRISES      930 FORT WORTH DRIVE  DENTON  TX  (940) 565-6548
  

Редактировать:

Может потребоваться также опция area (также в пунктах) для пропуска заголовков. Или вам придется удалить первую строку на первой странице.

Я не проверял все строки, но могут потребоваться некоторые изменения в границах столбцов.


Редактировать:

Несколько строк создают проблему — вероятно, потому, что текст в City слишком длинный.

 col3 = df.iloc[:,3]

print(df[ col3.str.contains(' ') ])
  

Результат:

                               0                       1                 2         3                 4
1941  UMSTATTD RESTAURANTS, LLC  120 WEST US HIGHWAY 54  EL DORADO SPRING      MS O    (417) 876-5755
2079               SIMONS, GARY         1412 BURLINGTON  NORTH KANSAS CIT      MY O    (816) 421-5941
2763       GRISHAM, ROBERT (RB)   403 WEST COURT STREET    WASHINGTON COU  ORTH HOU  S(E740) 335-7830
2764            STAUFFER, JACOB   403 WEST COURT STREET    WASHINGTON COU  ORTH HOU  S(E740) 335-7830