Laden von Zeilen aus Excel in PyPDF2 scheint falsch

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
thomaspetersen
User
Beiträge: 4
Registriert: Samstag 29. August 2020, 17:51

Hallo
Ich habe ein Excel-Blatt, in dem ich für jede Zeile einige Dropdown-Punkte habe.
Es gibt 3 Dropdown-Menüs / Elemente für jede Zeile.

Wenn ich die Daten über Pandas herunterlade, lade ich die Daten gut (glaube ich).

Wenn ich diese Daten habe, mache ich einige Adressen für sie, damit sie auf einige physische PDF-Dateien verweisen. Dies funktioniert auch.

Aber wenn ich die 3 Punkte / PDF-Dateien markieren muss, geht es schief.

In der ersten Datenzeile wird ein PDF mit drei Seiten erstellt.
Aber dann macht Zeile 2 plötzlich ein 9-seitiges PDF.

Ich kann nicht sehen, was falsch läuft, alle Zeilen haben nur 3 Punkte, die aus einigen Dropdown-Menüs ausgewählt werden. Daher muss jede PDF-Datei auch nur 3 Seiten enthalten, wenn sie über PyPDF2 zusammengeführt werden.

Gibt es hier jemanden, der mir helfen kann?

Code: Alles auswählen

import os             
import datetime        
import pandas as pd    
import PyPDF2 as pdf2    

pdfWriter = pdf2.PdfFileMerger()
my_date = datetime.date.today()     #The date now
week_num = my_date.isocalendar()[1] #0=Year, 1=week

df = pd.read_excel(r'Resources\liste.xlsx', sheet_name='Ark1')
#print(df)

for row in df.itertuples():
    filepdfweek = str(week_num+1) #This week from datetime.date.today + 1 to week = next week
    fileyear = row[1]   #row['Aargang']
    filepdf1 = row[2]  #row['Oevelse1']
    filepath1 = os.path.join('C:/Users/TH/Documents/PDF/' + filepdf1 + '.pdf')
    filepdf2 = row[3]  #row['Oevelse2']
    filepath2 = os.path.join('C:/Users/TH/Documents/PDF/' + filepdf2 + '.pdf')
    filepdf3 = row[4]  #row['Oevelse3']
    filepath3 = os.path.join('C:/Users/TH/Documents/PDF/' + filepdf3 + '.pdf')

    pdfs = [filepath1, filepath2, filepath3]

    for pdf in pdfs:
        pdfWriter.append(open(pdf, 'rb'))

    pdfOutput = open('Uge ' + filepdfweek + ' - ' + fileyear + ' Merged_doc.pdf', 'wb')
    pdfWriter.write(pdfOutput)
    pdfOutput.close()
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen schreibt man komplett klein. Unsinnige Präfixe wie my_ kannst Du gleich weglassen, weil sie keinen Mehrwert bieten. Wenn Du schon ein DatenFrame mit Spaltennamen hast, dann benutze die auch statt der Indizes, dann brauchst Du auch keine Kommentare, was denn der Index bedeutet.
Du benutzt os.path.join falsch, weil Pfade setzt man nicht mit + zusammen. In neuem Code sollte man sowieso pathlib.Path benutzen.
Dateien, die man öffnet, sollte man auch wieder schließen.
Du hast einen PDF-Writer , und hängst immer wieder neue Seiten an; was erwartest Du?

Code: Alles auswählen

import datetime
import pandas as pd
import PyPDF2 as pdf2
from pathlib import path

PDF_PATH = Path('C:/Users/TH/Documents/PDF')
EXCEL_FILENAME = 'Resources/liste.xlsx'

