f. write (python) writes "None" to the file

Asked

Viewed 75 times

-1

Hello, I am beginner and am trying to create a program that generates a text file but each line being random (based on predefined phrase).

The code works and does not return errors at the prompt, but it only writes "None" in the file. And if repeat 3 times, appears 3 times None (Nonenonenone).

This is an example of the code:

import random

with open('texto.txt','a') as f:
    print('Para finalizar, digite "fim"')
    while True:
    
        escolha1 = input("escolha uma letra: ")
        if escolha1 == "fim":
            break
        escolha2 = input("escolha de novo: ")
    
        texto1 = ["%s é uma letra diferente de %s"%(escolha1,escolha2),"os dois são diferentes","%s não parece com %s"%(escolha1,escolha2)]
        texto2 = ["os dois são iguais"," são mesma coisa","escolheu a mesma coisa"]

        if escolha1 != escolha2:
            q = str(random.choice(texto1))
            f.write(str(print('%s' % q)))

        else:
            w = str(random.choice(texto2))
            f.write(str(print('%s' % w)))

        continue
    
print("fim")
f.close()

I’ve tried it myself f = open("texto.txt", "a") and with the f.write straightforward (f.write(str(random.choice(texto))))

  • f.write(str(print('%s' % q))), what you are writing in the file is the return of the function print, that will always be None. If you want the phrase to be written in the file, just do it f.write(q)

1 answer

1


About the problem of just writing None in your file is due to the fact that in your code what you have write is the return of the function print, converted to string.

f.write(str(print('%s' % q)))

The function print will send the parameter passed to the default system output, STDOUT, and will always return None. When using the class str, you create the string "None", which is written in the file. If the intention is to write the value of q on file, just do f.write(q).

About the rest of your code, I would suggest doing something like:

import random

# Evite nomear variáveis apenas com uma letra, pode não ficar legível o suficiente
with open('texto.txt','a') as stream:

    print('Para finalizar, digite "fim"')

    while True:
    
        escolha1 = input("escolha uma letra: ")
        if escolha1 == "fim":
            break

        escolha2 = input("escolha de novo: ")
        # Permite o usuário finalizar o programa na segunda opção também
        if escolha2 == "fim":
            break
    
        # Nomes de variáveis sugestivos com o seu propósito
        # Prefira utilizar as f-strings para a interpolação de strings no lugar de %
        textos_letras_diferentes = [
            f"{escolha1} é uma letra diferente de {escolha2}",
            "os dois são diferentes",
            f"{escolha1} não parece com {escolha2}"
        ]

        textos_letras_iguais = [
            "os dois são iguais",
            "são mesma coisa",
            "escolheu a mesma coisa"
        ]

        # Para escrever no arquivo, a única coisa que muda é a lista de frases, então...
        textos = textos_letras_diferentes if escolha1 != escolha2 else textos_letras_iguais 

        # Não precisa converter para str aquilo que já é string
        texto = random.choice(textos)
        stream.write(texto)

        # Não precisa utilizar o "continue" no final do laço
    
print("fim")

# Não precisa fechar o arquivo explicitamente, o "with" fará isso para você

Browser other questions tagged

You are not signed in. Login or sign up in order to post.