【问题标题】:How to save output in python to .txt file如何将python中的输出保存到.txt文件
【发布时间】:2020-06-01 21:04:51
【问题描述】:

所以基本上我买了一本书,教python的基础知识以及如何创建随机数生成器,所以我决定更进一步,制作一个随机密码生成器我在网上找到了一个教程,它给了我一个很好的例子,说明了为什么以及用于制作密码生成器的内容,但我希望将输出保存到 .txt 文件中,我不知道我需要实现什么才能获得我想要的结果,这就是我使用 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()

这是我在 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

【问题讨论】:

  • 您同时调用了密码字符串password 文件对象password。换一个...
  • 为您的文件对象使用不同的变量名。 password = open(...) 会覆盖您生成的密码。
  • 顺便说一句,您将输入函数分配给了一个变量:answer = input。没有理由这样做。
  • 将您的密码生成器放入一个函数中,并根据需要多次调用该函数以生成更多密码。
  • 我摆脱了答案 = 输入谢谢,现在该函数将是一个全局变量,因为我试图制作一个菜单以便我可以导入密码生成器这与您的解释类似,但没有菜单部分?

标签: python python-3.x file-io


【解决方案1】:

当您打开一个新文件并将其设置为一个变量时,您实际上是在创建一个 _io.TextIOWrapper 对象。所以在这行代码中,您正在创建这个对象并将其存储在 password 中,摆脱前面代码行中生成的密码。

password = open("passlist.txt", "a")

然后您尝试使用以下行写入 passlist.txt 文件:

password.write(password)

您告诉密码,现在是一个 _io.TextIOWrapper 对象,将 _io.TextIOWrapper 对象写入 passfile.txt,而不是预先生成的密码。该函数需要一个字符串,而您现在正在传递一个 _io.TextIOWrapper 对象。由于密码不再是字符串,这就是您遇到错误的原因。

要解决这个问题,我建议创建一个新变量:

txtFileWriter = open("passlist.txt", "a")
txtFileWriter.write(password)
txtFileWriter.close()

您可能会发现修复此问题后,您的文本文件中只存储了一个值。我建议正确嵌套你的 for 循环:

for P in range(number):
    password = ''
    for C in range(length):
        password += random.choice(chars)
    print(password)

这些for循环的含义可以翻译为: 对于每个密码,设置密码 = ' ',对于每个字符,在密码中添加一个随机字符。

这样做的问题是,在 for 循环完成后您将只有一个密码。每次运行外循环时,您都将密码值设置为“”。唯一要保存的密码将是最后一个值。为了解决这个问题,我建议使用一个列表。

我建议通读这个documentation

我不想用勺子喂答案,因为我意识到你正在学习 python,所以我将把它留在这里。您需要创建一个列表,然后在每次生成密码时向该列表附加一个值。经过一番阅读,希望这是有道理的。

【讨论】:

  • 感谢队友,感谢您的解释 :) 但是如果我选择生成 2 个密码,它只会生成 1 个,这是为什么?
  • 我刚刚编辑了我的帖子,在底部进行了解释。
【解决方案2】:
filename = 'passlist.txt'
with open (filename, 'a') as file_object:
    file_object.write(password)

使用 with 将在不再需要访问时关闭文件。

您还需要一个列表来附加您的密码;)

【讨论】:

    【解决方案3】:

    错误源于在password = open("passlist.txt", "a") 中重新分配密码。当您尝试将password 作为参数传递给password.write(password) 中的自身时,这会导致下一行出错。

    一些进一步的帮助

    你的想法是对的,但你忘了缩进。 for P in range(number): 下面的所有行都应该缩进,因为程序必须生成并写入一个新密码,直到它满足所需的密码数量。

    password = open("passlist.txt", "a") password.write(password) password.close() 行是不必要的,因为您要覆盖生成的密码并将该密码变量分配给不是字符串的东西;这就是您收到该错误的原因。

    这是带有调整的代码。

    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()
    
    

    【讨论】:

    • 感谢您的反馈和解释,我将继续阅读 :)
    • 这是我一直在寻找的结果,经过一些研究,我受过更多教育,谢谢你,我将继续深入研究 python。我必须结束讨论吗?我该怎么做?
    • @jkfrn._ 应该有一个选项可以在某处接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2014-11-16
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多