如何将所有.log和.txt文件移动到新文件夹

0 投票
2 回答
1873 浏览
提问于 2025-04-16 20:10

我在想办法把某个文件夹及其子文件夹里的所有.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

2 个回答

1

看起来你是想用

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

把文件移动到 C:\Extracted\Log_Text_Files 这个文件夹里,但 rename 这个方法并不是这样工作的:它会试图创建一个名为 C:\Extracted\Log_Text_Files 的新文件。你可能想要的是这样的操作:

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

根据错误信息,日志文件已经存在了。Python的文档中提到,关于os.rename的说明是:

在Windows系统上,如果目标文件(dst)已经存在,就会出现OSError错误 [...]

现在你可以选择:

  • 手动删除这些文件,或者
  • 使用os.remove(path)自动删除这些文件。

如果你想让文件自动删除,代码可以这样写(注意我把你的正则表达式换成了Python的endswith,这是utdemir的建议):

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)

撰写回答