【问题标题】:How to move all .log and .txt files to a new folder如何将所有 .log 和 .txt 文件移动到新文件夹
【发布时间】:2011-06-23 19:48:13
【问题描述】:

我无法弄清楚如何将某个文件夹及其子目录中的所有 .log 和 .txt 文件移动到新文件夹中。我了解如何使用shutil 移动一个文件。但是,我尝试使用循环来移动所有内容,但未成功。有人可以帮我弄这个吗?谢谢....

 import os, os.path
 import re




 def print_tgzLogs (arg, dir, files):
   for file in files:
      path = os.path.join (dir, file)
      path = os.path.normcase (path)
      defaultFolder = "Log_Text_Files"
      if not defaultFolder.endswith(':') and not os.path.exists('c:\\Extracted\Log_Text_Files'):
         os.mkdir('C:\\Extracted\\Log_Text_Files')
      if re.search(r".*\.txt$", path) or re.search(r".*\.log$", path):

         os.rename(path, 'C:\\Extracted\\Log_Text_Files')
         print path


 os.path.walk('C:\\Extracted\\storage', print_tgzLogs, 0)

以下是回溯错误:

    Traceback (most recent call last):
  File "C:\SQA_log\scan.py", line 20, in <module>
    os.path.walk('C:\\Extracted\\storage', print_tgzLogs, 0)
  File "C:\Python27\lib\ntpath.py", line 263, in walk
    walk(name, func, arg)
  File "C:\Python27\lib\ntpath.py", line 263, in walk
    walk(name, func, arg)
  File "C:\Python27\lib\ntpath.py", line 263, in walk
    walk(name, func, arg)
  File "C:\Python27\lib\ntpath.py", line 259, in walk
    func(arg, top, names)
  File "C:\SQA_log\scan.py", line 16, in print_tgzLogs
    os.rename(path, 'C:\\Extracted\\Log_Text_Files')
WindowsError: [Error 183] Cannot create a file when that file already exists

【问题讨论】:

  • 您可以轻松地使用 path.endswith(".txt") 而不是 re.search(r".*\.txt$", path)。
  • copy multiple files in python 的可能重复项
  • @Zsolt Botkai - 问题是同时移动所有 .log 和 .txt 文件。
  • 不应该shutil.move('time.log', 'C:\\...')shutil.move(path, 'C:\\...')
  • 我也有点困惑,为什么您在硬编码值 (time.log) 上使用 shutil.move 而不是变量 path...

标签: python shutil


【解决方案1】:

根据回溯,日志文件已经存在。 os.rename 的 Python 文档说:

在 Windows 上,如果 dst 已经存在,则会引发 OSError [...]

现在您可以:

如果您希望自动删除文件,代码如下所示(请注意,我按照 utdemir 的建议将您的正则表达式替换为 python endswith):

import os, os.path

def print_tgzLogs (arg, dir, files):
    for file in files:
        path = os.path.join (dir, file)
        path = os.path.normcase (path)
        defaultFolder = "Log_Text_Files"
        if not defaultFolder.endswith(':') and not os.path.exists('c:\\Extracted\Log_Text_Files'):
            os.mkdir('C:\\Extracted\\Log_Text_Files')
        if path.endswith(".txt") or path.endswith(".log"):
            if os.path.exists('C:\\Extracted\\Log_Text_Files\\%s' % file):
                os.remove('C:\\Extracted\\Log_Text_Files\\%s' % file)
            os.rename(path, 'C:\\Extracted\\Log_Text_Files\\%s' % file)
            print path

os.path.walk('C:\\Extracted\\storage', print_tgzLogs, 0)

【讨论】:

  • os.rename 不接受目录名称。使用 shutil.move 或构建包含文件名的目标路径。
【解决方案2】:

看起来正在尝试使用

os.rename(path, 'C:\\Extracted\\Log_Text_Files')

将文件路径移动到目录 C:\Extracted\Log_Text_Files,但重命名不能像这样工作:它将尝试创建一个名为 C:\Extracted\Log_Text_Files 的新文件。你可能想要更多这样的东西:

os.rename(path, os.path.join('C:\\Extracted\\Log_Text_Files',os.path.basename(path))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2020-08-30
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多