各位好,在「安娜的档案」里,有些书的页码的是错乱的,但这些错乱页面的顺序是有规律的。
例如从PDF导出的编号,假设以图片档130号开始,正确的页码顺序为:130.png、133.png、132.png、135.png、134.png、137.png、136.png、139.png、138.png、141.png
可发现,其规律就是「数字交替增加3和减少1」,或者更精确地说,是按照「偶数页+3、奇数页-1」的方式排列。
我目前作法是,把PDF导出为上述的PNG图片档,然后按照这个规律,将图片依序放入Adobe Acrobat,重新制作出一个页面顺序正确的PDF档。
这作法虽然可行,但是太耗时间,不知能不能用什么脚本之类的方法来自动处理?
附上一个这种情况的书本,有兴趣的版友不妨帮忙看看,说不定也有其他人遇到这样的问题 。
样本.pdf (11.4 MB)
直接问的通义千问,给出的脚本(我没测试,看起来是没问题):
import os
import shutil
def rename_png_files(directory):
# 检查目标目录是否存在
if not os.path.isdir(directory):
print(f"Error: {directory} is not a valid directory.")
return
# 遍历目录中的所有文件
for filename in os.listdir(directory):
# 检查文件是否为.png格式
if filename.endswith('.png'):
# 提取文件名中的数字部分
try:
page_number = int(filename[:-4])
except ValueError:
print(f"Warning: {filename} does not have a numeric name, skipping.")
continue
# 根据奇偶性调整页码
new_page_number = page_number + 3 if page_number % 2 == 0 else page_number - 1
new_filename = f"new_{new_page_number}.png"
# 构建完整的文件路径
old_file_path = os.path.join(directory, filename)
new_file_path = os.path.join(directory, new_filename)
# 重命名文件
shutil.move(old_file_path, new_file_path)
print(f"Renamed '{filename}' to '{new_filename}'")
# 使用方法
directory_to_process = '/path/to/your/directory' # 替换为你的目录路径
rename_png_files(directory_to_process)
1 个赞
先到文件中修改目录位置,然后按如下命令运行:
python3 image_rename.py
image_rename.py (1.2 KB) 测试了下,没有问题。
Renamed '21.png' to 'new_20.png'
Renamed '22.png' to 'new_25.png'
Renamed '23.png' to 'new_22.png'
Renamed '24.png' to 'new_27.png'
1 个赞
您是指把红字部份改成png档所在的目录资料夹吗?例如’E:\abcd’
last_idol:
先到文件中修改目录位置,然后按如下命令运行:
python3 image_rename.py
请问这部份怎么用?我已安装Python 3.7(对这个一窍不通,不好意思…)
直接点,出现一个视窗,闪一下就跳掉了
PS 我可能先去休息了,明天再看
kadioguy:
请问这部份怎么用?我已安装Python 3.7
这个要在网上搜索下,文字讲不太清楚:
Python在Windows命令行(Command Prompt)运行Python脚本或交互式地执行Python代码详解
是的,修改引号内的目录路径
1 个赞
我目前把目录改成这个("E:\2"是我放png图片的资料夹路径)
然后试了两种打法,似乎都不行,请求指点:
安装的版本是Python 3.7
找到问题了,原来是斜线要打这个/,而不是这个\
不过想再问一下,为何我这边指令是打python image_rename.py才有效果,而您是打python3 image_rename.py?
谢谢。
1 个赞
问的通义千问:
import os
# 使用反斜杠
path1 = 'C:\\Users\\YourUsername\\Documents'
print(os.listdir(path1))
# 使用正斜杠
path2 = 'C:/Users/YourUsername/Documents'
print(os.listdir(path2))
# 使用原始字符串
path3 = r'C:\Users\YourUsername\Documents'
print(os.listdir(path3))
# 使用环境变量
path4 = '%USERPROFILE%\\Desktop'
print(os.listdir(os.path.expandvars(path4)))
# 使用UNC路径
path5 = '\\\\server\\share\\folder'
print(os.listdir(path5))
1 个赞
我这边还安装了 python2 的版本,占用了 python 这个名称,可以跑起来就行。
1 个赞
(因为编辑的额度用完了,现在只能用回复的方式,请见谅 )
我上述的意思是,例如130.png是第一页,则133.png是第二页、132.png是第三页,以此类推。
而目前脚本的排序如下:
Renamed ‘130.png’ to ‘new_133.png’
Renamed ‘131.png’ to ‘new_130.png’
Renamed ‘132.png’ to ‘new_135.png’
Renamed ‘133.png’ to ‘new_132.png’
Renamed ‘134.png’ to ‘new_137.png’
Renamed ‘135.png’ to ‘new_134.png’
可见,并不是如我预期的,若以上页面为例,我希望的是:
Renamed ‘130.png’ to ‘新页面a.png’
Renamed ‘131.png’ to ‘new_130.png’
Renamed ‘132.png’ to ‘新页面c.png’
Renamed ‘133.png’ to ‘新页面b.png’
Renamed ‘134.png’ to ‘新页面e.png’
Renamed ‘135.png’ to ‘新页面d.png’
重新整理后会如下:
Renamed ‘130.png’ to ‘新页面a.png’
Renamed ‘133.png’ to ‘新页面b.png’
Renamed ‘132.png’ to ‘新页面c.png’
Renamed ‘135.png’ to ‘新页面d.png’
Renamed ‘134.png’ to ‘新页面e.png’
换言之,我希望页面的排列顺序是这样子的:
131.png、
130.png、
133.png、
132.png、
135.png、
134.png、
137.png、
136.png、
139.png、
138.png、
141.png
不知有没有办法做到?
你给的顺序是对的吗,按我理解是下面这种?
Renamed ‘130.png’ to ‘new_133.png’ = ‘c.png’
Renamed ‘131.png’ to ‘new_130.png’ = ‘a.png’
Renamed ‘132.png’ to ‘new_135.png’ = ‘d.png’
Renamed ‘133.png’ to ‘new_132.png’ = ‘b.png’
Renamed ‘134.png’ to ‘new_137.png’ = ‘e.png’
Renamed ‘135.png’ to ‘new_134.png’ = ‘d.png’
1 个赞
情况是这样子的,我重新解释一下:
130.png(书本页码是125页)
131.png(书本页码是124页)
132.png(书本页码是127页)
133.png(书本页码是126页)
134.png(书本页码是129页)
135.png(书本页码是128页)
所以我需要按照书本实际的页码排列,即:
131.png(书本页码是124页)
130.png(书本页码是125页)
133.png(书本页码是126页)
132.png(书本页码是127页)
135.png(书本页码是128页)
134.png(书本页码是129页)
换言之,要如何让.png重新编号后,按照这顺序排列,是我目前需要的。
如果继续延伸,就像这样:
131.png、
130.png、
133.png、
132.png、
135.png、
134.png、
137.png、
136.png、
139.png、
138.png、
141.png
amob
2024 年9 月 11 日 02:54
14
楼主说的实现逻辑太复杂了,就是很简单的奇数页偶数页错位,我以前遇到过,程序分开讨论枚举命名就行了。
你把以下逻辑发给gpt写就行:
让不小于130的偶数页start=131,递增increment为2;
奇数页start=130,递增increment为2。
1 个赞
就是奇数-7,偶数-5吧:
image_rename.py (1.2 KB)
Renamed ‘130.png’ to ‘new_125.png’
Renamed ‘131.png’ to ‘new_124.png’
Renamed ‘132.png’ to ‘new_127.png’
Renamed ‘133.png’ to ‘new_126.png’
Renamed ‘134.png’ to ‘new_129.png’
Renamed ‘135.png’ to ‘new_128.png’
如果还是不对,你可以自己修改文件中的第 22 行:
new_page_number = page_number - 5 if page_number % 2 == 0 else page_number - 7
1 个赞
amob
2024 年9 月 11 日 03:03
16
通用程序,输入起始页数数字(哪里开始错位从哪里开始命名,全错误输入1),补位位数为输出文件要求位数(不需要补位输入1),不足位数前方补0
import os
import tkinter as tk
from tkinter import filedialog, messagebox
import re
import sys
def natural_sort_key(s):
return [int(c) if c.isdigit() else c.lower() for c in re.split(r'(\d+)', s)]
def select_folder():
folder_path = filedialog.askdirectory()
if folder_path:
folder_entry.delete(0, tk.END)
folder_entry.insert(0, folder_path)
def rename_images():
folder_path = folder_entry.get()
start_page = start_page_entry.get()
padding = int(padding_entry.get())
if not folder_path or not start_page.isdigit():
messagebox.showerror("错误", "请选择有效的文件夹并输入起始页数")
return
start_page = int(start_page)
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and re.match(r'^\d+\.[^.]+$', f)]
files.sort(key=natural_sort_key)
even_page = start_page + 1
odd_page = start_page - 1
for file in files:
old_path = os.path.join(folder_path, file)
file_name, file_ext = os.path.splitext(file)
if file_name.isdigit():
if int(file_name) % 2 == 0:
new_name = f"{even_page:0{padding}d}{file_ext}"
even_page += 2
else:
new_name = f"{odd_page:0{padding}d}{file_ext}"
odd_page += 2
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
messagebox.showinfo("完成", "图片重命名完成")
# 获取命令行参数
if len(sys.argv) > 1:
padding = int(sys.argv[1])
else:
padding = 1 # 默认不补位
# 创建主窗口
root = tk.Tk()
root.title("图片重命名工具")
# 创建并放置文件夹选择部分
folder_frame = tk.Frame(root)
folder_frame.pack(pady=10)
folder_label = tk.Label(folder_frame, text="选择文件夹:")
folder_label.grid(row=0, column=0, padx=5)
folder_entry = tk.Entry(folder_frame, width=50)
folder_entry.grid(row=0, column=1, padx=5)
folder_button = tk.Button(folder_frame, text="浏览", command=select_folder)
folder_button.grid(row=0, column=2, padx=5)
# 创建并放置起始页输入部分
start_page_frame = tk.Frame(root)
start_page_frame.pack(pady=10)
start_page_label = tk.Label(start_page_frame, text="起始页数:")
start_page_label.grid(row=0, column=0, padx=5)
start_page_entry = tk.Entry(start_page_frame, width=10)
start_page_entry.grid(row=0, column=1, padx=5)
# 创建并放置补位位数输入部分
padding_frame = tk.Frame(root)
padding_frame.pack(pady=10)
padding_label = tk.Label(padding_frame, text="补位位数:")
padding_label.grid(row=0, column=0, padx=5)
padding_entry = tk.Entry(padding_frame, width=10)
padding_entry.insert(0, str(padding))
padding_entry.grid(row=0, column=1, padx=5)
# 创建并放置重命名按钮
rename_button = tk.Button(root, text="开始重命名", command=rename_images)
rename_button.pack(pady=10)
root.mainloop()
1 个赞
amob
2024 年9 月 11 日 03:05
17
楼主说的正文页我觉得不用考虑,全用数字从130开始命名就行,命名成new_xxx也不方便后续数字排序做成pdf。
这样子是可以的,目前测试有对应到书本的页码
不过遇到有负数编号的页码,要怎么让它排到0前面呢?还是就不管了,反正只有几页,就制作PDF时,用手拖曳一下顺序就好?
amob
2024 年9 月 11 日 03:15
19
kadioguy:
这样子是可以的,目前测试有对应到书本的页码
是没错,但是这样命名不方便后续数字增序排序,前方有别的字符,而且后方还有负数
你不需要准确的页码,直接奇数+0,偶数+2就行了。到对应代码行里修改。
new_page_number = page_number + 2 if page_number % 2 == 0 else page_number + 0