Как переместить все файлы .log и .txt в новую папку - PullRequest
0 голосов
/ 23 июня 2011

У меня проблемы с выяснением того, как переместить все файлы .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 голос
/ 24 июня 2011

Похоже, пытаются использовать

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))
1 голос
/ 24 июня 2011

Согласно трассировке, лог-файлы уже существуют.Документы Python для os.rename говорят:

В Windows, если dst уже существует, OSError будет повышен [...] .

Теперь вы можете либо:

  • удалить файлы вручную, либо
  • удалить файлы автоматически с помощью os.remove(path)

Если вы хотите, чтобы файлы автоматически удалялись, код будет выглядеть следующим образом (обратите внимание, что я заменил ваше регулярное выражение на 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)
...