我正在尝试使用 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=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
问题是:我在 os.renames 中做错了什么?
感谢您阅读/回答此问题!
请您参考如下方法:
如果您只打印words,第一个问题就很明显了:
['Aegolius', 'harrisii', 'song', '10009.wav', 'Aegolius', 'harrisii', 'song', '21.wav']
您正在设置 subfolder=words[3],它是 10009.wav 而不是 song。您需要第三个词,即 words[2](因为 Python 是基于 0 的)。
同样,您设置的是 filename=words[4] 而不是 words[3],即 Aegolius 而不是 10009.wav.
我认为您的 folder_now 是正确的——它是 21.wav。
第二个问题是 if not ("call"or "song") in words 没有按照您的要求执行。 ("call"or "song") 就是 "call"。因此,当您到达其中包含 song 的行时,您将立即停止。
你可能想要这个:
if not ("call" in words or "song" in words):
……或者也许:
if not {"call", "song"}.intersection(words):
第三个可能的问题(我不知道这是否影响到你)是你使用break而不是continue,这意味着你在第一个无效的地方停止行,而不是仅仅跳过无效行。
虽然我们正在做这件事,但您可以通过一些小方法改进您的代码:
- 与缩进保持一致。您的源混合了制表符和空格,这是灾难的根源;你很幸运你逃脱了它。您还在各处使用了不同数量的缩进——两个空格、三个空格、四个空格、一个制表符等等——这使得您的代码难以阅读。给自己找一个可以为您处理这些问题的编辑器(无论是 IDLE、像 Visual Studio 或 Eclipse 这样的高级 IDE,还是像 BBEdit 这样的优秀“程序员的文本编辑器”,甚至是 emacs)。
- 除了执行
while True:和line=File.readline(),您还可以执行for line in File:。 - 不要尝试将
os.chdir关闭再备份。如果你在中间失败或取消,你会把事情留在一个时髦的状态,你会遇到符号链接(symbolic link)等问题。你可以只使用路径,比如for files in glob.glob(os.path.加入(folder_now,“*.wav”))。 - 使用
os.path函数而不是尝试将路径视为字符串。 - 不要试图通过设置
i=1并在每次循环中执行i+=1来维护显式计数器;只需使用enumerate。 - 使用一致的命名约定。
