2014-03-05 203 views
2

我已经写了一个小程序来重命名一个大的一堆文件在python蟒蛇os.rename模块删除文件

#!/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以上的每个文件,但最后一个除外。
请问您是否知道如何解决这个小错误,并向我解释发生这种情况的原因,因为我工作的时间太长了。

---编辑---

我的文本文件的一小段

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 
... 

如果您需要任何更多的信息,我公司将提供它尽可能地

+1

我不太明白这个问题。您能否提供文本文件的内容,运行脚本之前存在的avi文件列表,以及之后存在的avi文件列表? – Kevin

+0

是的,您使用的列表将非常有帮助。 – StephenH

+0

作为一个初学者,在你命中这行之前:'os.rename(filename,f.readline()[: - 1] + filename [-4:])''我会添加下面的调试语句: 'temp = f .readline()' 'print filename,(temp + filename [-4:])' 这会帮助您理解正在处理的文件名 – StephenH

回答

0

你可能有少你的文件中的行比目录中的文件要多。 我猜这是一个unix环境?

readline具有此副作用,从文档:

f.readline()从文件中读取一行;换行符 (\ n)被留在字符串的末尾,并且仅省略在最后 行的文件,如果该文件不换行结束。这使得 返回值明确;如果f.readline()返回空字符串,则文件末尾已达到 ,空行则由 '\ n'表示,该字符串仅包含一个换行符。

os.rename有这种副作用,从文档:

在Unix上,如果dst存在且是一个文件,它会被替换默默地如果 用户拥有权限。

你可能已经猜到发生了什么现在去错了,但我会拼出来,以防万一:

比方说,你在你的目录中的5个文件:

  • A.TXT
  • b.txt
  • c。TXT
  • d.txt
  • e.txt

而在你的输入文件,你只有3项:

User1 
User2 
User3 

的期望是要a.txt更名为User1.txt等尽管这当然都是隐含的。

所以,你的脚本将重命名a.txtUser1.txt,然后b.txtUser2.txt,然后c.txtUser3.txt

d.txt会发生什么情况?它会读取文件,并获得一个空字符串。然后它会将原始扩展名添加到文件中,并将d.txt重命名为.txt。不是很有用。

现在变得更糟...现在我们来看e.txt。它将再次使用readline()读取文件并获取另一个空字符串。然后,它会再次将原始扩展名添加到文件中,并将e.txt重命名为.txt。由于已经有一个名称的文件,它会被删除,现在d.txt完全消失。

0

好的。感谢Corley,我解决了这个问题。当我重新运行带有缺失文件的一个条目的程序时,我会得到双重名称,这将删除Corley描述的文件。我解决了这个问题有一个循环我的所有文件重命名为简单的数字

i = 1 
for filename in filelist: 
    os.rename(filename, str(i).zfill(4)+'temp'+filename[-4:]) 
    i+=1 
  • 001.temp.avi
  • 002.temp.avi
  • 003.temp.avi
  • ...

等等。然后我重新命名文件,就像他们应该在我最初的问题中使用脚本一样。

谢谢你帮我弄明白。