Я пытаюсь прочитать многостраничный файл PDF, который содержит таблицу в той же области каждой страницы. Количество страниц может меняться в зависимости от читаемого файла.

Я пытаюсь код ниже, но он не работает:

import tabula
df = tabula.read_pdf("dados/nota.pdf", guess=False, stream=True, pages='all', encoding="utf-8", area=(238.00, 32.00, 400.00, 563.00))

Возвращает ошибку:

ParserError                               Traceback (most recent call last)
~\Anaconda3\envs\alura_pandas\lib\site-packages\tabula\wrapper.py in read_pdf(input_path, output_format, encoding, java_options, pandas_options, multiple_tables, **kwargs)
    171         try:
--> 172             return pd.read_csv(io.BytesIO(output), **pandas_options)
    173 

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision)
    708 
--> 709         return _read(filepath_or_buffer, kwds)
    710 

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    454     try:
--> 455         data = parser.read(nrows)
    456     finally:

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1068 
-> 1069         ret = self._engine.read(nrows)
   1070 

~\Anaconda3\envs\alura_pandas\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1838         try:
-> 1839             data = self._reader.read(nrows)
   1840         except StopIteration:

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._tokenize_rows()

pandas/_libs/parsers.pyx in pandas._libs.parsers.raise_parser_error()

ParserError: Error tokenizing data. C error: Expected 12 fields in line 13, saw 13


During handling of the above exception, another exception occurred:

CSVParseError                             Traceback (most recent call last)
<ipython-input-3-f2350ca5dd21> in <module>
----> 1 df = tabula.read_pdf("dados/nota.pdf", guess=False, stream=True, pages='all', encoding="utf-8", area=(238.00, 32.00, 400.00, 563.00))

~\Anaconda3\envs\alura_pandas\lib\site-packages\tabula\wrapper.py in read_pdf(input_path, output_format, encoding, java_options, pandas_options, multiple_tables, **kwargs)
    179             )
    180 
--> 181             raise CSVParseError(message, e)
    182 
    183 

CSVParseError: Error failed to create DataFrame with different column tables.
Try to set `multiple_tables=True`or set `names` option for `pandas_options`. 
, caused by ParserError('Error tokenizing data. C error: Expected 12 fields in line 13, saw 13\n',)

В read_pdf, если я изменю pages = 'all' на pages = 1, pages = 2 и т. Д., Это работает, но мне нужно указать, что все страницы должны быть прочитаны, и это число может меняться в зависимости от файла.

Кто-нибудь знает об этом?

Изменить: мне удалось прочитать таблицы, вставив параметр multiple_tables = True. Код сейчас такой:

df = tabula.read_pdf("dados/nota.pdf", guess=False, stream=True, multiple_tables=True, pages='all', encoding="utf-8", area=(238.00, 32.00, 400.00, 563.00))

Получаю такой результат:

[     0           1    2             3      4                        5   \
 0     Q  Negociação  C/V  Tipo mercado  Prazo  Especificação do título   
 1   NaN   1-BOVESPA    C         VISTA    NaN              ITAUSAPN N1   
 2   NaN   1-BOVESPA    C         VISTA    NaN       LOCAMERICAON EB NM   
 3   NaN   1-BOVESPA    C         VISTA    NaN       LOCAMERICAON EB NM   
 4   NaN   1-BOVESPA    C         VISTA    NaN            PETRORIOON NM   
 5   NaN   1-BOVESPA    C         VISTA    NaN            PETRORIOON NM   
 6   NaN   1-BOVESPA    C         VISTA    NaN                 SCHULZPN   
 7   NaN   1-BOVESPA    C         VISTA    NaN                 SCHULZPN   
 8   NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 9   NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 10  NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 11  NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   

           6           7    8               9                        10   11  
 0   Obs. (*)  Quantidade  NaN  Preço / Ajuste  Valor Operação / Ajuste  D/C  
 1        NaN         NaN  800           13,84                11.072,00    D  
 2        NaN         NaN  300           17,01                 5.103,00    D  
 3        NaN         NaN  200           17,01                 3.402,00    D  
 4        NaN         NaN  500           18,01                 9.005,00    D  
 5        NaN         NaN  100           18,01                 1.801,00    D  
 6        NaN         NaN  500            8,79                 4.395,00    D  
 7        NaN         NaN  700            8,78                 6.146,00    D  
 8        NaN         NaN  300            7,87                 2.361,00    D  
 9        NaN         NaN  300            7,87                 2.361,00    D  
 10       NaN         NaN  300            7,87                 2.361,00    D  
 11       NaN         NaN  200            7,87                 1.574,00    D  ,
      0           1    2             3      4                        5   \
 0     Q  Negociação  C/V  Tipo mercado  Prazo  Especificação do título   
 1   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 2   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 3   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 4   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 5   NaN   1-BOVESPA    V         VISTA    NaN          LOCAMERICAON NM   
 6   NaN   1-BOVESPA    V         VISTA    NaN            PETRORIOON NM   
 7   NaN   1-BOVESPA    C         VISTA    NaN           VULCABRASON NM   
 8   NaN   1-BOVESPA    V         VISTA    NaN           VULCABRASON NM   
 9   NaN   1-BOVESPA    V         VISTA    NaN           VULCABRASON NM   
 10  NaN   1-BOVESPA    V         VISTA    NaN           VULCABRASON NM   

           6           7   8               9                        10  11   12  
 0   Obs. (*)  Quantidade NaN  Preço / Ajuste  Valor Operação / Ajuste NaN  D/C  
 1        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 2        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 3        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 4        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 5        NaN         100 NaN           17,20                 1.720,00 NaN    C  
 6        NaN         600 NaN           18,60                11.160,00 NaN    C  
 7          D       1.100 NaN            7,75                 8.525,00 NaN    D  
 8          D         100 NaN            7,86                   786,00 NaN    C  
 9          D         100 NaN            7,86                   786,00 NaN    C  
 10         D         900 NaN            7,86                 7.074,00 NaN    C  ]

Как мне превратить это в DataFrame?

0
andrefcarreiro 10 Ноя 2019 в 17:28

2 ответа

Результат с несколькими таблицами возвращает список DataFrame по исторической причине.

0
chezou 22 Ноя 2019 в 18:10

Вы можете преобразовать в фрейм данных следующим образом:

import pandas as pd
dataframe = pd.DataFrame(data)
0
q21311 19 Ноя 2019 в 18:31