2

我正在尝试使用 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 中做错了什么?

感谢您阅读/回答此问题!

4

1 回答 1

1

如果您只是打印出来,第一个问题很明显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:and line=File.readline(),你可以做for line in File:
  • 不要试图os.chdir向下和备份。如果你在中间失败或取消,你会让事情处于一个时髦的状态,你会遇到符号链接等问题。你可以只使用路径,比如for files in glob.glob(os.path.join(folder_now, "*.wav")).
  • 使用os.path函数而不是尝试将路径视为字符串。
  • 不要试图通过每次循环设置i=1和执行来维护显式计数器;i+=1只需使用enumerate.
  • 使用一致的命名约定。
于 2013-07-09T21:04:16.677 回答