Python Сортировка базы по доменам

neonlight44

neonlight44

Опытный
Регистрация
24 Дек 2016
Сообщения
466
Реакции
397
Баллы
145
Решил выложить свой нубский кусочек кода.

Описание:
Ищет все домены в базе по разделителям (" ; ", " : ", " ")
Подсчитывает общее кол-во доменов, после создает папку и сохраняет в неё по одному .txt на каждый домен
Есть возможность сохранить только определенные домены
Так же в папке создается файл статистики, который подсчитывает кол-во строк по каждому домену

Зачем? - Не знаю, заняться нечем, можно кому нибудь пригодится
Код:
import os
import re
import time


# Variables [start]

name = input('Название файла с аккаунтами (без .txt): ')

base = open(name + '.txt', 'r').readlines()

cwd = os.getcwd()

domains = []

fav_domains = []

counter = {}

onlyFav = False;

# Variables [end]


def folderTime():
    return time.strftime("%d_%m_%y", time.localtime())


def projectTime():
    return time.strftime("%H-%M-%S", time.localtime())


def logtime():
    return time.strftime("%H:%M:%S", time.localtime())


def getDomains():

    for line in base:
        domain = re.search('@[^;: ]+', line).group(0)
        
        if domain not in domains:
            domains.append(domain)
            

    print('Total domains: {}'.format(len(domains)))


def favDomains():
    global onlyFav

    print('Сохранить только определенные домены (enter для пропуска): \n')

    while True:
        domain = input()

        if domain == '' or domain == ' ':
            break;
        else:
            onlyFav = True;
            fav_domains.append(domain)

    print('Favorite domains: {}'.format(len(fav_domains)))


def prep():
    global path
    
    try:
        os.makedirs(cwd + '\\' + folderTime() + '\\' + projectTime())
    except:
        pass

    path = cwd + '\\' + folderTime() + '\\' + projectTime() + '\\'


def save():

    for num, domain in enumerate(domains):

        count = 0

        print('[{}] Saving {} of {} domains'.format(logtime(), str(num+1), str(len(domains))))
        
        f = open(path + domain + '.txt', 'w')

        for line in base:
            
            if domain in line:
                
                if '\n' in line:
                    f.write(line)
                else:
                    f.write(line + '\n')

                count += 1;

        counter[domain] = count

        f.close()


def saveFav():

    for num, domain in enumerate(fav_domains):

        count = 0

        print('[{}] Saving {} of {} domains'.format(logtime(), str(num+1), str(len(fav_domains))))

        f = open(path + domain + '.txt', 'w')

        for line in base:

            if domain in line:

                if '\n' in line:
                    f.write(line)
                else:
                    f.write(line + '\n')

                count += 1;

        counter[domain] = count

        f.close()


def stats():

    f = open(path + 'satistics.txt', 'w')
    f.write('Статистика по каждому домену:\n\n')

    for domain, value in counter.items():
        f.write('Строк с доменом "{}" - {} штук\n'.format(domain, str(value)))

    f.close()
    


def main():

    favDomains()
    prep()
    getDomains()
    
    if onlyFav:
        saveFav()
    else:
        save()

    stats()


if __name__ == '__main__':

    main()

База в 110к прогналась за ~3 сек
 
monstercat

monstercat

Легенда
Регистрация
29 Янв 2017
Сообщения
1.146
Реакции
1.271
Баллы
190
Недавно как раз только начал изучать питон, спасибо за пример, разберу, когда узнаю о питоне побольше
 
Satisfaction

Satisfaction

Заблокирован
Регистрация
27 Апр 2017
Сообщения
142
Реакции
64
Баллы
100
Для новичков по Питону уверен пригодиться этот исход задроченной сортировки до дыр доменов :crazy:
 
D

Danil555558

Бывалый
Регистрация
8 Июл 2017
Сообщения
52
Реакции
23
Баллы
75
Решил выложить свой нубский кусочек кода.

Описание:
Ищет все домены в базе по разделителям (" ; ", " : ", " ")
Подсчитывает общее кол-во доменов, после создает папку и сохраняет в неё по одному .txt на каждый домен
Есть возможность сохранить только определенные домены
Так же в папке создается файл статистики, который подсчитывает кол-во строк по каждому домену

