2
votes

Sortie de la fonction d'écriture Python dans un fichier

Je suis désolé si c'est une question idiote mais je n'ai pas beaucoup d'expérience Python

J'ai une fonction pour comparer des fichiers

f = open('changes.txt', 'w')

f.write(str(result))

f.close

Je veux imprimer la sortie de la fonction sur un fichier texte

result=compare_files("1.txt", "2.txt")

print (result)
Line changed:Line-1-aaaaa
Line added:Line-2-sss
None

J'ai essayé de suivre:

def compare_files(file1, file2):
    fname1 = file1
    fname2 = file2

    # Open file for reading in text mode (default mode)
    f1 = open(fname1)
    f2 = open(fname2)
    # Print confirmation
    #print("-----------------------------------")
    #print("Comparing files ", " > " + fname1, " < " +fname2, sep='\n')
    #print("-----------------------------------")

    # Read the first line from the files
    f1_line = f1.readline()
    f2_line = f2.readline()

    # Initialize counter for line number
    line_no = 1

    # Loop if either file1 or file2 has not reached EOF

    while f1_line != '' or f2_line != '':

       # Strip the leading whitespaces
      f1_line = f1_line.rstrip()
      f2_line = f2_line.rstrip()

      # Compare the lines from both file
      if f1_line != f2_line:

         ########## If a line does not exist on file2 then mark the output with + sign
        if f2_line == '' and f1_line != '':
            print ("Line added:Line-%d" % line_no + "-"+ f1_line)
         #otherwise output the line on file1 and mark it with > sign
        elif f1_line != '':
            print ("Line changed:Line-%d" % line_no + "-"+ f1_line)


        ########### If a line does not exist on file1 then mark the output with + sign
        if f1_line == '' and f2_line != '':
            print ("Line removed:Line-%d" % line_no + "-"+ f1_line)
          # otherwise output the line on file2 and mark it with < sign
         #elif f2_line != '':
            #print("<", "Line-%d" %  line_no, f2_line)

         # Print a blank line
         #print()

    #Read the next line from the file
      f1_line = f1.readline()
      f2_line = f2.readline()
      #Increment line counter
      line_no += 1

    # Close the files
    f1.close()
    f2.close()

mais seul None est imprimé sur changes.txt

J'utilise "contournement" sys.stdout mais je me demande s'il existe un autre moyen au lieu de rediriger la sortie d'impression.

Si dans la sortie de la fonction, je spécifie return au lieu de print, alors je ne reçois que le premier ligne de sortie (Ligne modifiée: Line-1-aaaaa) en changes.txt


4 commentaires

L'instruction return est manquante dans la fonction compare_files .


j'ai écrit en question que si j'ajoute un retour, une seule ligne est retournée


@script Si vous voulez "retourner" plusieurs entrées, vous devez les céder , en transformant la fonction en fonction de générateur et en la traitant comme ça.


Il semble qu'il vous manque beaucoup de connaissances de base ... le moyen le plus simple pour vous, je crois, est de faire la redirection dans shell. par exemple. python votre_script.py> fichier_sortie.txt . Un autre moyen simple consiste à ajouter cette ligne à une liste au lieu d ' imprimer dans votre fonction de comparaison. A la fin de la fonction, retournez la liste. Ensuite, vous aurez le retour de la fonction étant le "résultat de la comparaison" (en texte), et l'appelant pourra alors l'enregistrer dans un fichier (ou l'imprimer ou autre). (Generator etc semble trop compliqué pour vous maintenant)


4 Réponses :


1
votes

Votre fonction 'compare_files' ne renvoie rien et donc rien n'est écrit dans le fichier. Faites de la fonction " retour " quelque chose et cela devrait fonctionner.


1 commentaires

j'ai écrit en question que si j'ajoute un retour, une seule ligne est retournée



0
votes

Votre fonction ne renvoie rien, vous imprimez donc "Aucun". Si vous voulez que toute l'impression aille dans un fichier au lieu de stdout comme il le fait par défaut, vous pouvez chane chaque instruction d'impression comme vous l'avez fait à la valeur de retour.

Ou vous pouvez utiliser la redirection pour tout le programme comme dans ici .


0 commentaires

0
votes

Comme vous ne renvoyez rien par défaut, la fonction renvoie Aucun , ce qui est reflété dans votre fichier changes.txt . vous pouvez créer une variable qui stocke la sortie souhaitée et la renvoie.

def compare_files(file1, file2):
    fname1 = file1
    fname2 = file2

    # Open file for reading in text mode (default mode)
    f1 = open(fname1)
    f2 = open(fname2)

    output_string = ""

    # Print confirmation
    # print("-----------------------------------")
    # print("Comparing files ", " > " + fname1, " < " +fname2, sep='\n')
    # print("-----------------------------------")

    # Read the first line from the files
    f1_line = f1.readline()
    f2_line = f2.readline()

    # Initialize counter for line number
    line_no = 1

    # Loop if either file1 or file2 has not reached EOF

    while f1_line != '' or f2_line != '':

        # Strip the leading whitespaces
        f1_line = f1_line.rstrip()
        f2_line = f2_line.rstrip()

        # Compare the lines from both file
        if f1_line != f2_line:

            ########## If a line does not exist on file2 then mark the output with + sign
            if f2_line == '' and f1_line != '':
                print("Line added:Line-%d" % line_no + "-" + f1_line)
                output_string += "Line added:Line-%d" % line_no + "-" + f1_line + "\n"
            # otherwise output the line on file1 and mark it with > sign
            elif f1_line != '':
                print("Line changed:Line-%d" % line_no + "-" + f1_line)
                output_string += "Line changed:Line-%d" % line_no + "-" + f1_line +"\n"

            ########### If a line does not exist on file1 then mark the output with + sign
            if f1_line == '' and f2_line != '':
                print("Line removed:Line-%d" % line_no + "-" + f1_line)
                output_string += "Line removed:Line-%d" % line_no + "-" + f1_line +"\n"
            # otherwise output the line on file2 and mark it with < sign
            # elif f2_line != '':
        # print("<", "Line-%d" %  line_no, f2_line)

        # Print a blank line
        # print()

        # Read the next line from the file
        f1_line = f1.readline()
        f2_line = f2.readline()
        # Increment line counter
        line_no += 1

    # Close the files
    f1.close()
    f2.close()
    return output_string


0 commentaires

0
votes

Votre compare_files () s’imprime, mais ne transmet rien à son appelant.

Si vous voulez transmettre un élément à l’appelant, vous utilisez retour . Le flux de votre fonction s'arrête là.

Si vous voulez passer plusieurs éléments à l'appelant, vous les cédez . L'utilisation de yield transforme votre fonction en fonction de générateur. L'appel d'une fonction génératrice produit un objet générateur qui peut être itéré.

Exemple:

def produce_strings():
    for i in ['a', 'b', 'c']:
        yield i + "x"

result = "\n".join(produce_strings())
print(result) # prints a line end separated string made of "ax", "bx" and "cx".


0 commentaires