罗萨 发表于 2023-6-29 16:30

py语言,把同名的不同格式文件,放到同一个文件夹中

#这里是把同名的doc文件与png文件放到同一个名字的文件夹中,由GPT生成
import os
import shutil

# 获取当前工作目录
current_directory = os.getcwd()

# 遍历当前目录下的所有文件
for filename in os.listdir(current_directory):
    if filename.endswith('.png'):
      png_file = os.path.join(current_directory, filename)
      doc_file = os.path.join(current_directory, filename[:-4] + '.doc')

      # 创建同名的文件夹
      folder_path = os.path.join(current_directory, filename[:-4])
      os.makedirs(folder_path, exist_ok=True)

      try:
            # 移动PNG文件和DOC文件到同名文件夹中
            shutil.move(png_file, folder_path)
            shutil.move(doc_file, folder_path)
      except FileNotFoundError:
            pass

pjy612 发表于 2023-6-29 17:35

为什么不先遍历目录 文件列表先弄出来。
然后 文件名 通过 去除后缀 后 分组。
然后 再直接根据 分组 批量 创建 目录和移动文件?

罗萨 发表于 2023-6-29 18:06

pjy612 发表于 2023-6-29 17:35
为什么不先遍历目录 文件列表先弄出来。
然后 文件名 通过 去除后缀 后 分组。
然后 再直接根据 分组 批 ...

#您提出的修改方案非常合理,将文件列表先获取出来,然后根据文件名分组进行批量处理,可以提高代码的效率和可读性。下面是按照您的建议重构的代码:

python
import os
import shutil

# 获取当前工作目录
current_directory = os.getcwd()

# 存储文件分组的字典
file_groups = {}

# 遍历当前目录下的所有文件
for filename in os.listdir(current_directory):
    if filename.endswith('.png'):
      # 获取文件名(去除扩展名)
      file_name = os.path.splitext(filename)
      
      # 将文件添加到对应的分组中
      if file_name in file_groups:
            file_groups.append(filename)
      else:
            file_groups =

# 处理每个分组
for file_name, file_list in file_groups.items():
    # 创建同名的文件夹
    folder_path = os.path.join(current_directory, file_name)
    os.makedirs(folder_path, exist_ok=True)

    # 移动文件到同名文件夹中
    for file in file_list:
      file_path = os.path.join(current_directory, file)
      shutil.move(file_path, folder_path)
#通过这种方式,我们首先遍历整个目录,将.png文件按照文件名分组存储在一个字典中。然后,我们依次处理每个分组,创建以文件名命名的文件夹,并将相应的文件移动到该文件夹中。

这样的做法使得代码更加清晰和可扩展,并避免了重复计算文件名。

如果您有任何其他问题,请随时提问。

pjy612 发表于 2023-6-29 18:38

。。。您变成了 GPT?。。。
这样的话 还需要if filename.endswith('.png'):吗?
{:301_995:}

平淡最真 发表于 2023-6-29 18:45

你可以问让它用批处理写一下,你会发现代码就5行以内吧

罗萨 发表于 2023-6-29 20:49

平淡最真 发表于 2023-6-29 18:45
你可以问让它用批处理写一下,你会发现代码就5行以内吧

@echo off

REM 获取当前工作目录
set "current_directory=%cd%"

REM 创建存储文件分组的字典
setlocal enabledelayedexpansion

REM 遍历当前目录下的所有文件
for /r "%current_directory%" %%F in (*.png) do (
    REM 获取文件名(去除扩展名)
    set "filename=%%~nF"
   
    REM 将文件添加到对应的分组中
    if defined file_groups[!filename!] (
      set "file_groups[!filename!]=!file_groups[!filename!]!;%%~fF"
    ) else (
      set "file_groups[!filename!]=%%~fF"
    )
)

REM 处理每个分组
for /f "tokens=2,3 delims==;" %%G in ('set file_groups[') do (
    REM 创建同名的文件夹
    set "folder_path=%current_directory%\%%G"
    mkdir "!folder_path!"

    REM 移动文件到同名文件夹中
    for %%F in (%%H) do (
      move "%%~F" "!folder_path!"
    )
)

endlocal

hrh123 发表于 2023-6-29 21:03

为什么不直接`if file.startswith('')`

平淡最真 发表于 2023-6-29 22:03

罗萨 发表于 2023-6-29 20:49
@echo off

REM 获取当前工作目录


写的太复杂了
@echo off
for /f "delims=" %%a in ('dir /b *.doc *.png') do (
md %%~na 2>nul
move %%a %%~na
)

archer0258 发表于 2023-6-30 10:33

本帖最后由 archer0258 于 2023-6-30 10:38 编辑

import shutil
from pathlib import Path

p = Path('') # 你的文件夹
for i in p.rglob('*.*'):
    d = p / i.stem
    d.mkdir(exist_ok=True)
    if not (d / i.name).exists():
      shutil.copy(i, d)
      i.unlink()

罗萨 发表于 2023-6-30 12:37

平淡最真 发表于 2023-6-29 22:03
写的太复杂了
@echo off
for /f "delims=" %%a in ('dir /b *.doc *.png') do ( ...

@echo off

for %%F in (*.png *.doc) do (
    mkdir "%%~nF" 2>nul
    move "%%~F" "%%~nF"
)
页: [1]
查看完整版本: py语言,把同名的不同格式文件,放到同一个文件夹中