Python对os.Rename的使用
我正在尝试使用python重命名文件,但我无法准确地指出错误在哪里,也许我太累了,因为我已经连续30多个小时尝试这么做了 当您查看所需输出和实际输出时,实际问题非常明显Python对os.Rename的使用,python,python-2.7,file-rename,Python,Python 2.7,File Rename,我正在尝试使用python重命名文件,但我无法准确地指出错误在哪里,也许我太累了,因为我已经连续30多个小时尝试这么做了 当您查看所需输出和实际输出时,实际问题非常明显 #!/usr/bin/env python import sys import os import glob if __name__ == '__main__': input_file=sys.argv[1] File= open(input_file) while True: line=F
#!/usr/bin/env python
import sys
import os
import glob
if __name__ == '__main__':
input_file=sys.argv[1]
File= open(input_file)
while True:
line=File.readline()
words = line.split()
if not ("call" or "song") in words:
break
folder_dest= words[0] +" "+ words[1]
subfolder=words[3]
filename=words[4].replace(".wav","")
folder_now=words[7].replace(".wav","")
os.chdir(folder_now)
i=1
for files in glob.glob("*.wav"):
os.renames(files,"../"+folder_dest+"/"+subfolder+"/"+filename+"-"+'{:03}'.format(i)+".wav")
i+=1
os.chdir("..")
更多解释:
我有这个输入文件
Aegolius harrisii song 10009.wav Aegolius harrisii song 21.wav
Aegolius harrisii song 483_Aegolius%20harrisii_F27_Itatira_28_IV_2004_Weber%20Girao.wav Aegolius harrisii song 22.wav
Gnorimopsar chopi song 1000517.wav Gnorimopsar chopi song 825.wav
Myiobius barbatus call Myiobius.sulphureipygius9402-1.wav Myiobius barbatus call 1146.wav
Myiobius barbatus song 1001.wav Myiobius barbatus song 1147.wav
Muscipipra vetula call 1000682.wav Muscipipra vetula call 1122.wav
这是当前的文件夹结构:
1
├── parte_1.wav
└── parte_2.wav
2
├── parte_1.wav
├── parte_2.wav
├── parte_3.wav
├── parte_4.wav
├── parte_5.wav
└── parte_6.wav
以下是现在的输出:
Aegolius harrisii/
├── 100015.wav
│ ├── Aegolius-001.wav
│ └── Aegolius-002.wav
└── AEGOLI~1.wav
├── Aegolius-001.wav
├── Aegolius-002.wav
├── Aegolius-003.wav
├── Aegolius-004.wav
├── Aegolius-005.wav
└── Aegolius-006.wav
期望输出
Aegolius harrisii/
├── call
│ ├── 100015-001.wav
│ └── 100015-002.wav
└── song
├── AEGOLI~1-001.wav
├── AEGOLI~1-002.wav
├── AEGOLI~1-003.wav
├── AEGOLI~1-004.wav
├── AEGOLI~1-005.wav
└── AEGOLI~1-006.wav
问题是:我在操作系统重命名中做错了什么
感谢您阅读/回答此问题 如果您只是打印出
单词
,第一个问题很明显:
['Aegolius', 'harrisii', 'song', '10009.wav', 'Aegolius', 'harrisii', 'song', '21.wav']
您正在设置subfolder=words[3]
,它是10009.wav
,而不是song
。您需要第三个单词,即单词[2]
(因为Python是基于0的)
同样,您正在设置filename=words[4]
而不是words[3]
,后者是Aegolius
而不是10009.wav
我想你现在有文件夹了
更正它是21.wav
第二个问题是,
如果不是(“call”或“song”)的话,在单词中就不能做你想做的事<代码>(“呼叫”或“歌曲”)
只是“呼叫”
。所以,当你到达一条有歌曲的线路时,你就停止了
你可能想要这个:
if not ("call" in words or "song" in words):
……或者:
if not {"call", "song"}.intersection(words):
第三个可能的问题(我不知道这是否影响您)是您使用了break
而不是continue
,这意味着您在第一个无效行停止,而不是跳过无效行
在我们进行这项工作时,您可以通过以下几个小方法来改进代码:
- 与你的缩进保持一致。你的信息源混合了标签和空格,这是灾难的秘诀;你很幸运能侥幸逃脱。您还可以在两个空格、三个空格、四个空格、一个制表符等位置使用不同数量的缩进,这使得代码很难阅读。为自己找一个编辑器来处理这个问题(不管它是空闲的,还是像VisualStudio或Eclipse这样别致的IDE,像BBEdit这样漂亮的“程序员文本编辑器”,甚至是emacs)
- 不必在True:
和line=File.readline()
时执行,只需对文件中的行执行:
不要试图关闭并备份os.chdir。如果你在中间失败或取消,你会把事情弄得一塌糊涂,你会遇到SysLink之类的问题。
使用os.path
函数,而不是尝试将路径视为字符串
不要试图通过每次通过循环设置i=1
并执行i+=1
来维护显式计数器;只需使用枚举
使用一致的命名约定
您输入输入文件的方式导致所有行一起运行。我已经把它编辑成我认为你想要的,请验证它是否正确。谢谢你的回答,特别是所有改进我代码的建议。