Как разделить комбинированный список в большом текстовом файле? - PullRequest
0 голосов
/ 30 ноября 2018

Моя проблема в том, что у меня очень большая база данных электронных писем и паролей, и мне нужно отправить ее в базу данных mysql.

Формат файла .txt примерно такой:

emailnumberone@gmail.com:password1
emailnumbertwo@gmail.com:password2
emailnumberthree@gmail.com:password3
emailnumberfour@gmail.com:password4
emailnumberfive@gmail.com:password5

Моя идея состоит в том, чтобы создать цикл, который берет строку и делает ее переменной, ищите «:» и выбирайте текст перед, отправляйте его в БД и затем то же самое с частью после.Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Открыть файл как менеджер контекста (с открытым (...)). Вы можете перебирать строки с циклом for, затем сопоставлять регулярные выражения (re Module) (или просто разделять на «:») и использовать sqlite3 для вставкиваши значения в БД.

Итак, файл:

with open("file.txt", "r") as f:
    for line in f:
        pass #manipulation

Sqlite3 Документы: https://docs.python.org/2/library/sqlite3.html

0 голосов
/ 30 ноября 2018

Короткая программа с некоторой обработкой ошибок:

Создание файла демонстрационных данных:

t = """
emailnumberone@gmail.com:password1
emailnumbertwo@gmail.com:password2
emailnumberthree@gmail.com:password3
emailnumberfour@gmail.com:password4
emailnumberfive@gmail.com:password5
k
: """

with open("f.txt","w") as f: f.write(t)

Анализ данных / сохранение:

def store_in_db(email,pw):
    # replace with db access code 
    # see    http://bobby-tables.com/python
    # for parametrized db code in python (or the API of your choice)
    print("stored: ", email, pw)


with open("f.txt") as r:
    for line in r:
        if line.strip():  # weed out empty lines
            try:
                email, pw = line.split(":",1) # even if : in pw: only split at 1st :
                if email.strip() and pw.strip(): # only if both filled
                    store_in_db(email,pw)
                else:
                    raise ValueError("Something is empty: '"+line+"'")

            except Exception as ex:
                print("Error: ", line, ex)

Вывод:

stored:  emailnumberone@gmail.com password1

stored:  emailnumbertwo@gmail.com password2

stored:  emailnumberthree@gmail.com password3

stored:  emailnumberfour@gmail.com password4

stored:  emailnumberfive@gmail.com password5

Error:  k
 not enough values to unpack (expected 2, got 1)
Error:  :  Something is empty: ': '

Редактировать: В соответствии с Какие символы разрешены в адресе электронной почты? - ':' может быть частью первой части электронного письма, если оно указано.

Теоретически это позволило бы вводить как

`"Cool:Emailadress@google.com:coolish_password"` 

, что приведет к ошибкам с этим кодом.См. Ответ Talip Tolga Sans о том, как по-разному разбить разбиение, чтобы избежать этой проблемы.

0 голосов
/ 30 ноября 2018

Это может быть сделано с помощью простого split() метода строк в python.

>>> a = 'emailnumberone@gmail.com:password1'
>>> b = a.split(':')
>>> b
['emailnumberone@gmail.com', 'password1']

Чтобы приспособиться к неудачному сложному паролю @ PatrickArtner, это можно сделать:

atLocation = a.find('@')
realSeperator = atLocation + a[atLocation:].find(':')
emailName = a[0:atLocation]
emailDomain = a[atLocation:realSeperator]
email = emailName + emailDomain
password = a[realSeperator + 1:]

print(email, password)

>>> emailnumberone@gmail.com com:plex:PassWord:fail

str.find () возвращает первое местоположение вхождения заданного символа в заданной строке.Письма могут иметь : в своем поле имени, но они не могут иметь @.Итак, сначала поиск @, а затем поиск : даст вам правильные места разделения.После этого расщепление нити будет куском пирога.

...