如何在大型文本文件中拆分组合列表?

3yhwsihp  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(392)

我的问题是,我有一个非常大的数据库的电子邮件和密码,我需要把它发送到一个mysql数据库。
.txt文件格式如下:

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

我的想法是创建一个循环,将行作为一个变量,搜索“:”并选择前面的文本,将其发送到db,然后将其发送到行的后面部分。我该怎么做?

hc8w905p

hc8w905p1#

以上下文管理器的形式打开文件(使用open(…)),您可以使用for循环遍历行,然后使用regex匹配(re module)(或者只拆分“:”)并使用sqlite3将值插入db。
所以文件:

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

sqlite3文档:https://docs.python.org/2/library/sqlite3.html

eoigrqb6

eoigrqb62#

带有一些错误处理的短程序:
创建演示数据文件:

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答案,了解如何以不同方式分解拆分以避免此问题。

3pmvbmvn

3pmvbmvn3#

这可以通过简单的 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()返回给定字符串中给定字符的第一个出现位置。电子邮件可能有 : 但他们不能 @ . 所以首先确定 @ 然后定位 : 会给你正确的分离位置。在那之后,分开绳子将是小菜一碟。

相关问题