走子目录,把图片转成pdf然后合并pdf
Walking subdirectories, converting images into pdf and then merging the pdf
我在一个父文件夹中有一系列文件夹。每个文件夹都有几张 .jpg 格式的图像,名称按递增顺序排列 (00.jpg、01.jpg...)。
我想将每个图像转换成同名的 pdf,然后将每个子文件夹的所有 pdf 合并到位于父文件夹中的单个 pdf,并以其 pdf 所在的子文件夹命名。
例如,父文件夹./Random sketches 有子目录001 landscapes sketches 到099 urban sketches。所以我想转换每个子文件夹中的图像,然后将名为 001 landscapes 的 pdf 合并为 099 urban sketches。
我可以将图像转换为 pdf,但我无法使用循环合并它们,即使当我在单个子文件夹上尝试相同的代码时它起作用了(因此无需循环遍历不同的文件夹) .
我无法理解 os.walk() 的工作原理,所以我改用 os.listdir()。
这是我当前的工作代码:
import os
import shutil
import img2pdf
from send2trash import send2trash
import re
from PyPDF2 import PdfFileMerger as merger
parent_folder = '/Users/macbook/Documents/Random sketches/'
os.chdir(parent_folder)
for subfolder in os.listdir(parent_folder):
if os.path.isdir(parent_folder + subfolder):
for filename in os.listdir(parent_folder + subfolder):
if filename.endswith(('.jpg', '.JPG')):
filename_regex = re.compile(r'(\.jpg)|(\.jpeg)', re.IGNORECASE)
new_name = filename_regex.sub('', filename)
f = open(parent_folder + subfolder + '/' + new_name + '.pdf', 'wb')
f.write(img2pdf.convert(parent_folder + subfolder + '/' + filename))
send2trash(parent_folder + subfolder + '/' + filename)
for subfolder in os.listdir(parent_folder):
if os.path.isdir(parent_folder + subfolder):
for file in os.listdir(parent_folder + subfolder):
if file.endswith('.pdf'):
merger.append(file)
merger.write(subfolder +'.pdf')
但是,我收到错误消息:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-c489b353ceda> in <module>()
23 if file.endswith('.pdf'):
24 merger.append(file)
---> 25 merger.write(subfolder +'.pdf')
TypeError: write() missing 1 required positional argument: 'fileobj'
我没看到您在哪里创建 PdfFileMerger
对象。我认为您不能将其导入为 merger
。如果将代码修改为:
会发生什么
from PyPDF2 import PdfFileMerger
...
for subfolder in os.listdir(parent_folder):
merger = PdfFileMerger()
if os.path.isdir(parent_folder + subfolder):
for file in os.listdir(parent_folder + subfolder):
if file.endswith('.pdf'):
merger.append(file)
merger.write(subfolder +'.pdf')
merger.close()
我在一个父文件夹中有一系列文件夹。每个文件夹都有几张 .jpg 格式的图像,名称按递增顺序排列 (00.jpg、01.jpg...)。
我想将每个图像转换成同名的 pdf,然后将每个子文件夹的所有 pdf 合并到位于父文件夹中的单个 pdf,并以其 pdf 所在的子文件夹命名。
例如,父文件夹./Random sketches 有子目录001 landscapes sketches 到099 urban sketches。所以我想转换每个子文件夹中的图像,然后将名为 001 landscapes 的 pdf 合并为 099 urban sketches。
我可以将图像转换为 pdf,但我无法使用循环合并它们,即使当我在单个子文件夹上尝试相同的代码时它起作用了(因此无需循环遍历不同的文件夹) .
我无法理解 os.walk() 的工作原理,所以我改用 os.listdir()。
这是我当前的工作代码:
import os
import shutil
import img2pdf
from send2trash import send2trash
import re
from PyPDF2 import PdfFileMerger as merger
parent_folder = '/Users/macbook/Documents/Random sketches/'
os.chdir(parent_folder)
for subfolder in os.listdir(parent_folder):
if os.path.isdir(parent_folder + subfolder):
for filename in os.listdir(parent_folder + subfolder):
if filename.endswith(('.jpg', '.JPG')):
filename_regex = re.compile(r'(\.jpg)|(\.jpeg)', re.IGNORECASE)
new_name = filename_regex.sub('', filename)
f = open(parent_folder + subfolder + '/' + new_name + '.pdf', 'wb')
f.write(img2pdf.convert(parent_folder + subfolder + '/' + filename))
send2trash(parent_folder + subfolder + '/' + filename)
for subfolder in os.listdir(parent_folder):
if os.path.isdir(parent_folder + subfolder):
for file in os.listdir(parent_folder + subfolder):
if file.endswith('.pdf'):
merger.append(file)
merger.write(subfolder +'.pdf')
但是,我收到错误消息:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-c489b353ceda> in <module>()
23 if file.endswith('.pdf'):
24 merger.append(file)
---> 25 merger.write(subfolder +'.pdf')
TypeError: write() missing 1 required positional argument: 'fileobj'
我没看到您在哪里创建 PdfFileMerger
对象。我认为您不能将其导入为 merger
。如果将代码修改为:
from PyPDF2 import PdfFileMerger
...
for subfolder in os.listdir(parent_folder):
merger = PdfFileMerger()
if os.path.isdir(parent_folder + subfolder):
for file in os.listdir(parent_folder + subfolder):
if file.endswith('.pdf'):
merger.append(file)
merger.write(subfolder +'.pdf')
merger.close()