Перемещение определенных типов файлов с помощью 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")