def main():
    today = datetime.date.today()     #The date now
    next_week = today.isocalendar()[1] + 1 #0=Year, 1=week
    resources = pd.read_excel(EXCEL_FILENAME, sheet_name='Ark1')

    for row in resources.itertuples():
        year = row.Aargang
        paths = [
            (PDF_PATH / row.Oevelse1).with_suffix('.pdf'),
            (PDF_PATH / row.Oevelse2).with_suffix('.pdf'),
            (PDF_PATH / row.Oevelse3).with_suffix('.pdf'),
        ]
        pdf_writer = pdf2.PdfFileMerger()
        for path in paths:
            with path.open('rb') as pdf:
                pdf_writer.append(pdf)
        with open(f'Uge {next_week} - {year} Merged_doc.pdf', 'wb') as output:
            pdf_writer.write(output)

if __name__ == '__main__':
    main()
thomaspetersen
User
Beiträge: 4
Registriert: Samstag 29. August 2020, 17:51

Hallo Sirius3

Zunächst vielen Dank für die Anleitung / Klarstellung. Es ist immer schön, solche Rückmeldungen zu erhalten, besonders wenn Python etwas mit der Zeit ist, die man gelesen und gelernt hat.

Kann sehen, ich habe einige der richtigen Gedanken gedacht, aber dann immer noch nicht ...

Ich habe Ihren Vorschlag geprüft und bearbeitet und kann jetzt Folgendes per Debug anzeigen:
- Daten von Excel werden korrekt gelesen.
- "paths" variable, enthält die richtigen Pfade zu meinen PDF-Dateien.
- Die zusammengeführten PDF-Dateien befinden sich auf 3 Seiten, wie sie sein sollten ...

Aber ... Sie sind leer, sie enthalten nichts und wieder enthalten die variablen "paths" die richtigen Dateinamen sowie Orte.

Wenn ich mir die Variable "pdf" ansehe, kann ich sehen, dass in den Pfaden plötzlich von der Verzeichnis-Trennung "\" nach "\\" im Code wechselt:

with path.open('rb') as pdf:

Hoffe du kannst helfen
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dieser Bug scheint schon weit diskutiert zu werden, zumal er schon repariert ist, aber scheinbar nicht im offiziellen Paket.

Code: Alles auswählen

import datetime
import pandas as pd
from PyPDF2 import PdfFileMerger
from pathlib import path

PDF_PATH = Path('C:/Users/TH/Documents/PDF')
EXCEL_FILENAME = 'Resources/liste.xlsx'

def main():
    today = datetime.date.today()
    next_week = today.isocalendar()[1] + 1 #0=Year, 1=week
    resources = pd.read_excel(EXCEL_FILENAME, sheet_name='Ark1')

    for row in resources.itertuples():
        year = row.Aargang
        paths = [
            (PDF_PATH / row.Oevelse1).with_suffix('.pdf'),
            (PDF_PATH / row.Oevelse2).with_suffix('.pdf'),
            (PDF_PATH / row.Oevelse3).with_suffix('.pdf'),
        ]
        pdf_merger = PdfFileMerger()
        for path in paths:
            pdf_merger.append(str(path))
        with open(f'Uge {next_week} - {year} Merged_doc.pdf', 'wb') as output:
            pdf_merger.write(output)
        pdf_merger.close()

if __name__ == '__main__':
    main()
thomaspetersen
User
Beiträge: 4
Registriert: Samstag 29. August 2020, 17:51

WOW
Vielen Dank, Du sind die Besten.
Vielen Dank Sirius3
thomaspetersen
User
Beiträge: 4
Registriert: Samstag 29. August 2020, 17:51

Hallo sirius3

Eine Frage, wie schwierig es sein kann, meine "output" zu einer txt-Datei hinzuzufügen, sowie die Gesamtzahl der zusammengeführten PDF-Dateien zählt.

Das mit "output" https://www.geeksforgeeks.org/reading-w ... es-python/

Aber wie kann ich mit einer Zeile in meiner TXT-Datei abschließen, in der "Gesamtzahl der erstellten PDFs" und dann eine Zahl steht?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du versucht? Was verstehst Du daran konkret nicht?
Antworten