Как я могу реорганизовать файлы по расширению и сортировать их по папкам по категориям?

Это работало для меня, под 16.04 LTS.

Установить libmtp, файловую систему FUSE для устройств с поддержкой MTP mtpfs, используя команды
sudo apt-get install go-mtpfs
sudo apt-get install libmtp
sudo apt-get install mtpfs mtp-tools

CROSSED

Установите libmtp, файловую систему FUSE для устройств с поддержкой MTP mtpfs, используя следующие команды:
sudo apt-get install go-mtpfs
sudo apt-get install libmtp
sudo apt-get install mtpfs mtp-tools

Установить libmtp, файловую систему FUSE для Устройства MTP с поддержкой mtpfs, используя ниже команды

Запустите команду ниже в терминале, чтобы узнать идентификатор устройства и т. Д. Вы можете увидеть VID и PID в выводе команды для вашего устройства. Запишите эти два числа.
$ mtp-detect
Откройте файл правил Android с помощью текстового редактора, используя команду ниже.
sudo gedit /etc/udev/rules.d/51-android.rules
Введите строку ниже, используя VID и PID вашего устройства в файле 51-android.rules. Сохраните и закройте файл.
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="2e82", MODE="0666"
Запустите команду ниже, чтобы перезапустить диспетчер устройств.
sudo service udev restart
Следующие шаги в основном необходимы для доступа к содержимому внешней SD-карты памяти вашего устройства Android. Я должен был сделать это, потому что файловый менеджер НЕ показывал содержимое SD-карты. Однако это не решение, но это работа, которая работает для большинства пользователей в соответствии с этим сообщением в форуме Google и работает для моего Motorola G 2nd Gen с SD-картой SanDisk. Безопасное удаление подключенного устройства в Ubuntu. Выключите устройство. Извлеките SD-карту с устройства. Включите устройство без SD-карты. Выключите устройство еще раз. Верните SD-карту и снова включите устройство. Перезагрузите компьютер Ubuntu и подключите устройство Android. Теперь вы можете увидеть содержимое внутреннего хранилища устройства Android и содержимое SD-карты.
1
задан 9 January 2016 в 00:24

2 ответа

Python чувствителен к пробелу, это означает, что вы должны правильно отпечатать код; в противном случае вы получите ошибки ...

После блока if вам нужно отступить от кода, вы можете использовать Tab для этого.

Ваш код должен выглядеть так: это:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/media/ashwin/Work+Entertainment/Untitled Folder"
exclude = () 
remove_emptyfolders = True
# ---------------------------------------------------------

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = ".hidden_files"
        elif not "." in name:
            extension = ".without_extension"
        else:
            extension = name[name.rfind("."):]
        if not extension in exclude:
            if extension==".jpeg" or extension==".jpg" or extension==".JPG" or extension==".png" or extension==".PNG":
                new_dir = reorg_dir+"/Pictures"
            elif extension==".docx" or extension==".doc" or extension==".pdf" or extension==".xlsx" or extension==".ppt" or extension==".pptx":
                new_dir = reorg_dir+"/Documents"
            elif extension==".mp3" or extension==".MP3":
                new_dir = reorg_dir+"/Songs"
            elif extension==".mp4" or extension==".MP4" or extension==".avi" or extension==".AVI":
                new_dir = reorg_dir+"/Videos"
            elif extension==".db" or extension==".DB":
                new_dir = reorg_dir+"/Databases"
            elif extension=="*.*":
                new_dir = reorg_dir+"/Others"

        if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.move(subject, newfile)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()
1
ответ дан 23 May 2018 в 14:27

Что вы на самом деле хотите

Глядя на ваше редактирование, вы действительно хотите создать папки:

Картинки Документы Песни Видео База данных Другие

Вместо из папок, названных в честь расширений, как в исходном скрипте.

Принцип

Первое правило всегда: если вы делаете то же самое более одного раза, сделайте его функцией. Повторяя одно и то же, излишне многословно, ваш код трудно поддерживать (изменять), исчерпывающе читать и выглядеть уродливо.

Использование функции вместо:

if extension==".jpeg" or extension==".jpg" or extension==".JPG" or extension==".png" or extension==".PNG":
new_dir = reorg_dir+"/Pictures"
elif extension==".docx" or extension==".doc" or extension==".pdf" or extension==".xlsx" or extension==".ppt" or extension==".pptx":
new_dir = reorg_dir+"/Documents"
elif extension==".mp3" or extension==".MP3":
new_dir = reorg_dir+"/Songs"
elif extension==".mp4" or extension==".MP4" or extension==".avi" or extension==".AVI":
new_dir = reorg_dir+"/Videos"
elif extension==".db" or extension==".DB":
new_dir = reorg_dir+"/Databases"
elif extension=="*.*":
    new_dir = reorg_dir+"/Others"

