【问题标题】:Writing CSV row values to a PDF using Python使用 Python 将 CSV 行值写入 PDF
【发布时间】:2018-09-11 22:57:24
【问题描述】:

我一直在 Stack Overflow 上使用一些很棒的答案来帮助解决我的问题,但我遇到了障碍。

我要做什么

  1. 从 CSV 行中读取值
  2. 将值从 CSV 写入唯一 PDF
  3. 处理 CSV 文件中的所有行并将每一行写入不同的唯一 PDF

我目前所拥有的

from PyPDF2 import PdfFileWriter, PdfFileReader
import io
import pandas as pd
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

# Read CSV into pandas dataframe and assign columns as variables
csv = '/myfilepath/test.csv'
df = pd.read_csv(csv)
Name = df['First Name'].values + " " + df['Last Name'].values
OrderID = df['Order Number'].values

packet = io.BytesIO()

# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.setFont("Helvetica", 12)
if OrderID is not None:
    can.drawString(80, 655, '#' + str(OrderID)[1:-1])

can.setFont("Helvetica", 16)
if Name is not None:
    can.drawString(315, 630, str(Name)[2:-2]
can.save()

# move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)

# read your existing PDF
existing_pdf = PdfFileReader(open("Unique1.pdf", "rb"))
output = PdfFileWriter()

# add the new pdf to the existing page
page = existing_pdf.getPage(0)
page2 = new_pdf.getPage(0)
page.mergePage(page2)
output.addPage(page)

# finally, write "output" to a real file
outputStream = open("Output.pdf", "wb")
output.write(outputStream)
outputStream.close()

以上代码在以下情况下有效:

  1. 我指定了要写入的 PDF
  2. 我指定输出文件名
  3. CSV 只有 1 行

我需要什么帮助

  1. 一次从 CSV 读取一行值并将它们存储为要写入的变量
  2. 选择一个唯一的 PDF,并写入上面的值,然后保存该文件并选择下一个唯一的 PDF
  3. 循环遍历 CSV 中的所有行并在到达最后一行时结束

附加信息:独特的 PDF 将包含在一个文件夹中,因为它们每个都具有相同的布局但不同的条形码

任何帮助将不胜感激!

【问题讨论】:

  • 你的问题听起来像是一个有很多待办事项的项目。您遇到的具体障碍是什么?
  • 我试图在帖子中概述它们,但我无法弄清楚如何循环遍历 CSV 的每一行(现在是 pandas 数据框)并将内容输出到唯一的 PDF,然后移动到下一行并在下一行使用不同的唯一 PDF,依此类推,直到我用完行。我想我错过了: 1. 在目录中选择第一个唯一的 PDF 并将其设置为输入 PDF 2. 选择 CSV 的第一行并将要写入的内容设置为 PDF 3. 使用不同的输入 PDF 和行循环执行上述 2 个步骤每次\
  • 尝试为项目编写一个带有英文语句的伪代码,检查您如何确定步骤成功的方式,将现有代码组织到伪代码中的步骤,指出具体问题以供审查。请接受您可能正在尝试一项超出您的技能水平的任务,因此如上所述将其拆分为较小的子项目应该会有所帮助。

标签: python csv


【解决方案1】:

我个人建议您重新考虑使用 Pandas 并尝试使用标准 CSV 模块。它将满足您通过文件进行流式处理以进行逐行处理的需求。下面显示的是一些循环通过 CSV 文件的代码,将每一行作为字典,并在 write_pdf 函数中进行处理,以及为每一行获取一个新文件名以将 PDF 写入的逻辑。

import csv
# import the PDF libraries you need

def write_pdf(data, filename):
    name = data['First Name'] + ' ' + data['Last Name']
    order_no = data['Order Number']
    # Leaving PDF writing to you

row_counter = 0
with open('file.csv', 'r') as f:
    reader = csv.DictReader(f)
    for row in reader:
        write_pdf(row, 'Output' + row_counter + '.pdf')
        row_counter += 1

我将把 PDF 留给你,因为我认为你比我更了解你需要什么。

我知道我剪掉了 Pandas 部分,但我认为问题在于它,以及它对于超过 1 行的 CSV 不起作用的原因在于 DataFrame.get 是检索整个列的操作.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2018-06-17
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多