Skip to main content
 首页 » 编程设计

os.renames 的 Python 用法

2025年05月04日9cloudgamer

我正在尝试使用 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。
  • 使用一致的命名约定。