python os.rename(…)赢得';不行!

python os.rename(…)赢得';不行!,python,file-rename,Python,File Rename,我正在编写一个Python函数,将文件列表的扩展名更改为另一个扩展名,如将txt转换为rar,这只是一个空闲的示例。但我有个错误。代码是: import os def dTask(): #Get a file name list file_list = os.listdir('C:\Users\B\Desktop\sil\sil2') #Change the extensions for file_name in file_list: entry_

我正在编写一个Python函数,将文件列表的扩展名更改为另一个扩展名,如将txt转换为rar,这只是一个空闲的示例。但我有个错误。代码是:

import os
def dTask():
    #Get a file name list
    file_list = os.listdir('C:\Users\B\Desktop\sil\sil2')
    #Change the extensions
    for file_name in file_list:
        entry_pos = 0;
        #Filter the file name first for '.'
        for position in range(0, len(file_name)):
            if file_name[position] == '.':
                break
        new_file_name = file_name[0:position]
        #Filtering done !
        #Using the name filtered, add extension to that name
        new_file_name = new_file_name + '.rar'
        #rename the entry in the file list, using new file name
        print 'Expected change from: ', file_list[entry_pos]
        print 'into File name: ', new_file_name
        os.rename(file_list[entry_pos], new_file_name)
        ++entry_pos
Error:
>>> dTask()
Expected change from:  New Text Document (2).txt
into File name:  New Text Document (2).rar
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    dTask()
  File "C:\Users\B\Desktop\dTask.py", line 19, in dTask
    os.rename(file_list[entry_pos], new_file_name)
WindowsError: [Error 2] The system cannot find the file specified
导入操作系统
def dTask():
#获取文件名列表
file\u list=os.listdir('C:\Users\B\Desktop\sil\sil2')
#更改扩展名
对于文件列表中的文件名:
输入位置=0;
#首先筛选“.”的文件名
对于范围(0,len(文件名))中的位置:
如果文件名[位置]='.'
打破
新建文件名=文件名[0:位置]
#过滤完成!
#使用筛选的名称,将扩展名添加到该名称
新建文件名=新建文件名+'.rar'
#使用新文件名重命名文件列表中的条目
打印“预期更改自:”,文件列表[条目位置]
打印“到文件名:”,新文件名
重命名(文件列表[条目位置],新文件名)
++入口位置
错误:
>>>dTask()
预期更改来自:新文本文档(2).txt
文件名:新文本文档(2).rar
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
dTask()
文件“C:\Users\B\Desktop\dTask.py”,第19行,在dTask中
重命名(文件列表[条目位置],新文件名)
WindowsError:[错误2]系统找不到指定的文件

正如您在打印输出中看到的那样,我可以成功地在变量级别获得具有另一个扩展名的文件名,但实际上并非如此,因为我无法在操作系统级别结束此过程。错误来自os.rename(…)。你知道怎么解决这个问题吗

重命名必须使用完整路径

import os
def dTask():
    #Get a file name list
    dir = 'C:\Users\B\Desktop\sil\sil2'
    file_list = os.listdir(dir)
    #Change the extensions
    for file_name in file_list:
        entry_pos = 0;
        #Filter the file name first for '.'
        for position in range(0, len(file_name)):
            if file_name[position] == '.':
                break
        new_file_name = file_name[0:position]
        #Filtering done !
        #Using the name filtered, add extension to that name
        new_file_name = new_file_name + '.rar'
        #rename the entry in the file list, using new file name
        print 'Expected change from: ', file_list[entry_pos]
        print 'into File name: ', new_file_name
        os.rename( os.path.join(dir, file_list[entry_pos]), os.path.join(dir,new_file_name))
        ++entry_pos

您必须使用重命名的完整路径

import os
def dTask():
    #Get a file name list
    dir = 'C:\Users\B\Desktop\sil\sil2'
    file_list = os.listdir(dir)
    #Change the extensions
    for file_name in file_list:
        entry_pos = 0;
        #Filter the file name first for '.'
        for position in range(0, len(file_name)):
            if file_name[position] == '.':
                break
        new_file_name = file_name[0:position]
        #Filtering done !
        #Using the name filtered, add extension to that name
        new_file_name = new_file_name + '.rar'
        #rename the entry in the file list, using new file name
        print 'Expected change from: ', file_list[entry_pos]
        print 'into File name: ', new_file_name
        os.rename( os.path.join(dir, file_list[entry_pos]), os.path.join(dir,new_file_name))
        ++entry_pos

如果您不在目录
C:\Users\B\Desktop\sil\sil2
中,Python肯定无法找到这些文件。

