J'ai besoin de lire l'entrée d'un fichier texte et de créer un nouveau fichier texte avec la sortie en elle. Pour le moment, mon code se lit bien, mais il n'écrit que la dernière ligne de données, sans passer par toutes les lignes. Quelqu'un peut-il m'aider à résoudre ce problème?

def generate_daily_totals(input_filename, output_filename):
  """Returns date followed by the sum of values"""
  infile = open(input_filename)

for line in infile:
    content = line.split(",")
    date = content[0]
    total = 0
    for value in content[1:]:
        total = total + float(value)
    rounded_total = "{:.2f}".format(total)
    summary = date + " " + "=" + " "  + rounded_total
  outfile = open(output_filename, "w")
  outfile.write(summary)    

generate_daily_totals('data60.txt', 'totals60.txt')
checker = open('totals60.txt')
print(checker.read())
checker.close() 

L'entrée est

2006-04-10,836.2,563.263
2006-04-10,462.06,1694.3,666.0
2006-04-10,1318.19,1485.62
2006-04-10,49.714,304.0,1269.0
2006-04-10,1360.0,1731.0,28.6
2006-04-10,998.879,890.264,367.0
2006-04-10,757.4,1501.05,861.6
2006-04-10,1218.0,270.0

Ce que je reçois pour la sortie est

2006-04-10 = 1488.00

Mais le bon devrait être

2006-04-10 = 1399.46
2006-04-10 = 2822.36
2006-04-10 = 2803.81
2006-04-10 = 1622.71
2006-04-10 = 3119.60
2006-04-10 = 2256.14
2006-04-10 = 3120.05
2006-04-10 = 1488.00
0
user9644895 14 avril 2018 à 12:10

3 réponses

Meilleure réponse

Votre code ouvre à nouveau votre fichier de sortie dans la boucle. Chaque fois qu'il fait cela, il écrase ce qu'il a fait la fois précédente dans la boucle.

outfile = open(output_filename, "w")
outfile.write(summary)  

Ouvrez votre fichier de sortie avant de commencer à parcourir l’entrée.

with open(output_filename, "w") as outfile:
  for line in infile:
    content = line.split(",")
    date = content[0]
    total = 0
    for value in content[1:]:
        total = total + float(value)
    rounded_total = "{:.2f}".format(total)
    summary = date + " " + "=" + " "  + rounded_total + "\n"
    outfile.write(summary)   
1
BoarGules 14 avril 2018 à 10:09

Vous devez ouvrir le fichier de sortie en mode append.

def generate_daily_totals(input_filename, output_filename):
    """Returns date followed by the sum of values"""
    infile = open(input_filename)

    for line in infile:        
        content = line.split(",")
        date = content[0]
        total = sum(map(float, content[1:])) # No need for the inner loop
        rounded_total = "{:.2f}".format(total)
        summary = date + " " + "=" + " "  + rounded_total        
        outfile = open(output_filename, "a")
        outfile.write(summary + '\n')

generate_daily_totals('data60.txt', 'totals60.txt')

Sortie écrite dans le fichier:

2006-04-10 = 1399.46
2006-04-10 = 2822.36
2006-04-10 = 2803.81
2006-04-10 = 1622.71
2006-04-10 = 3119.60
2006-04-10 = 2256.14
2006-04-10 = 3120.05
2006-04-10 = 1488.00
0
Srisaila 14 avril 2018 à 09:35

Le problème avec votre code est la ligne suivante:

outfile = open(output_filename, "w")

En ouvrant le fichier en tant que fichier d'écriture, vous remplacez tout le reste du fichier. Au lieu de cela, vous devez utiliser append:

outfile = open(output_filename, "a")
0
Dan 14 avril 2018 à 09:19