ubuntuusers.de

Python Batch Fehler: "IndexError: list index out of range"

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.10 (Quantal Quetzal)
Antworten |

stefanotis

Anmeldungsdatum:
12. März 2012

Beiträge: 26

Liebe Leute ☺

Ich versuche mich seit einigen Tagen daran, ein selbst erstelltes PDF-Formular mit Textfeldern per Batch mehrfach ausfüllen und speichern zu lassen. Das PDF habe ich selbst erstellt, die Formnamen sind mir also bekannt. Ich bin auf folgenden Thread aufmerksam geworden, der genau mein Problem angeht:

http://stackoverflow.com/questions/10476265/batch-fill-pdf-forms-from-python-or-bash?lq=1

Der Autor beschreibt, dass mit Hilfe von Python, sowie den Paketen -pdftk und dem Python-Paket -fdfgen sein Batch-Script genau das tut, was ich will: Daten aus einer CSV auslesen und diese mehrfach in die PDF Form eintragen und abspeichern.

Ich habe also eine CSV erstellt, in der ersten Zeile die namen der jeweiligen Formnamen eingetragen und in der jeweils zweiten und dritten Zeile die einzutragenden Daten gespeichert.

PDF Formular und CSV liegen, sowie das Programm erwartet, als "NVC.pdf" und "NVC.csv" vor und auch der "output" Ordner ist vorhanden.

Leider bekomme ich bei ausführen des kleinen "fill.py" Batches folgende Fehlermeldung:

1
2
3
4
Traceback (most recent call last):
  File "fill.py", line 43, in <module>
    print('{0} {1} created...'.format(filename_prefix, i[1][1]))
IndexError: list index out of range

Hier ist der gesamte Coder der ausgeführten "fill.py"

import csv
from fdfgen import forge_fdf
import os
import sys

sys.path.insert(0, os.getcwd())
filename_prefix = "NVC"
csv_file = "NVC.csv"
pdf_file = "NVC.pdf"
tmp_file = "tmp.fdf"
output_folder = './output/'

def process_csv(file):
    headers = []
    data =  []
    csv_data = csv.reader(open(file))
    for i, row in enumerate(csv_data):
      if i == 0:
        headers = row
        continue;
      field = []
      for i in range(len(headers)):
        field.append((headers[i], row[i]))
      data.append(field)
    return data

def form_fill(fields):
  fdf = forge_fdf("",fields,[],[],[])
  fdf_file = open(tmp_file,"w")
  fdf_file.write(fdf)
  fdf_file.close()
  output_file = '{0}{1} {2}.pdf'.format(output_folder, filename_prefix, fields[1][1])
  cmd = 'pdftk "{0}" fill_form "{1}" output "{2}" dont_ask'.format(pdf_file, tmp_file, output_file)
  os.system(cmd)
  os.remove(tmp_file)

data = process_csv(csv_file)
print('Generating Forms:')
print('-----------------------')
for i in data:
  if i[0][1] == 'Yes':
    continue
  print('{0} {1} created...'.format(filename_prefix, i[1][1]))
  form_fill(i)

Ich habe mittler Weile bereits herausgefunden, dass dieser Fehler scheinbar auftritt, wenn eine Funktion auf ein Element einer Liste zugreift, das nicht vorhanden ist. Allerdings kenne ich mich nur sehr rudimentär mit Programmiersprachen aus, in Python leider gar nicht. Ich finde einfach nicht heraus, woran es liegt...

Ich wäre sehr dankbar für Untertsützung ☺

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Na, es gibt eben nur einen Eintrag in der äußeren Liste!

Mal mit Kommentaren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for i in data:
  # aha, data ist ein Iterable
  if i[0][1] == 'Yes':
    # es gibt also *ein* Element i[0], welches mindestens *zwei* Untereinträge hat
    continue
  # hier fliegt er raus, weil i[1] entweder nicht existiert oder i[1] nur *ein*
  # Element hat. Der zweite Indexzugriff geht ja wieder auf das *zweite*
  # Element der Liste.
  print('{0} {1} created...'.format(filename_prefix, i[1][1]))
  form_fill(i)

Ich demonstriere das mal in einer Python-Shell:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

data = [["foo", "bar"]]

data[0][1]
> 'bar'

data[1][1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
C:\Dokumente und Einstellungen\nelson\Eigene Dateien\<ipython-input-3-d5bdcbfc14
b1> in <module>()
----> 1 data[1][1]

IndexError: list index out of range

data = [["foo", "bar"], [42]]

data[1][0]
> 42

data[1][1]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
C:\Dokumente und Einstellungen\nelson\Eigene Dateien\<ipython-input-6-d5bdcbfc14
b1> in <module>()
----> 1 data[1][1]

IndexError: list index out of range

Wie Du siehst kann man ohne die Kenntnisse, was in i steht nicht genau sagen, wieso es knallt. Dann bliebe noch herauszufinden, wieso in i offenbar etwas falsches steht.

Du könntest einfach mal ein print(data) vor der Schleife einbauen, besser noch ein pprint(data) und ganz oben from pprint import pprint und das hier posten. Evtl. kommst Du dann ja auch schon selber drauf.

Das ganze ist übrigens ziemlich grausam vom Code her. Ist das für Python 2.x oder 3.x?

Antworten |