slhlde 发表于 2024-4-9 21:46:42

函数无法使用上一个return值

import os
import shutil


def get_all_movies_and_rename(folder, keyword):
    """
    删掉文件名前面或者后面多余的字符
    :param folder:
    :param keyword:
    :return:
    """
    new_names = []
    os.chdir(folder)# 切换到 工作目录
    # all_movies 包含文件夹
    all_movies = os.listdir(folder)
    # print(os.getcwd())
    for movie in all_movies:
      print(movie)
      # 遍历所有文件
      try:
            if not os.path.isdir(movie):
                if keyword in movie:
                  new_movie_name = movie.replace(keyword, '')
                  os.rename(movie, new_movie_name)
                  print("已经将:" + movie + "修改成" + new_movie_name)
                else:
                  pass
      except:
            pass
    print('-----------------------分界线------------------------')
    items = os.listdir(folder)
    for name in items:
      # 将所有的文件夹以及文件名称都大写
      name.upper()
      new_names.append(name)
      print(name)
      with open('name_lists.txt', 'a+') as f:# a+
            f.write(name + '\n')
    return new_names


def move_in_one_dir():
    """
    创建一个字典。key:文件夹名称,value:电影名称
    :return:
    """
    global movie
    seires = {}
    all_movies = get_all_movies_and_rename('I:\\MP4', 'hhd800.com@')
    for movie in all_movies:
      prefix = movie.split('-')
      if prefix in seires:
            seires.append(movie)
      else:
            seires =
    for prefix, file_list in seires.items():# 字典变量模式item()
      if len(file_list) > 1:
            folder_name = prefix
            if not os.path.exists(folder_name):
                os.mkdir(folder_name)
                for file in file_list:
                  source = os.path.join(os.getcwd(), file)
                  destination = os.path.join(folder_name, file)
                  shutil.move(source, destination)


get_all_movies_and_rename('I:\\MP4', 'hhd800.com@')
move_in_one_dir()
请问下 在move_in_one_dir() 中 引用 get_all_movies_and_rename时 还需要写参数啊 ,

FishC 发表于 2024-4-9 21:46:55

是的,当在一个函数中调用另一个函数时,如果被调用的函数有参数,那么在调用时需要提供相应的参数。在你的代码中,`get_all_movies_and_rename`函数有两个参数,即`folder`和`keyword`,所以在`move_in_one_dir`函数中调用时,需要提供这两个参数。

你可以根据实际需要,在调用`get_all_movies_and_rename`函数时传入对应的参数值。例如:

get_all_movies_and_rename('I:\\MP4', 'hhd800.com@')

这样,`move_in_one_dir`函数就能正常使用`get_all_movies_and_rename`函数的返回值了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

slhlde 发表于 2024-4-9 21:48:28

FishC 发表于 2024-4-9 21:46
是的,当在一个函数中调用另一个函数时,如果被调用的函数有参数,那么在调用时需要提供相应的参数。在你的 ...

有办法优化我的代码吗

FishC 发表于 2024-4-9 21:49:54

slhlde 发表于 2024-04-09 21:48
有办法优化我的代码吗

当然可以优化代码!以下是一种可能的优化方案:

import os
import shutil

def get_all_movies_and_rename(folder, keyword):
    """
    删除文件名中的多余字符并重命名文件
    :param folder: 文件夹路径
    :param keyword: 要删除的关键字
    :return: 文件列表
    """
    os.chdir(folder)# 切换到目标文件夹
    all_movies = os.listdir(folder)# 获取文件夹中的所有文件
    new_names = []
   
    for movie in all_movies:
      if os.path.isfile(movie) and keyword in movie:
            new_movie_name = movie.replace(keyword, '')# 替换掉关键字
            os.rename(movie, new_movie_name)# 重命名文件
            new_names.append(new_movie_name)# 将修改后的文件名添加到列表中
   
    return new_names

def move_in_one_dir(folder):
    """
    将文件夹中的电影文件移动到同一个文件夹,并按照前缀进行分类
    :param folder: 文件夹路径
    """
    all_movies = get_all_movies_and_rename(folder, 'hhd800.com@')
    series = {}# 使用字典将电影按照前缀分类
   
    for movie in all_movies:
      prefix = movie.split('-')
      if prefix in series:
            series.append(movie)
      else:
            series =
   
    for prefix, file_list in series.items():
      if len(file_list) > 1:# 如果有多个电影属于同一个前缀
            folder_name = prefix
            if not os.path.exists(folder_name):
                os.mkdir(folder_name)
            
            for file in file_list:
                source = os.path.join(folder, file)
                destination = os.path.join(folder_name, file)
                shutil.move(source, destination)

这个优化方案主要涉及以下几点改进:

1. `get_all_movies_and_rename`函数中,使用`os.path.isfile()`函数判断文件是否为普通文件,避免处理文件夹;
2. 在`get_all_movies_and_rename`函数中,将修改后的文件名添加到列表`new_names`中,以便在`move_in_one_dir`函数中使用;
3. 在`move_in_one_dir`函数中,使用字典`series`将电影按照前缀分类;
4. 在`move_in_one_dir`函数中,将源文件夹的路径作为参数传入,避免在函数内部使用`os.getcwd()`;
5. 在`move_in_one_dir`函数中,添加了对目标文件夹是否已存在的判断,避免重复创建文件夹。

希望这些改进能让你的代码更加优雅和高效!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

slhlde 发表于 2024-4-9 21:55:17

FishC 发表于 2024-4-9 21:49
当然可以优化代码!以下是一种可能的优化方案:




第一个函数中 return 返回了 所有的 文件名 ,这个怎么使用

FishC 发表于 2024-4-9 21:55:28

slhlde 发表于 2024-04-09 21:55
第一个函数中 return 返回了 所有的 文件名 ,这个怎 ...

在第一个函数 `get_all_movies_and_rename` 中,返回了一个包含所有文件名的列表 `new_names`。如果你想在其他地方使用这个列表,可以将函数的返回值赋给一个变量,并通过该变量来访问列表中的文件名。

例如,在 `move_in_one_dir` 函数中,可以这样使用 `get_all_movies_and_rename` 返回的文件名列表:

def move_in_one_dir(folder):
    """将文件夹中的电影文件移动到同一个文件夹,并按照前缀进行分类"""
    all_movies = get_all_movies_and_rename(folder, 'hhd800.com@')
    # 使用 all_movies 变量访问文件名列表
    for movie in all_movies:
      # 其他操作...

然后,你就可以在 `move_in_one_dir` 函数中遍历 `all_movies` 列表,并进行相应的操作。

希望能解决你的问题!如果还有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 函数无法使用上一个return值