So basically i bought a book that teaches the basics of python and how to create a random number generator so I decided to go one step further and make a random password generator I found a tutorial online that gave me a good example of why and what is used to make a password generator but i want the output to be saved to a .txt file I do not know what i need to implement to get the result i want this is what i have i'm using python3.
import random
chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!, #,#$%^&*.'
number = input('Number of passwords - ')
number = int(number)
length = input('password length? - ')
length = int(length)
answer = input
for P in range(number):
password = ''
for C in range(length):
password += random.choice(chars)
print(password)
password = open("passlist.txt", "a")
password.write(password)
password.close()
file = open('passlist', 'w')
file.write(password)
file.close()
this is what i get in shell
Traceback (most recent call last):
File "C:\User\Desktop\passgen.py", line 21, in <module>
password.write(password)
TypeError: write() argument must be str, not _io.TextIOWrapper
When you open a new file and set it equal to a variable, you are actually creating an _io.TextIOWrapper object. So in this line of code, you are creating this object and storing it in password, getting rid of the password generated in the previous lines of code.
password = open("passlist.txt", "a")
You are then trying to write to the passlist.txt file with this line:
password.write(password)
You are telling password, now an _io.TextIOWrapper object, to write to the passfile.txt the _io.TextIOWrapper object, not the password generated beforehand. This function is expecting a string, and you are now passing an _io.TextIOWrapper object. Since password is no longer a string, that is why you are running into the error.
To fix this, I would suggest creating a new variable:
txtFileWriter = open("passlist.txt", "a")
txtFileWriter.write(password)
txtFileWriter.close()
You may find that after fixing this, only one value is being stored inside your text file. I would recommend properly nesting your for loops:
for P in range(number):
password = ''
for C in range(length):
password += random.choice(chars)
print(password)
The meaning of these for loops can be translated as:
For each password, set the password = ' ' and for each character, add one random character to password.
The problem with this is that you will only have one password after the for loops are complete. You are setting the password value to ' ' each time you run through the outer loop. The only password that will be saved, will be the last value. In order to fix this, I recommend using a list.
I recommend reading through this documentation
I don't want to spoon feed the answers since I realize you are learning python, so I will leave it here. You will want to create a list and then append a value to that list each time you generate a password. After some reading, hopefully this will make sense.
filename = 'passlist.txt'
with open (filename, 'a') as file_object:
file_object.write(password)
Using with will close the file once access is no longer needed.
You also need a list to append your passwords ;)
The error originates from password being re-assigned in password = open("passlist.txt", "a"). This causes and error in the next line as you are attempting to pass password as parameter to itself in password.write(password).
Some farther assistance
You have the right idea but you forgot to indent. All the lines below for P in range(number): should be indented because the program must generate and write a new password until it has satisfied the required amount of passwords.
The password = open("passlist.txt", "a")
password.write(password)
password.close() lines are unnecessary as you are overriding the generated password and assigning that password variable to something that is not a string; that is why you are getting that error.
Here is the code with the adjustments.
import random
chars = 'abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!, #,#$%^&*.'
number = input('Number of passwords - ')
number = int(number)
length = input('password length? - ')
length = int(length)
answer = input
for P in range(number):
password = ''
for C in range(length):
password += random.choice(chars)
print(password)
password += "\n" # writes the password in a new line
file = open('passlist.tx', "a")
file.write(password)
file.close()
Related
i want to make python create a file if it doesn't exist ,then take text from users input and append into my file and to be able to use my code several times without changing text before it
def register():
f=open('1.txt','w')
f=open('1.txt','r')
users=f.readlines()
f=open('1.txt','a')
while True:
username = input('Enter your username: ')
password = input('Enter your password: ')
if username in users:
print('this username is taken')
else:
f.write(f'{username}\n')
f.write(f'{password}')
break
this is my code
EAFP approach (which is more pythonic that LBYL):
try to create a file
handle specific exception if it exists
either way do your logic in finally block
try:
with open("1.txt","x") as f: pass
except FileExistsError:
print("File already exists!")
finally:
with open("1.txt", "r+") as f:
lines = f.readlines()
username, password = input("Type username and password (separated by a space): ").split()
if f"{username}\n" in lines:
print('This username is taken!')
else:
f.writelines([f"{username}\n",f"{password}\n"])
Keep in mind though that:
if the username and password are the same this won't work correctly (or at least not as expected imho, as homework figure out why :D )
passwords in general should NOT be kept as plain text
you should add the "boilerplate" if __name__=="__main__": thingy if it's a standalone and no part of a function/class etc
you could wrap the input in try...except ValueError block to be extra safe when somebody enters a single value or three values and so on
Comments:
If you do something like this:
f=open('1.txt','w')
f=open('1.txt','r')
The 2nd line shadows the first one, so it makes no sense, it's the same as:
x=2
x=3
print(x)
The 1st assignment is "dead"
Most often you want to use with when handling files operations, otherwise it's your responsibility to close the file as well.
I have a very simple 'login' program that I've almost got finished. I'm trying to get my make_acc() function to write the username on line 1 and the password on line 2, as well as make my login() function read those separate lines per what needs to be checked. I'm pretty sure the answer has to do with marking the readline command for which line needs to be read, but I'm not sure how to implement it in my code properly. Here's the code.
# This function has the user input a username for their account
def make_acc():
username = input('Make a username:')
file = open('acc_data.txt','w')
file.write(username)
file.close()
#password = input('Make a password:')
#file = open('acc_data.txt','w')
#file.write(password)
# This function has the user login to a preexisting account
def login():
input_user = input('Enter your username:')
file = open('acc_data.txt','r')
username = file.readline()
if input_user == username:
print('You are now logged in')
else:
print('That user does not exist')
login()
# This variable will be defined as a yes or no depending on whether or not the use has an account
acc_bool = input('Do you already have an account?:')
# This if statement runs the login() function if the user answered yes to the previous input
if acc_bool == 'yes':
login()
# This elif statement runs the make_acc() function if the user answered no to the previous input
elif acc_bool == 'no':
make_acc()
login()
This should do it:
def make_acc():
username = input('Make a username:')
password = input('Make a password:')
with open('acc_data.txt','a') as file:
file.write(username+'\n')
file.write(password)
def login():
input_user = input('Enter your username:')
with open('acc_data.txt','r') as file:
if input_user in [u for i,u in enumerate(file.readlines()) if not u%2]:
print('You are now logged in')
else:
print('That user does not exist')
login()
Instead of having the usernames and passwords all in 2 lines, you can use indexes to determine whether a line is a username or password: even indexes are for usernames, and odd ones are for passwords.
UPDATE:
This part: [u for i,u in enumerate(file.readlines()) if not u%2] lists all the strings in file.readlines() (a list of all the lines in f.read()) if the index of the string, i, doesn't leave a remainder when divided by 2.
You see, enumerate() will basically let us iterate through an array and let use easily access the index of the current iteration.
First, uncomment the part of make_acc that asks for a password and add a file.close().
Then, notice that when you've run the program and inputted the two pieces of information, only one is left in the file, this is because, when calling open(), you use the
w mode, which truncates the file before allowing you to write. The consequence of this is that when you open the file again a couple of lines later, all information previously stored is lost. The solution is to use mode r+ or a or just not close the file until the end of the function, thereby avoiding having to reopening it when writing the password.
Next, when reading from the file, you can use file.readline() just as you already are doing. Choosing what line to read happens by default, because every call to readline advances what line is being read. This means that the second time you call it since you opened the file, the second line will be read.
I am trying to open a protected zip file I know for a fact that the first 5 characters are Super and the password is eight characters long with no numbers or symbols I am using this code in python to help me but it is not working can anyone help?
code:
import zipfile
import itertools
import time
# Function for extracting zip files to test if the password works!
def extractFile(zip_file, password):
try:
zip_file.extractall(pwd=password)
return True
except KeyboardInterrupt:
exit(0)
except Exception as e:
pass
# The file name of the zip file.
zipfilename = 'planz.zip'
# The first part of the password.
first_half_password = 'Super'
# We don't know what characters they add afterwards...
alphabet = 'abcdefghijklmnopqrstuvwxyz'
zip_file = zipfile.ZipFile(zipfilename)
# For every possible combination of 3 letters from alphabet...
for c in itertools.product(alphabet, repeat=3):
# Add the three letters to the first half of the password.
password = first_half_password+''.join(c)
# Try to extract the file.
print("Trying: %s" % password)
# If the file was extracted, you found the right password.
if extractFile(zip_file, password):
print('*' * 20)
print('Password found: %s' % password)
print('Files extracted...')
exit(0)
# If no password was found by the end, let us know!
print('Password not found.')
Hy man! Basically, you can just append the alphabet variable to include the uppercase letters, the password is a play on superman, If I remember correctly
The problem is, that
if extractFile(zip_file, password):
is also true for wrong passwords in many cases. (see:https://bugs.python.org/issue18134) It then leaves an "unziiped file" with length 0 or some bytes.
You have to check if the output file is the right size.
for example by finding out the size of the first file in zip
zip_file = zipfile.ZipFile(zipfilename)
firstmember=zip_file.namelist()[0]
firstmembersize=zip_file.getinfo(firstmember).file_size
and later
if os.path.getsize(firstmember) == firstmembersize:
and dont forget to delete the wrong sized file after checking to give way for the next try ...
Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 7 years ago.
Improve this question
im making a login system in python that gets the username then checks a line on a text file then it checks the next line until it finds it then checks the same line on a second file (password file) and confirms the password with the username. when i try to log into an account i made it continually loops till it breaks itself. the variable it cant find is line in the checkusername function
u = open('user', 'r+')
p = open('password', 'r+')
def main():
accountcheck()
def accountcheck(): # check if the user has an account
account = input('Do you have an account?\n')
if account == 'yes':
new = 0
username(new)
elif account == 'no':
new = 1
username(new)
else:
print(account, 'Is not a valid answer. Please try again')
accountcheck()
def username(new): # input username
userlist = u.read().splitlines()
user = input('Please enter your username\n')
if user in userlist and new == 0:
checkuser(user, new)
elif new == 1 and user not in userlist:
password(user, new)
elif new == 1 and user in userlist:
print('Username taken')
username(new)
else:
print('Username is not fount in our database. Please try again')
username(new)
def checkuser(user, new): # scan the username file for the username
line = 1
ulines = u.readlines(line)
if user != ulines:
line = line + 1
checkuser(user, new)
elif ulines == user:
password(user, new)
def password(user, new):
passwordlist = p.read().splitlines()
password = input('Please enter your username\n')
if password in passwordlist and password != user:
checkpassword(user, new, password)
elif new == 1 and password != user:
writelogin(user, password)
else:
print('Password is incorrect. Please try again')
password(user, new)
def checkpassword(user, line, new, password):
plines = p.readlines(line)
if plines != password:
line = line + 1
elif plines == password:
if new == 1:
writelogin(user, password)
else:
print('you have logged in')
def writelogin(user, password):
userwrite = user + '\n'
passwordwrite = password + '\n'
u.write(userwrite)
p.write(passwordwrite)
main()
if you want to run this file you need to have a user text file and a password text file in the same folder the program is. any help is appreciated
I see the following problems with your code:
Unnecessary use of recursion: this maybe is not a problem now, but python have a limit of how much you can do recursive calls, to avoid hit that limit change all yours functions to use loops.
read/readline/readlines: Looks to me that you are under the impression that when you do consecutive reads in the file you always get the same result, but that is not the case, when you do u.read() the first time you get the whole content of the file, no mystery there, but if you do u.read() again you get nothing that is because internally a file object have a read pointer that indicate where it is in the file, you can think of it as the palpitating | in a text editor when you do a read of any kind that pointer move according to kind of read you do, if it is readline it move to the next line but if its read or readlines it move to the end of the file and what you get from the operation is everything in between the previous position and the new position. But don't worry there is a way to tell it where to put say pointer with the seek method, to return to the start do u.seek(0) before any read to always get the same result from yours reads.
readline(N)/readlines(N): in the same way as before you may think that that give you a particular line in the file but that is no the case take a look a the documentation
read(size=-1)
Read and return at most size characters from the stream as a single str. If size is negative or None, reads until EOF.
readline(size=-1)
Read and return one line from the stream. If size is specified, at most size bytes will be read.
The line terminator is always b'\n' for binary files; for text files, the newline argument to open() can be used to select the line terminator(s) recognized.
readlines(hint=-1)
Read and return a list of lines from the stream. hint can be specified to control the number of lines read: no more lines will be read if the total size (in bytes/characters) of all lines so far exceeds hint.
Documentation: https://docs.python.org/3/library/io.html#high-level-module-interface
Tread carefully when using recursion: in your case, the 'line' value is always being set to '1' in the first line of the checkuser() method. This means that it will always read the first line and always call checkuser() again if the user does not match (ad infinitum).
It may be better to use a simple loop instead.
You may wish to pass 'line' to your checkuser() method instead eg:
def checkuser(user, new, line=1):
...
I am attempting to create a login script. I have the usernames and passwords in a text file that I want python to read and check through to find usernames and passwords.
The biggest problem I am having is "attaching" the password to a username. I can currently only scan the whole of the document for both but not necessarily attached to each other.
#-------------------------------------------------------------------------------
# Name: LogIn
# Purpose: Logging In
#
# Author: Dark Ariel7
#
# Created: 19/02/2013
# Copyright: (c) Dark Ariel7 2013
# Licence: I take no responsability for anything.
#-------------------------------------------------------------------------------
from getpass import getpass
from time import sleep
Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
Username = ("")
Password = ()
def LogIn():
Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
Data = (Database.read())
Username = ("")
Password = ()
Username = input("Username: ")
Password = getpass(str("Password: "))
LogIn= ",".join((Username,Password))
if LogIn in Data:
print("Welcome, " + Username)
sleep(3)
pass
else:
print("Failed, Sucker!")
sleep(5)
exit()
LogIn()
If you guys could help me figure out what exactly .join part is for that would be great. Should i make a dictionary and use the index for a login sheet? I also want some general feedback on how to make the code better.
This is the txt file that it will be reading:
[Dark Ariel7,123456]
[Poop,Anko]
*Edit Sorry guys I forgot to mention that I am using python 3 not 2. Thanks so far. Very quick replies. Also after the last else instead of exit what do I put so that the function loops until I get the right username password combo?
The ".join" part joins the username and password that the user types in with a comma between them (i.e. Poop,Anko) because that's the format in which it's stored in the database, so you can search for it that way.
Here's your code, edited up a bit, with some comments about functionality and style.
from getpass import getpass
from time import sleep
Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
# These next two lines aren't necessary - these variables are never used; you may want to read up about namespaces: http://bytebaker.com/2008/07/30/python-namespaces/
#Username = ("")
#Password = ()
def LogIn():
Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
# Removed the parentheses; they have no effect here. Putting parens around lone statements doesn't have any effect in python.
Data = Database.read()
# These next two lines are pointless, because you subsequently overwrite the values you give these variables. It looks like you're trying to "declare" variables, as you would in Java, but this isn't necessary in python.
# Username = ("")
# Password = ()
# Changed this from "input" to "raw_input" because input does something else that you don't want.
Username = raw_input("Username: ")
Password = getpass(str("Password: "))
LogIn= ",".join((Username,Password))
if LogIn in Data:
print("Welcome, " + Username)
# Not sure why you want the script to sleep, but I assume you have your reasons?
sleep(3)
# no need to pass
# pass
else:
print("Failed, Sucker!")
sleep(5)
# exit() isn't necessary - the function will end by itself.
# exit()
LogIn()
The basic problem you have is that your file has [ ] surrounding the username and password combination, but you fail to account for this.
There are some other stylistic issues with your code, here is an edited version:
import getpass
from time import sleep
password_file = r'C:\....\Database.txt'
def login(user,passwd):
''' Checks the credentials of a user '''
with open(password_file) as f:
for line in f:
if line.strip(): # skips blank lines
username,password = line.split(',') # this gets the individual parts
username = username[1:] # gets rid of the [
password = password[:-1] # the same for the password
if user == username and password == passwd:
return True
return False
if __name__ == '__main__':
username = input('Please enter the username: ')
passwd = getpass('Please enter the password: ')
if login(user,passwd):
print('Welcome {1}'.format(user))
sleep(3)
else:
print('Failed! Mwahahaha!!')
sleep(5)
To start off with, you don't need () to "initialize" variables; more to the point in Python you don't need to initialize variables at all. This is because Python doesn't have variables; but rather names that point to things.
Next, the python style guide says that variable names should be lowercase, along with method names.
Now - the main part of the code:
>>> username, password = '[username,sekret]'.split(',')
>>> username
'[username'
>>> password
'sekret]'
I used split() to break up the line into the username and password parts; but as you see there is still the [ messing things up. Next I did this:
>>> username[1:]
'username'
>>> password[:-1]
'sekret'
This uses the slice notation to strip of the leading and ending characters, getting rid of the [ ].
These lines:
with open(password_file) as f: # 1
for line in f: # 2
if line.strip(): # skips blank lines
Do the following:
Opens the file and assigns it to the variable f (see more on the with statement)
This for loop steps through each line in f and assigns the name line to each line from the file.
The third part makes sure we skip blank lines. strip() will remove all non-printable characters; so if there are no characters left, the line is blank and will have a 0 length. Since if loops only work when the condition is true, and 0 is a false value - in effect what happens is we only operate on non-blank lines.
The final part of the code is another if statement. This is a check to make sure that the file will run when you execute it from the command prompt.