skip to Main Content

So I downloaded tons of ebooks from telegram, and now I have tons of files im different formats as well.
So I would like to remove the duplicates (if any) and keep only the ‘epub’ or ‘kepub’ format from that ebook ‘copy’.
That part I figure it out, but when it’s not a ‘copy’ I want to keep the file ‘pdf’ or whatever format.

import os

diretorio = '/home/jcsantos/Desktop/teste_ebook'


def apagar_ficheiros(diretorio):
    ficheiros_por_nome = {}

    for ficheiro in os.listdir(diretorio):
        nome, ext = os.path.splitext(ficheiro)
        if ext not in ['.epub', '.kepub']:
            if nome not in ficheiros_por_nome:
                ficheiros_por_nome[nome] = []            
            ficheiros_por_nome[nome].append(ficheiro)
    
    for ficheiros in ficheiros_por_nome.values():
        for ficheiro in ficheiros:
            caminho = os.path.join(diretorio, ficheiro)
            print(f'Apagando: {caminho}')
            os.remove(caminho)


apagar_ficheiros(diretorio)

The list:

(20240824-PT) Fugas Público.pdf
1_384198847695421742.pdf
01. FOURTH WING by Rebecca Yarros.epub
01. Gone - O Mundo Termina Aqui - Michael Grant.epub
01.A Escola do Bem e do Mal - Soman Chainani.epub
01.A Escola do Bem e do Mal - Soman Chainani.mobi
01.A Escola do Bem e do Mal - Soman Chainani.pdf
1. As Mentiras de Locke – Scott Lynch.epub
1. Eu sei o que você está pensando – John Verdon.epub
1. Eu sei o que você está pensando – John Verdon.mobi
1. Eu sei o que você está pensando – John Verdon.pdf
1. O Amante - Jodi Ellen Malpas.azw3
1. O Amante - Jodi Ellen Malpas.epub
1. O Amante - Jodi Ellen Malpas.mobi
1. O Amante - Jodi Ellen Malpas.pdf
1. Tess Gerritsen (Rizzoli & Isles) - O Cirurgiao.epub

What I want to keep after program delete the duplicated:

(20240824-PT) Fugas Público.pdf
1_384198847695421742.pdf
01. FOURTH WING by Rebecca Yarros.epub
01. Gone - O Mundo Termina Aqui - Michael Grant.epub
01.A Escola do Bem e do Mal - Soman Chainani.epub
1. As Mentiras de Locke – Scott Lynch.epub
1. Eu sei o que você está pensando – John Verdon.epub
1. O Amante - Jodi Ellen Malpas.epub
1. Tess Gerritsen (Rizzoli & Isles) - O Cirurgiao.epub

I expect that keeps the files that don’t have any copy

2

Answers


  1. There are many ways to do it, I’d do this way:

    1. Group the filelist into a dictionary. Keys are filenames and values are list of extensions for that filename
    2. Iterate items of that dictionary and sort the list of extension the way that epub/kepub are on the last position.
    3. Print/store/… the filname + extension on the last position.
    files = """
    (20240824-PT) Fugas Público.pdf
    1_384198847695421742.pdf
    01. FOURTH WING by Rebecca Yarros.epub
    01. Gone - O Mundo Termina Aqui - Michael Grant.epub
    01.A Escola do Bem e do Mal - Soman Chainani.epub
    01.A Escola do Bem e do Mal - Soman Chainani.mobi
    01.A Escola do Bem e do Mal - Soman Chainani.pdf
    1. As Mentiras de Locke – Scott Lynch.epub
    1. Eu sei o que você está pensando – John Verdon.epub
    1. Eu sei o que você está pensando – John Verdon.mobi
    1. Eu sei o que você está pensando – John Verdon.pdf
    1. O Amante - Jodi Ellen Malpas.azw3
    1. O Amante - Jodi Ellen Malpas.epub
    1. O Amante - Jodi Ellen Malpas.mobi
    1. O Amante - Jodi Ellen Malpas.pdf
    1. Tess Gerritsen (Rizzoli & Isles) - O Cirurgiao.epub""".splitlines()
    
    tmp = {}
    for f in files:
        filename, extension = f.rsplit(".", maxsplit=1)
        tmp.setdefault(filename, []).append(extension)
    
    for k, v in tmp.items():
        v.sort(key=lambda extension: extension in {"epub", "kepub"})
        print(f"{k}.{v[-1]}")
    

    Prints:

    (20240824-PT) Fugas Público.pdf
    1_384198847695421742.pdf
    01. FOURTH WING by Rebecca Yarros.epub
    01. Gone - O Mundo Termina Aqui - Michael Grant.epub
    01.A Escola do Bem e do Mal - Soman Chainani.epub
    1. As Mentiras de Locke – Scott Lynch.epub
    1. Eu sei o que você está pensando – John Verdon.epub
    1. O Amante - Jodi Ellen Malpas.epub
    1. Tess Gerritsen (Rizzoli & Isles) - O Cirurgiao.epub
    
    Login or Signup to reply.
  2. You could at first create a dict where the keys represent the filenames and the values are a list of existing file extensions:

    from pathlib import Path
    
    files = {}
    
    for x in Path(".").iterdir():
        if x.is_file():
            files.setdefault(x.stem, []).append(x.suffix)
    print(files)
    

    Output:

    {'1. Eu sei o que você está pensando – John Verdon': ['.pdf',
      '.epub',
      '.mobi'],
     '01.A Escola do Bem e do Mal - Soman Chainani': ['.epub', '.mobi', '.pdf'],
     '1. Tess Gerritsen (Rizzoli & Isles) - O Cirurgiao': ['.epub'],
     '1. O Amante - Jodi Ellen Malpas': ['.pdf', '.azw3', '.epub', '.mobi'],
     '(20240824-PT) Fugas Público': ['.pdf'],
     '1_384198847695421742': ['.pdf'],
     '1. As Mentiras de Locke – Scott Lynch': ['.epub'],
     '01. FOURTH WING by Rebecca Yarros': ['.epub'],
     '01. Gone - O Mundo Termina Aqui - Michael Grant': ['.epub']}
    

    After that you loop through that list and delete all filenames that exist several times and use a custom sort to keep the file extension you prefer:

    def custom_sort(suffix):
        priorities = {'.epub':1, '.kepub':2, '.pdf':3}
        return priorities.get(suffix, 4)   
    
    for n,s in files.items():
        for x in sorted(s, key=custom_sort)[1:]:
            Path(n+x).unlink()
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search