如果您不在目录
C:\Users\B\Desktop\sil\sil2
中,Python肯定无法找到这些文件

  • 正如其他人已经指出的,您需要提供这些文件的路径,或者切换当前工作目录,以便操作系统能够找到这些文件

  • ++entry\u pos
    没有任何作用。Python中没有增量运算符。前缀
    +
    正好与前缀
    -
    对称。用两个
    +
    作为前缀只是两个no-ops。因此,实际上您并没有做任何事情(在您将其更改为
    entry\u pos+=1
    之后,您仍然在每次迭代中将其重置为零

  • 此外,您的代码非常不雅观-例如,您正在使用一个单独的索引来
    文件列表
    ,并且无法将其与迭代变量
    文件名
    保持同步,即使您可以使用该索引!来说明如何更好地执行此操作

  • -

  • 正如其他人已经指出的,您需要提供这些文件的路径,或者切换当前工作目录,以便操作系统能够找到这些文件

  • ++entry\u pos
    不起任何作用。Python中没有增量运算符。前缀
    ++
    与前缀
    -
    是对称的。用两个
    +
    作为前缀只是两个无操作。所以你实际上什么都没做(在将其更改为
    entry_pos+=1
    之后,在每次迭代中仍将其重置为零

  • 此外,您的代码非常不雅观-例如,您正在使用一个单独的索引来
    文件列表
    ,并且无法将其与迭代变量
    文件名
    保持同步,即使您可以使用该索引!来说明如何更好地执行此操作

  • -


    您还希望使用双反斜杠在Python字符串中转义它们,因此

    file_list = os.listdir('C:\Users\B\Desktop\sil\sil2')
    
    你想要

    file_list = os.listdir('C:\\Users\\B\\Desktop\\sil\\sil2')
    

    或者使用前斜杠-Python神奇地将它们视为Windows上的路径分隔符。

    您还希望使用双反斜杠在Python字符串中转义它们,因此

    file_list = os.listdir('C:\Users\B\Desktop\sil\sil2')
    
    import os
    
    def extChange(path,newExt,oldExt=""):
        if path.endswith != "\\" and path.endswith != "/":
            myPath = path + "\\"
        directory = os.listdir(myPath)
        for i in directory:
            x = myPath + i[:-4] + "." + newExt
            y = myPath + i
            if oldExt == "":
                os.rename(y,x)
            else:
                if i[-4:] == "." + oldExt:
                    os.rename(y,x)
    
    你想要

    file_list = os.listdir('C:\\Users\\B\\Desktop\\sil\\sil2')
    
    或者使用前斜杠——Python神奇地将它们视为Windows上的路径分隔符

    import os
    
    def extChange(path,newExt,oldExt=""):
        if path.endswith != "\\" and path.endswith != "/":
            myPath = path + "\\"
        directory = os.listdir(myPath)
        for i in directory:
            x = myPath + i[:-4] + "." + newExt
            y = myPath + i
            if oldExt == "":
                os.rename(y,x)
            else:
                if i[-4:] == "." + oldExt:
                    os.rename(y,x)
    
    现在叫它:

    extChange("C:/testfolder/","txt","lua") #this will change all .txt files in C:/testfolder to .lua files
    extChange("C:/testfolder/","txt") #leaving the last parameter out will change all files in C:/testfolder to .txt
    
    现在叫它:

    extChange("C:/testfolder/","txt","lua") #this will change all .txt files in C:/testfolder to .lua files
    extChange("C:/testfolder/","txt") #leaving the last parameter out will change all files in C:/testfolder to .txt
    

    重命名确实不喜欢变量。请使用shutil。示例取自

    就你而言:

    import shutil
    shutil.move(file_list[entry_pos], new_file_name)
    

    重命名确实不喜欢变量。请使用shutil。示例取自

    就你而言:

    import shutil
    shutil.move(file_list[entry_pos], new_file_name)
    

    + + CynyPyPOS不做你认为它做的事情。我认为你想做CexyYPoS+=1 + + CeNyjPOS,不要做你认为它做的事。我想你想做CexyYPOS +1。谢谢你的警告。我倾向于写C++,把IFS后面的括号放进“”。,和++,-,之类的东西,我会及时加以修改。非常新的python初学者,因此不称职。有两件事:在您的代码中,…+来自外部。我不明白。它有垃圾价值。它看起来悬而未决,此后从未使用过。2)在评论3中:您正在使用一个单独的索引来归档列表,但未能将其与迭代变量file name保持同步。为了拓宽我的视野,您能详细解释一下您的意思吗?谢谢。@Mr ME:(1)
    from\u ext
    是copypata留下的,谢谢您抓住了它。(2)我认为,C++的唯一目的是从“:”、“FielyList[CeNyjPoS] ] /Cube >中获得当前文件的名称:“代码>打印”预期更改,尽管您可以(也应该)简单地使用<代码>文件名> /COD>。谢谢警告。我倾向于写C++,在IFS后面加上括号,将字符串转换成“”。,和++,-,之类的东西,我会及时加以修改。非常新的python初学者,因此不称职。有两件事:在您的代码中,…+来自外部。我不明白。它有垃圾价值。它看起来悬而未决,此后从未使用过。2)在评论3中:您正在使用一个单独的索引来归档列表,但未能将其与迭代变量file name保持同步。为了拓宽我的视野,您能详细解释一下您的意思吗?谢谢。@ME先生:(1)
    from\u ext
    是从