检查文件中是否包含字符串

时间:2018-09-23 23:38:55

标签: python string python-3.x file match

我正在制作一个程序,以检查文件中是否有用户输入。如果用户输入当前不在文件中,那么我们将把该输入附加到used_pa​​sswords文件中,并要求用户再次键入其他内容。否则,如果他们重新输入我们刚刚添加的输入(或任何预设),那么我们想告诉他们他们不能重复使用密码。

此代码存在的问题是,每当我输入used_pa​​sswords文件中单词中的字母,或者如果我输入文件中单词的一部分时,程序就会告诉我无法重用密码。

例如:如果我输入“ abc”,程序将告诉我我已经重用了该密码,并且我认为这可能是因为程序逐个字符地读取文件并在abcdeF!23中读取了abc!

尽管,我不希望程序告诉我不能重复使用文件中的一个或多个字符。我想让程序告诉我不能重用程序中的单词


我还想知道我们是否可以将输入或预设放入文件数组中。

fileUsed_Pass = open("used_passwords.txt", 'a')

fileUsed_Pass.write("\nabcdeF!23")
fileUsed_Pass.write("\n\n")

fileUsed_Pass.write("zxcbhK#44")
fileUsed_Pass.write("\n\n")

fileUsed_Pass.write("poiuyT&11")
fileUsed_Pass.write("\n\n")

fileUsed_Pass.close()



def password():

    string = input("Enter Here:")

    if string in open('used_passwords.txt').read():
        print("You can not reuse that password!\n")
        password()
    else:
        # file-append.py
        f = open('used_passwords.txt','a')
        f.write('\n'+string)
        f.close()
        password()
password()

更新:我已经获得了使用with语句的代码。

我没有使用If和else语句,而是使用了with语句。

我在这里正在检查每一行,以查看是否有与我的输入字符串匹配的文本。如果没有,则将some_variable等于True。如果不是,那么我们将其设为false。

with open("used_passwords.txt", 'r') as tFile:
    for line in tFile:
      if string != line and string+"\n" != line:
        some_variable = True
      else:  #If it equals anything else from the file, then false
        some_variable = False
        break


  #print(some_variable)
  #this was added for me/the user to make sure that the with statement was working

然后,如果它等于True:我们将其添加到文件中。如果没有,我们将让用户输入另一个与文件insie不匹配的密码。

  tFile = open("used_passwords.txt", 'a')
  if some_variable == True:
    tFile.write("\n" + string)
    print("\nGOOD! Password does not match old ones!")

  elif some_variable == False:
    print("\nYou can not re-use a password!")
    password()

3 个答案:

答案 0 :(得分:0)

考虑到要在文件中输入的每个密码后添加一个\ n,可以尝试将\ n附加到string变量中,然后进行搜索。

答案 1 :(得分:0)

直接处理文本文件可能不是最大的解决方案。 您应该考虑改用某种形式的数据库(例如sqlite3 library,它是IIRC随Python3预先安装的。)

此外,请记住,以明文形式存储密码是安全的“禁止”。 至少,请使用众多可用的cryptographic hash functions中的一种,然后存储并比较哈希,而不是密码。

这是同时使用sqlite3和SHA-256(一种常见的哈希函数)的基本示例:

#!/usr/bin/python3

import sqlite3
import hashlib

db  = sqlite3.connect( "used_passwords.db" )
cur = db.cursor()
cur.execute( "CREATE TABLE IF NOT EXISTS passwords( pwd TEXT, UNIQUE( pwd ))" )

def password():
   pwd = input( "password: " )
   sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
   cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))

while True:
   try:
      password()
      break
   except KeyboardInterrupt:
      print( "aborted" )
      break
   except sqlite3.IntegrityError:
      print( "cannot reuse that password" )

db.commit()
db.close()

请注意UNIQUE上的pwd约束,该约束确保只要sqlite3.IntegrityError中已经存在密码,就会引发passwords异常(这将使验证隐式,并且使SQL的繁琐程度降到最低)。

用法示例:

% ./pwd.py 
password: foo
% ./pwd.py 
password: foo
cannot reuse that password
password: bar
%

您可以验证数据库中是否没有明文密码:

% sqlite3 ./used_passwords.db 
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> select * from passwords;
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae  ; <- this is "foo"
fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9  ; <- this is "bar"
sqlite> 

当然,您可以对此进行扩展并添加更多功能,例如对多个用户的支持,密码有效期等等。

答案 2 :(得分:-1)

您正在使用.read(),它将整个文件读取为一个字符串。

import math
def _getIndexPage(index, items_per_page=7):
    return int(math.ceil(index / items_per_page))

改为使用.readlines()并遍历每一行以检查字符串是否在任何文件行中。