Вы может использовать:

def dir_names(ext):
    extensions = [
        [["jpeg", "jpg", "png"], "Pictures"],
        [["mp4", "avi"], "Videos"],
        [["docx", "doc", "pdf", "xlsx", "ppt", "pptx"], "Documents"],
        [["mp3"], "Songs"],
        [["db"], "Database"],
        ]
    match = [item[1] for item in extensions if ext.lower() in item[0]]
    return match[0] if match else "Others"

«Рассчитать» имена целевых папок. Затем примените функцию в строке:

extension = dir_names(name[name.rfind(".")+1:]) # edited line

Затем весь скрипт становится:

#!/usr/bin/env python3

import os
import subprocess
import shutil

# --------------------------------------------------------
reorg_dir = "/media/ashwin/Work+Entertainment/Untitled Folder"
exclude = () # for example
remove_emptyfolders = True
# ---------------------------------------------------------

def dir_names(ext):
    extensions = [
        [["jpeg", "jpg", "png"], "Pictures"],
        [["mp4", "avi"], "Videos"],
        [["docx", "doc", "pdf", "xlsx", "ppt", "pptx"], "Documents"],
        [["mp3"], "Songs"],
        [["db"], "Database"],
        ]
    match = [item[1] for item in extensions if ext.lower() in item[0]]
    return match[0] if match else "Others"

for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        if name.startswith("."):
            extension = "hidden_files"
        elif not "." in name:
            extension = "without_extension"
        else:
            extension = dir_names(name[name.rfind(".")+1:]) # edited line
        if not extension in exclude:
            new_dir = reorg_dir+"/"+extension
            if not os.path.exists(new_dir):
                os.mkdir(new_dir)
            shutil.move(subject, new_dir+"/"+name)

def cleanup():
    filelist = []
    for root, dirs, files in os.walk(reorg_dir):
        for name in files:
            filelist.append(root+"/"+name)
    directories = [item[0] for item in os.walk(reorg_dir)]
    for dr in directories:
        matches = [item for item in filelist if dr in item]
        if len(matches) == 0:
            try:
                shutil.rmtree(dr)
            except FileNotFoundError:
                pass

if remove_emptyfolders == True:
    cleanup()

Объяснение функции

def dir_names(ext):
    extensions = [
        [["jpeg", "jpg", "png"], "Pictures"],
        [["mp4", "avi"], "Videos"],
        [["docx", "doc", "pdf", "xlsx", "ppt", "pptx"], "Documents"],
        [["mp3"], "Songs"],
        [["db"], "Database"],
        ]
    match = [item[1] for item in extensions if ext.lower() in item[0]]
    return match[0] if match else "Others"
extension - это список, из которого каждый элемент списка существует подректа экстентов (нижний регистр) и соответствующую папку, в которую вы хотите переместить. Функция просто проверяет, находится ли расширение (lower) в списке расширений, а затем возвращает соответствующее (желаемое) имя папки. Если расширение отсутствует в списке расширений любого из подписок, функция возвращает Others.

Почему ваш код не работает

Помимо вопроса о неэффективном кодировании, в предлагаемом коде есть некоторые другие проблемы, из которых отступы являются наиболее важными. (после if/else вы используете отступ или используете строку типа:

monkey = animal if 1 == 1 else vegetable

)

В python существенное значение имеет отступ. [!d29 ]

Запуск кода python, ошибки обычно упоминаются интерпретатором в довольно читаемом формате. Всегда начинайте считывать сообщения об ошибках сверху вниз.

1
ответ дан 23 May 2018 в 14:27
  • 1
    Спасибо @Jacob Vlijm. Очень ценю вашу помощь. !! :) – Ashwin Joshi 9 January 2016 в 18:43
  • 2
    приведенный выше код генерирует случайное окно tk, когда я использую tkFileDialog для получения reorg_dir от пользователя. Почему он создается, когда я не написал его код? – Ashwin Joshi 18 January 2016 в 10:14
  • 3
    @AshwinJoshi Я понятия не имею, в какой конструкции вы используете скрипт, но для этого нужен каталог , а не файл. – Jacob Vlijm 18 January 2016 в 10:32

Другие вопросы по тегам:

Похожие вопросы: