1

我正在编写一个 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

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

4

6 回答 6

9
  1. 正如其他人已经说过的那样,您要么需要提供这些文件的路径,要么需要切换当前工作目录,以便操作系统可以找到这些文件。

  2. ++entry_pos不做任何事情。Python 中没有自增运算符。Prefix+只是与 prefix 对称-。用两个前缀+只是两个无操作。因此,您实际上并没有做任何事情(并且在将其更改为 之后entry_pos += 1,您仍然在每次迭代中将其重置为零。

  3. 此外,您的代码非常不雅 - 例如,您使用了一个单独的索引file_list并且未能与迭代变量保持同步file_name,即使您可以只使用那个!展示如何更好地做到这一点。

-

def rename_by_ext(to_ext, path):
    if to_ext[0] != '.':
        to_ext = '.'+to_ext
    print "Renaming files in", path
    for file_name in os.listdir(path):
        root, ext = os.path.splitext(file_name)
        print "Renaming", file_name, "to", root+ext
        os.rename(os.path.join(path, file_name), os.path.join(path, root+to_ext))
rename_by_ext('.rar', '...')
于 2010-11-10T18:15:01.350 回答
3

os.rename 真的不喜欢变量。使用舒蒂尔。示例取自如何使用 Shutil 复制和移动文件

import shutil
import os
source = os.listdir("/tmp/")
destination = "/tmp/newfolder/"
for files in source:
    if files.endswith(".txt"):
        shutil.move(files,destination)

在你的情况下:

import shutil
shutil.move(file_list[entry_pos], new_file_name)
于 2017-07-27T16:56:30.970 回答
2

您还想在 Python 字符串中使用双反斜杠来转义它们,所以不要

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

你要

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

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

于 2010-11-10T18:44:34.577 回答
1

您必须使用完整路径进行重命名。

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
于 2010-11-10T17:57:56.557 回答
0

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

于 2010-11-10T17:59:43.543 回答
-4
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
于 2011-03-17T20:37:47.980 回答