我写了一个小程序来重命名python中的大量文件
#!/usr/local/bin/python3
import os
import glob
import sys
script, arg1 = sys.argv
f = open(arg1)
# Create a filelist using glob
filelist = glob.glob('*.avi')
filelist.sort()
for filename in filelist:
print(filename)
# To keep the file ending
os.rename(filename, f.readline()[:-1]+filename[-4:])
它从txt文件中读取名称,该文件作为参数提供,并重命名其他avi
个文件。但是有一个文件缺少,起始编号为'102',所以现在从'102'开始的完整订单是错误的。如果我现在重新运行此文件并删除我的txt
文件中的第102行,则除了最后一个文件之外,将删除102中的每个文件。
你可以知道如何修复这个小bug,并向我解释这是怎么发生的,因为我的工作时间太长了。
--- ---编辑
我的文字文件的简短片段
snip
099. Abenteuer in Ido
100. Corsa, der junge Rebell
101. Unser Papa ist ein Held
102. Die Gesetze des Vertrauens
103. Um acht in Spider's Cafe
104. Ruffy gegen Vivi
105. Aufruhr in Rainbase
snip
列表最多可达400个。我有300个文件,所以os.rename的问题不会发生。第一次运行脚本时,编号为102的文件不存在,因此上面的所有内容都是错误的。我添加了文件102,并希望重新运行此脚本。
重新运行之前的文件:
...
100. Corsa, der junge Rebell.avi
101. Unser Papa ist ein Held.avi
102. Die Gesetze des Vertrauens.avi
103. Um acht in Spider's Cafe.avi
104. Ruffy gegen Vivi.avi
105. Aufruhr in Rainbase.avi
...
之后的文件:
...
100. Corsa, der junge Rebell.avi
101. Unser Papa ist ein Held.avi
301. Sogeking, der Held der Stunde.avi
...
如果您需要更多信息,我会尽可能提供
答案 0 :(得分:1)
确定。考虑到科利,我想出了问题。当我重新运行程序时删除了丢失文件的一个条目,我得到双重名称,这将删除Corley描述的文件。我用循环修复了这个问题,它将我的所有文件重命名为简单数字
i = 1
for filename in filelist:
os.rename(filename, str(i).zfill(4)+'temp'+filename[-4:])
i+=1
等等。然后我在初始问题中重命名文件,就像它们应该是脚本一样。
感谢您帮助我弄清楚。
答案 1 :(得分:0)
文件中的行数可能少于目录中的文件数。 我猜这是一个unix环境?
readline
有副作用,来自文档:
f.readline()
从文件中读取一行;换行符 (\ n)留在字符串的末尾,仅在最后一个省略 文件的行,如果文件没有以换行符结尾。这使得 返回值明确;如果f.readline()
返回一个空字符串,那么 已到达文件的末尾,而空白行由表示 '\ n',一个只包含一个换行符的字符串。
os.rename
有副作用,来自文档:
在Unix上,如果
dst
存在并且是一个文件,那么它将被静默替换 用户有权限。
你现在可以猜到出了什么问题,但我会拼出来以防万一:
假设您的目录中有5个文件:
在输入文件中,您只有3个条目:
User1
User2
User3
期望您希望a.txt
重命名为User1.txt
等等。但是,当然,这一切都是隐含的。
因此,您的脚本会将a.txt
重命名为User1.txt
,然后b.txt
重命名为User2.txt
,然后c.txt
重命名为User3.txt
。
d.txt
会发生什么?它将读取文件,并获得一个空字符串。然后,它会将原始扩展名添加到文件中,并将d.txt
重命名为.txt
。不太有用。
情况变得更糟......现在,我们看一下e.txt
。它将使用readline()
再次读取文件并获取另一个空字符串。然后,它会再次将原始扩展名添加到文件中,并将e.txt
重命名为.txt
。由于已经存在具有该名称的文件,因此它将被删除,现在d.txt
完全消失。
答案 2 :(得分:0)
这是我用来批量重命名文件的脚本,以确保运行该文件时不会删除任何文件。它首先将一个文件夹中的任何.wav文件重命名为我创建的另一个名为UID的文件夹“ temp”。然后,它将文件重命名回目标文件夹,并为它们命名,无论文件夹名称是什么,再加上从0开始的序列号。
#!/usr/bin/env python
import os, uuid
path = "/Users/user/Target Folder/A/"
temp = "/Users/user/temp/"
ext = ".wav"
# Get directory name
for path, sub_directories, files in os.walk(path):
directory_name = os.path.basename(os.path.dirname(path))
# Rename with UUID to temp folder
for i,filename in enumerate(os.listdir(path)):
if filename.endswith(ext):
os.rename(path+filename, temp+str(uuid.uuid4())+ext)
# Rename the files to Folder name plus number
for i,filename in enumerate(os.listdir(temp)):
if filename.endswith(ext):
os.rename(temp+filename, path+directory_name+str(i).zfill(0)+ext)