Комментарии 59
P.S. кажется, я не учёл, что если последовать вашим рекомендациям, он, видимо, и заработает и там. Тем они (рекомендации) ещё ценнее
Это не попытка указать на ошибки, а попытка умничать. В этом случае человек пытается выдать свой опыт за то, что делают другие. Чего делать не стоит. Обратите внимание на нормальные указания на ошибки и мою реакцию — увидите разницу. Я с радостью воспринимаю и принимаю критику, но только если это критика, а не выпендреж.
Ну так у меня и прописан вариант для русской версии установки. Я не заявлял нигде, что этот код будет работать на всех локализациях Linux. Вы читайте внимательно — в первую очередь я делал это для себя. У меня русская версия Archlinux, Windows в виртуалке. На основании этого и делал. Зачем в таком случае требовать универсальности? Если её изначально не заявлено на данный момент.
Особенно, если учесть использование жутких антипаттернов.
Например все эти 4 словаря можно преобразовать к одному словарю типа:
folders = {
"Видео/": [".3gp", ".avi", ".flv", ".m4v", ".mkv", ".mov", ".mp4", ".wmv", ".webm"],
"Музыка/": [".mp3", ".aac", ".flac", ".mpc", ".wma", ".wav"],
"Изображения/": [".raw", ".jpg", ".tiff", ".psd", ".bmp", ".gif", ".png", ".jp2", ".jpeg"],
"Документы/": [".doc", ".docx", ".txt", ".rtf", ".pdf", ".fb2", ".djvu", ".xls", ".xlsx", ".ppt", ".pptx", ".mdb", ".accdb", ".rar", ".zip", ".7z"]
}
Тогда потом получится один маленький цикл на 4 итерации. А Наличие расширения в списке можно проверять оператором in.
Например что-то типа такого:
ext = #тут вы получаете расширение файла
for folder, ext_list in folders.items():
if ext in ext_list:
#ваш код
extension_folder = {ext: folder for folder, ext in folders.items()}
ext = ...
folder = extension_folder.get(ext)
...
C:/Users/имяпользователя/Downloads/В разных версиях Windows эта папка находится в других местах. И это по-умолчанию, так как её можно переместить или переопределить, опять же в зависимости от версии Windows/
В версиях с 7 до 10 папка загрузок всегда находится по одному пути. Проверено уже. А вот возможность переноса это да — я это не учитывал намеренно пока что.
- Windows установлена на диске C:
- Профиль пользователя находится в C:/Users/имяпользователя/
- пользователь никуда не переместил папку загрузок
- пользователь не переопределил путь к папке загрузок
Не многовато ли оговорок для того, чтобы ваши слова соответствовали истине?
ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%80%D0%B5%D0%B4%D1%8B
Но это явно не стандартный путь. Вариант, при котором папка перемещена пользователем я пока что не рассматривал даже.
Очень напомнило мою первую программу на питоне восьмилетней давности, правда я там всё же выбрал регекспы :)
Есть ли несложный способ для выполнения этой задачи?
shell>: export OUTDIR=~/tmp/mp3; mkdir $OUTDIR; find /mnt/disk/ -type f -name "*.mp3" -print -exec cp {} $OUTDIR \;
Данная команда найдет все mp3-файлы в каталоге /mnt/disk (куда примонтирован диск) и скопирует их в созданный каталог tmp/mp3 в домашнем каталоге пользователя.
Если я правильно понял задачу.
Если нужно переместить, то «cp» меняется на «mv», но сперва лучше попробовать с копированием =)
Это решение в лоб, но по хорошему надо сразу автоматом анализировать типы файлов, создавать соответственно каталоги и копировать туда.
os.path.join(root, dir)
Спрашивать у пользователя в тексте ввод директории не очень для него удобно. Легко допустить ошибку при вводе. Навреное лучше подключиться к одной из гуи библиотек и показать нормальное окно выбора директории. что-то типа PyWx или PyQt подойдет, хотя конечно подключать их для одного окна это жуткий оверкилл ( хотя кого я обманываю сейчас весь софт так пишется ).
Код использующий pathlib
очень плохо читается и слишком неявный в отличии от os.path.join
.
В одном открытом проекте встречал:
path = long_var_name_a / long_var_name_b /
long_var_name_c / long_var_name_d / long_var_name_e
Вместо:
path = os.path.join(
long_var_name_a,
long_var_name_b,
long_var_name_c,
long_var_name_d,
long_var_name_e,
)
Форматирование это только одна проблема. Если не держать в голове, что в переменных пути, придётся отматывать контекст назад, пытаясь понять, что же здесь на что делится. С join
такой проблемы нет, он задаёт контекст сразу же.
Да можно же использовать tkinter, который на windows к тому же идет в комплекте с питоном. Системный диалог выбор директории, реализуется в одну строчку (кроме импорта конечно же)
import os
import shutil
import json
from tkinter import (
BOTTOM,
Button,
E,
Frame,
Label,
StringVar,
Tk,
W,
X,
filedialog,
mainloop,
)
from pathlib import Path, PurePath
def browse_button():
global folder_path
filename = filedialog.askdirectory()
folder_path.set(filename)
def clean_button():
global folder_path
os_path = Path(folder_path.get())
with open("config.json", "r", encoding="utf8") as config_file:
folders = json.load(config_file)
for k in folders.keys():
for f in os.listdir(os_path):
print(PurePath(f).suffix, PurePath(f).suffix.lstrip("."))
if (
len(PurePath(f).suffix) > 1
and PurePath(f).suffix.lstrip(".") in folders[k]
):
try:
shutil.move(Path(f"{os_path}\\{f}"), Path(f"{os_path}\\{k}\\{f}"))
except Exception as e:
print(e.args)
os.makedirs(Path(f"{os_path}\\{k}\\"))
shutil.move(Path(f"{os_path}\\{f}"), Path(f"{os_path}\\{k}\\{f}"))
root = Tk()
root.title("Выбор каталога Загрузок") # Add a title
root.minsize(400, 20)
folder_path = StringVar()
main_frame = Frame(root)
main_frame.pack(fill=X, side=BOTTOM)
path_label = Label(main_frame, textvariable=folder_path)
clean_button = Button(main_frame, text="Очистить", command=clean_button)
browse_button = Button(main_frame, text="Выбрать", command=browse_button)
main_frame.columnconfigure(0, weight=5)
main_frame.columnconfigure(1, weight=1)
main_frame.columnconfigure(2, weight=1)
path_label.grid(row=0, column=0, sticky=W + E)
clean_button.grid(row=0, column=1, sticky=W + E)
browse_button.grid(row=0, column=2, sticky=W + E)
mainloop()
{
"Видео": [
"3gp",
"avi",
"flv",
"m4v",
"mkv",
"mov",
"mp4",
"wmv",
"webm"
],
"Музыка": [
"mp3",
"aac",
"flac",
"mpc",
"wma",
"wav"
],
"Изображения": [
"raw",
"jpg",
"tiff",
"psd",
"bmp",
"gif",
"png",
"jp2",
"jpeg"
],
"Документы": [
"doc",
"docx",
"txt",
"rtf",
"pdf",
"fb2",
"djvu",
"xls",
"xlsx",
"ppt",
"pptx",
"mdb",
"accdb"
],
"Архивы": [
"rar",
"zip",
"7z",
"gz",
"iso"
],
"Программы": [
"exe",
"msi",
"apk"
],
"Торренты": [
"torrent"
]
}
Очищаем папку с загрузками при помощи программы на Python