Зачем? - Не знаю, заняться нечем, можно кому нибудь пригодится
Код:
import os
import re
import time


# Variables [start]

name = input('Название файла с аккаунтами (без .txt): ')

base = open(name + '.txt', 'r').readlines()

cwd = os.getcwd()

domains = []

fav_domains = []

counter = {}

onlyFav = False;

# Variables [end]


def folderTime():
    return time.strftime("%d_%m_%y", time.localtime())


def projectTime():
    return time.strftime("%H-%M-%S", time.localtime())


def logtime():
    return time.strftime("%H:%M:%S", time.localtime())


def getDomains():

    for line in base:
        domain = re.search('@[^;: ]+', line).group(0)
      
        if domain not in domains:
            domains.append(domain)
          

    print('Total domains: {}'.format(len(domains)))


def favDomains():
    global onlyFav

    print('Сохранить только определенные домены (enter для пропуска): \n')

    while True:
        domain = input()

        if domain == '' or domain == ' ':
            break;
        else:
            onlyFav = True;
            fav_domains.append(domain)

    print('Favorite domains: {}'.format(len(fav_domains)))


def prep():
    global path
  
    try:
        os.makedirs(cwd + '\\' + folderTime() + '\\' + projectTime())
    except:
        pass

    path = cwd + '\\' + folderTime() + '\\' + projectTime() + '\\'


def save():

    for num, domain in enumerate(domains):

        count = 0

        print('[{}] Saving {} of {} domains'.format(logtime(), str(num+1), str(len(domains))))
      
        f = open(path + domain + '.txt', 'w')

        for line in base:
          
            if domain in line:
              
                if '\n' in line:
                    f.write(line)
                else:
                    f.write(line + '\n')

                count += 1;

        counter[domain] = count

        f.close()


def saveFav():

    for num, domain in enumerate(fav_domains):

        count = 0

        print('[{}] Saving {} of {} domains'.format(logtime(), str(num+1), str(len(fav_domains))))

        f = open(path + domain + '.txt', 'w')

        for line in base:

            if domain in line:

                if '\n' in line:
                    f.write(line)
                else:
                    f.write(line + '\n')

                count += 1;

        counter[domain] = count

        f.close()


def stats():

    f = open(path + 'satistics.txt', 'w')
    f.write('Статистика по каждому домену:\n\n')

    for domain, value in counter.items():
        f.write('Строк с доменом "{}" - {} штук\n'.format(domain, str(value)))

    f.close()
  


def main():

    favDomains()
    prep()
    getDomains()
  
    if onlyFav:
        saveFav()
    else:
        save()

    stats()


if __name__ == '__main__':

    main()

База в 110к прогналась за ~3 сек
Не мог бы ты объяснить строчку?
domain = re.search('@[^;: ]+', line).group(0
Понял что вроде поиск по значению , но "('@[^;: ]+', line).group(0" понять не смог.
 
Автор
Автор
neonlight44

neonlight44

Опытный
Регистрация
24 Дек 2016
Сообщения
466
Реакции
397
Баллы
145
Danil555558,
Ищет от собаки до одного из трех разделителей (;: ). group(0) нужен чтобы получить результат, регекс можно группировать скобками, тут 0 (ну или можно в принципе пустоту оставить group() ), чтобы получить все выражение найденое, т.е. @[^;: ]+
 
D

Danil555558

Бывалый
Регистрация
8 Июл 2017
Сообщения
52
Реакции
23
Баллы
75
Danil555558,
Ищет от собаки до одного из трех разделителей (;: ). group(0) нужен чтобы получить результат, регекс можно группировать скобками, тут 0 (ну или можно в принципе пустоту оставить group() ), чтобы получить все выражение найденое, т.е. @[^;: ]+
А что если я хочу что бы искало разделитель ; и заменяло допустим на @mail.ru; . Как будет выглядить , так?
domain = re.search(';: ', line).group(0
и ещё что бы сохраняло в отдельный txt
 
ReyhStar

ReyhStar

Опытный
Регистрация
15 Дек 2018
Сообщения
310
Реакции
181
Баллы
65
neonlight44, Только бугор сортирует?
 
Автор
Автор
neonlight44

neonlight44

Опытный
Регистрация
24 Дек 2016
Сообщения
466
Реакции
397
Баллы
145