Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python对os.Rename的使用_Python_Python 2.7_File Rename - Fatal编程技术网

Python对os.Rename的使用

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

我正在尝试使用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
问题是:我在操作系统重命名中做错了什么


感谢您阅读/回答此问题

如果您只是打印出
单词
,第一个问题很明显:

['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
    来维护显式计数器;只需使用
    枚举
  • 使用一致的命名约定

  • 您输入输入文件的方式导致所有行一起运行。我已经把它编辑成我认为你想要的,请验证它是否正确。谢谢你的回答,特别是所有改进我代码的建议。