遍历目录并从图像创建 pdf
Walk directories and create pdf from images
我有一个文件夹 Alpha,其中包含一系列名为 Beta1、Beta2、...、Beta 397 的文件夹。每个 Beta 文件夹都包含数量不定的不同文件格式的按字母数字编号的图像。
我的目标是 运行 一个脚本,该脚本可以抓取所有这些 Beta 文件夹,有选择地选择 jpeg/png 格式的图像,并在名称排序后将它们合并为 pdf(每个 Beta 文件夹)。
我的代码与 Beta 文件夹一起存储并读取:-
import glob
import re
import img2pdf
import os
_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
return [int(text) if text.isdigit() else text.lower()
for text in re.split(_nsre, s)]
for X in range(1, 397):
dirname = os.path.join('./','BetaX', '')
output = os.path.join('./','BetaX', '/output.pdf')
# Get all the filenames per image format
filenames1 = [f for f in glob.iglob(f'{dirname}*.jpg')]
filenames2 = [f for f in glob.iglob(f'{dirname}*.png')]
# Merges the 2 lists
filenames3 = filenames1 + filenames2
# Sort the list alphanumerically
filenames3.sort(key=natural_sort_key)
# Print to pdf
with open(output,"wb") as f:
f.write(img2pdf.convert(filenames3))
print(f'Finished converting {output}')
filenames1.clear()
filenames2.clear()
filenames3.clear()
如果我删除 for 循环行并键入 X 的值,pdf 将在单个文件夹的基础上毫不费力地输出。但是,我正在寻找将 X 视为范围内的循环变量并一次批处理所有文件夹的方法。
您目前的代码方式:
for X in range(1, 397):
dirname = os.path.join('./','BetaX', '')
output = os.path.join('./','BetaX', '/output.pdf')
X
只是字符串BetaX
中的一个字符。您需要使 X
被视为整数值,然后您需要将该值连接到 Beta
以得出完整的文件夹名称。
此外,您不希望在传递给 os.path.join
的内容中出现斜杠。 join
调用的要点是隐藏路径分隔符的详细信息。 output
的值将只是 /output.pdf
与你所拥有的,因为第三个参数将被视为绝对路径,因为它前面有斜线。
这是解决了这两个问题的那部分代码:
for X in range(1, 397):
dirname = os.path.join('.','Beta' + str(X), '')
output = os.path.join('.','Beta' + str(X), 'output.pdf')
我有一个文件夹 Alpha,其中包含一系列名为 Beta1、Beta2、...、Beta 397 的文件夹。每个 Beta 文件夹都包含数量不定的不同文件格式的按字母数字编号的图像。
我的目标是 运行 一个脚本,该脚本可以抓取所有这些 Beta 文件夹,有选择地选择 jpeg/png 格式的图像,并在名称排序后将它们合并为 pdf(每个 Beta 文件夹)。
我的代码与 Beta 文件夹一起存储并读取:-
import glob
import re
import img2pdf
import os
_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
return [int(text) if text.isdigit() else text.lower()
for text in re.split(_nsre, s)]
for X in range(1, 397):
dirname = os.path.join('./','BetaX', '')
output = os.path.join('./','BetaX', '/output.pdf')
# Get all the filenames per image format
filenames1 = [f for f in glob.iglob(f'{dirname}*.jpg')]
filenames2 = [f for f in glob.iglob(f'{dirname}*.png')]
# Merges the 2 lists
filenames3 = filenames1 + filenames2
# Sort the list alphanumerically
filenames3.sort(key=natural_sort_key)
# Print to pdf
with open(output,"wb") as f:
f.write(img2pdf.convert(filenames3))
print(f'Finished converting {output}')
filenames1.clear()
filenames2.clear()
filenames3.clear()
如果我删除 for 循环行并键入 X 的值,pdf 将在单个文件夹的基础上毫不费力地输出。但是,我正在寻找将 X 视为范围内的循环变量并一次批处理所有文件夹的方法。
您目前的代码方式:
for X in range(1, 397):
dirname = os.path.join('./','BetaX', '')
output = os.path.join('./','BetaX', '/output.pdf')
X
只是字符串BetaX
中的一个字符。您需要使 X
被视为整数值,然后您需要将该值连接到 Beta
以得出完整的文件夹名称。
此外,您不希望在传递给 os.path.join
的内容中出现斜杠。 join
调用的要点是隐藏路径分隔符的详细信息。 output
的值将只是 /output.pdf
与你所拥有的,因为第三个参数将被视为绝对路径,因为它前面有斜线。
这是解决了这两个问题的那部分代码:
for X in range(1, 397):
dirname = os.path.join('.','Beta' + str(X), '')
output = os.path.join('.','Beta' + str(X), 'output.pdf')