更改目录和重命名问题

Changing directory and renaming issues

我希望完成的是扫描指定目录中的所有文件并删除名称中包含的数字。问题是我无法使用下面的代码更改目录。

我目前正在参加 Udacity 全栈纳米学位课程,所以如果有人能帮助我,那也在该计划中,那将是一个加号。

代码如下:

import os

def rename_files():
    #(1) Get file names from a folder
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    print("Our current working directory is ", saved_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, file_name.translate("0123457689"))
    os.chdir(saved_path)
    print("Our current working directory is ", saved_path)

rename_files()

这是我得到的输出:

Our current working directory is /Users/bill/Documents/web/LocalServer
Our current working directory is  /Users/bill/Documents/web/LocalServer
Our current working directory is  /Users/bill/Documents/web/LocalServer

更新 1:

我终于更改了目录,但我仍然无法重命名文件。 (例如:68chicago.jpg 到 chicago.jpg)

这是我当前的代码:

import os

def rename_files():
    #(1) Get file names from a folder 
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    new_path = os.getcwd()
    print("Our current working directory is ", new_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, file_name.translate("0123457689"))
    print("Our current working directory is ", new_path)

rename_files()

这是我当前的输出:

Our current working directory is /Users/bill/Documents/web/LocalServer
Our current working directory is  /Users/bill/Documents/web/LocalServer/prank
Our current working directory is  /Users/bill/Documents/web/LocalServer/prank

更新二:

感谢@Dan,我终于解决了这个问题。

这是他的代码:

import os
def rename_files():
    #(1) Get file names from a folder 
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    new_path = os.getcwd()
    print("Our current working directory is ", new_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, ''.join([i for i in file_name if not i.isdigit()])) # This works on my machine
    os.chdir(saved_path)
    print("Our current working directory is ", saved_path)
rename_files()

看起来你想换一个目录,然后再换回第一个目录?如果是这样的话,你想要这样的东西:

import os

def rename_files():
    #(1) Get file names from a folder
    file_list = os.listdir("/Users/bill/Documents/web/LocalServer/prank")
    #print (file_list)
    saved_path = os.getcwd()
    print("Our current working directory is " + saved_path)
    os.chdir('/Users/bill/Documents/web/LocalServer/prank')
    new_path = os.getcwd()
    print("Our current working directory is ", new_path)
    #(2) For each file, rename filename
    for file_name in file_list:
        #print("Old Name - " + file_name)
        #print("New Name - " + file_name.translate("0123457689"))
        os.rename(file_name, ''.join([i for i in file_name if not i.isdigit()])) # This works on my machine

    os.chdir(saved_path)
    print("Our current working directory is ", saved_path)

rename_files()

您的问题是您使用 .translate() 不正确。它根本不改变文件名,所以 rename 实际上将 X 重命名为 X:

'68chicago.jpg'.translate('0123457689')
# '68chicago.jpg'

尝试使用列表理解:

def clean_name(name):
  return ''.join(x for x in name if not x.isdigit())
# 'chicago.jpg'

主要问题是您的代码没有以正确的方式使用 str.translate() 方法——您需要将其传递给翻译 table 才能正常工作。

以下内容有效并避免重命名不需要的文件(即不将它们重命名为当前名称)。这需要一些额外的处理,但可能比执行无用的 OS-level 操作更快。

注意: 更强大的解决方案还需要处理 os.rename() 调用可能引发的任何异常——这肯定会由于多种原因而发生。

例如:

  • 可能已经存在具有翻译名称的文件。
  • 原始文件的所有字符都被删除,因此新文件名是空字符串。
  • 文件权限或属性阻止重命名。
  • 等等

代码:

from contextlib import contextmanager
import string
import os

@contextmanager
def temp_cd(path):
    """Temporarily change the current directory to path, yield, then restore it."""
    saved_path = os.getcwd()
    yield
    os.chdir(saved_path)

def rename_files(path):
    TRANS_TABLE = str.maketrans(dict.fromkeys(string.digits))
    with temp_cd(path):
        for file_name in os.listdir(path):
            if any(ch in file_name for ch in string.digits):
#                os.rename(file_name, file_name.translate(TRANS_TABLE))
                print(file_name, '->', file_name.translate(TRANS_TABLE))

rename_files("/Users/bill/Documents/web/LocalServer/prank")

这是一个不需要改变当前目录的版本。只需指定要重命名文件的目录即可。如果指定新旧名称的完整路径,则不需要更改目录。

这也展示了如何正确使用 translatemaketrans 接受一个、两个或三个参数(参见 docs)。 three-parameter 版本采用两个等长的字符串进行 1:1 翻译,加上要删除的第三个字符参数。它 returns 适合与 translate.

一起使用的字典
import os

def rename_files(directory):
    xlat = str.maketrans('','','0123457689')
    file_list = os.listdir(directory)
    for file_name in file_list:
        old_name = os.path.join(directory,file_name)
        new_name = os.path.join(directory,file_name.translate(xlat))
        os.rename(old_name,new_name)

rename_files('/Users/bill/Documents/web/LocalServer/prank')