Перемещение определенных типов файлов с помощью Python

Я знаю, что многим из вас это будет досадно легко. Я только начинаю изучать Python и нуждаюсь в помощи с некоторыми основами обработки файлов.

Я делаю много скриншотов, которые в конечном итоге на моем рабочем столе (так как это настройка по умолчанию). Я знаю, что могу изменить настройку скриншота, чтобы автоматически сохранить ее в другом месте. Тем не менее, я думаю, что эта программа будет хорошим способом научить меня сортировать файлы. Я хотел бы использовать python для автоматической сортировки всех файлов на моем рабочем столе, определения тех, которые заканчиваются на.png (тип файла по умолчанию для скриншотов), и просто переместить его в папку, которую я назвал "Архив".

Вот что у меня так далеко:

import os
import shutil
source = os.listdir('/Users/kevinconnell/Desktop/Test_Folder/')
destination = 'Archive'
for files in source:
    if files.endswith('.png'):
        shutil.move(source, destination)

Я играл с этим много, но безрезультатно. В этой последней версии я сталкиваюсь со следующей ошибкой при запуске программы:

Трассировка (последний вызов был последним): файл "pngmove_2.0.py", строка 23, в файле shutil.move(источник, место назначения) "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", строка 290, в шаге TypeError: приведение к Unicode: нужна строка или буфер, список найден

У меня сложилось впечатление, что у меня есть своего рода проблема с правильным соглашением / синтаксисом, необходимым для источника и места назначения. Тем не менее, я до сих пор не смог найти много помощи о том, как это исправить. Я использовал os.path.abspath(), чтобы определить путь к файлу, который вы видите выше.

Заранее спасибо за любую помощь в сохранении моего здравомыслия.

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ

Я считаю, что я очень близок к пониманию этого. Я уверен, что если я продолжу играть с этим, я пойму это. Просто так, что все, кто помогал мне, обновляются...

Это текущий код, с которым я работаю:

import os
import shutil
sourcepath ='/Users/kevinconnell/Desktop/'
source = os.listdir(sourcepath)
destinationpath = '/Users/kevinconnell/Desktop/'
for files in source:
    if files.endswith('.png'):
        shutil.move(os.path.join(sourcepath,'Test_Folder'), os.path.join(destinationpath,'Archive'))

Это работает для переименования моей папки "Test_Folder" в "Архив". Однако он перемещает все файлы в папке, а не файлы, заканчивающиеся на ".png".

4 ответа

Вы пытаетесь переместить всю исходную папку, вам нужно указать путь к файлу

import os
import shutil
sourcepath='C:/Users/kevinconnell/Desktop/Test_Folder/'
sourcefiles = os.listdir(sourcepath)
destinationpath = 'C:/Users/kevinconnell/Desktop/Test_Folder/Archive'
for file in sourcefiles:
    if file.endswith('.png'):
        shutil.move(os.path.join(sourcepath,file), os.path.join(destinationpath,file))

Другой вариант - использовать модуль glob, который позволяет указать маску файла и получить список желаемых файлов. Это должно быть так просто, как

import glob
import shutil

# I prefer to set path and mask as variables, but of course you can use values
# inside glob() and move()

source_files='/Users/kevinconnell/Desktop/Test_Folder/*.png'
target_folder='/Users/kevinconnell/Dekstop/Test_Folder/Archive'

# retrieve file list
filelist=glob.glob(source_files)
for single_file in filemask:
     # move file with full paths as shutil.move() parameters
    shutil.move(single_file,target_folder) 

Тем не менее, если вы используете glob или os.listdir, не забудьте указать полные пути для исходного файла и цели.

На основании ответа @Gabriels. Я приложил некоторые усилия для этого, так как мне нравится "классифицировать" типы файлов по папкам. Я сейчас использую это.

Я считаю, что это то, что вы ищете, это было весело, чтобы выяснить,

Этот сценарий:

  • Показывает файлы примеров, которые нужно переместить, пока вы не раскомментируете shutil.move
  • Находится в Python3
  • Был разработан на MacOSX
  • Папки для вас не создадут, выдаст ошибку
  • Можно найти и переместить файлы с желаемым расширением
  • Может использоваться для игнорирования папок
    • Включая папку назначения, если она будет вложена в вашу папку поиска
  • Можно найти в моем Github Repo

Пример из терминала:

$ python organize_files.py
filetomove: /Users/jkirchoff/Desktop/Screen Shot 2018-05-15 at 12.16.21 AM.png
movingfileto: /Users/jkirchoff/Pictures/Archive/Screen Shot 2018-05-15 at 12.16.21 AM.png

Автор сценария:

Я назвал organiz_files.py

#!/usr/bin/env python3

# =============================================================================
# Created On  : MAC OSX High Sierra 10.13.4 (17E199)
# Created By  : Jeromie Kirchoff
# Created Date: Mon May 14 21:46:03 PDT 2018
# =============================================================================
# Answer for: https://stackru.com/a/23561726/1896134 PNG Archive
# NOTE: THIS WILL NOT CREATE THE DESTINATION FOLDER(S)
# =============================================================================

import os
import shutil

file_extensn = '.png'
mac_username = 'jkirchoff'

search_dir = '/Users/' + mac_username + '/Desktop/'
target_foldr = '/Users/' + mac_username + '/Pictures/Archive/'
ignore_fldrs = [target_foldr,
                '/Users/' + mac_username + '/Documents/',
                '/Users/' + mac_username + '/AnotherFolder/'
                ]

for subdir, dirs, files in os.walk(search_dir):
    for file in files:
        if subdir not in ignore_fldrs and file.endswith(file_extensn):
            # print('I would Move this file: ' + str(subdir) + str(file)
            #       # + "\n To this folder:" + str(target_foldr) + str(file)
            #       )

            filetomove = (str(subdir) + str(file))
            movingfileto = (str(target_foldr) + str(file))
            print("filetomove: " + str(filetomove))
            print("movingfileto: " + str(movingfileto))

            # =================================================================
            # IF YOU ARE HAPPY WITH THE RESULTS
            # UNCOMMENT THE SHUTIL TO MOVE THE FILES
            # =================================================================
            # shutil.move(filetomove, movingfileto)

            pass
        elif file.endswith(file_extensn):
            # print('Theres no need to move these files: '
            #       + str(subdir) + str(file))
            pass
        else:
            # print('Theres no need to move these files either: '
            #       + str(subdir) + str(file))
            pass
import os
import shutil
Folder_Target = input("Path Target which Contain The File Need To Move it: ")
File_Extension = input("What Is The File Extension ? [For Example >> pdf , txt , exe , ...etc] : ")
Folder_Path = input("Path To Move in it : ")
Transformes_Loges = input("Path To Send Logs Of Operation in : ")
x=0
file_logs=open(Transformes_Loges+"\\Logs.txt",mode="a+")

for folder, sub_folder, file in os.walk(Folder_Target):
    for sub_folder in file:
        if os.path.join(folder, sub_folder)[-3:]==File_Extension:
           path= os.path.join(folder, sub_folder)
           file_logs.write(path+" =====================  Was Moved to ========================>> "+Folder_Path )
           file_logs.write("\n")
           shutil.move(path, Folder_Path)
           x+=1
file_logs.close()
print("["+str(x)+"]"+"File Transformed")
Другие вопросы по тегам