2017-07-30 1 views
0

Ich muss ein Programm schreiben, in Python, das eine Liste von Zahlen in einer separaten Textdatei sieht, und macht folgendes: Zeigt alle Zahlen aus der Datei an, addiert die Summe aller Zahlen, sagt mir, wie viele Zahlen in der Datei sind. Mein Problem ist, dass es die erste Zahl in der Datei überspringtLesen einer Datei in Python, ohne die erste Nummer zu überspringen

Hier ist der Code für das Programm, das in die Datei schreibt, wenn das überhaupt hilft:

import random 

amount = int (input ('How many random numbers do you want in the file? ')) 
infile = open ('random_numbers.txt', 'w') 
for x in range (amount): 
    numbers = random.randint (1, 500) 
    infile.write (str (numbers) + '\n') 
infile.close() 

Und hier ist mein Code für das Lesen der Zahlen in der Datei:

Jetzt ist mein Problem, dass es überspringt die erste Nummer in der Datei. Ich bemerkte zuerst, dass es mir nicht die richtige Anzahl von Zahlen gab, daher die zusätzliche Anweisung, eine zusätzliche 1 zu der Betragsvariablen hinzuzufügen. Aber dann habe ich erneut getestet und festgestellt, dass es die erste Nummer in der Datei übersprang.

+0

Es könnte sein, während Sie in die Datei schreiben, die Sie ''\ n'' am Ende der Zeile hinzugefügt haben, jetzt zum Zeitpunkt des Lesens konvertieren Sie' '\ n'' zu' int' was nicht möglich ist – ksai

+0

@ksai Ich bin mir ziemlich sicher, dass es richtig ist. Ich habe versucht, das \ n daraus zu entfernen, ohne Erfolg. – Whitekong

Antwort

2

Wie wäre:

with open('random_numbers.txt', 'r') as f: 
    numbers = map(lambda x: int(x.rstrip()), f.readlines()) 

Diese entfernt alle Hinterzeilenumbrüche aus der Zeile in der Zeichenfolge und dann wirft sie als int. Es schließt auch die Datei, wenn Sie damit fertig sind.

Ich bin mir nicht sicher, warum Sie wollen würde zählen, wie oft es Loops, aber wenn das, was Sie tun möchten, können Sie es auf diese Weise tun:

numbers = list() 
with open('random_numbers.txt', 'r') as f: 
    counter = 0 
    for line in f.readlines(): 
     try: 
      numbers.append(int(line.rstrip())) 
     except ValueError: # Just in case line can't be converted to int 
      pass 
     counter += 1 

Ich würde len(numbers) nur verwenden mit dem Ergebnis der ersten Methode, obwohl.

Wie ksai erwähnt, die ValueError kommt am wahrscheinlichsten wegen der \n am Ende der Zeile. Ich habe ein Beispiel hinzugefügt, um den ValueError mit einem try/except zu fangen, nur für den Fall, dass es auf eine Zeile trifft, die aus irgendeinem Grund nicht in eine Zahl umgewandelt werden kann.

Hier ist der Code erfolgreich in meinem Shell ausgeführt wird:

In [48]: import random 
    ...: 
    ...: amount = int (input ('How many random numbers do you want in the file? 
    ...: ')) 
    ...: infile = open ('random_numbers.txt', 'w') 
    ...: for x in range (amount): 
    ...:  numbers = random.randint (1, 500) 
    ...:  infile.write (str (numbers) + '\n') 
    ...: infile.close() 
    ...: 
How many random numbers do you want in the file? 5 

In [49]: with open('random_numbers.txt', 'r') as f: 
    ...:  numbers = f.readlines() 
    ...:  numbers = map(lambda x: int(x.rstrip()), numbers) 
    ...:  

In [50]: numbers 
Out[50]: <map at 0x7f65f996b4e0> 

In [51]: list(numbers) 
Out[51]: [390, 363, 117, 441, 323] 
0

, wie in Ihrem Code Unter der Annahme, dass diese Zahlen erzeugt, dass der Inhalt von 'random_numbers.txt' ganze Zahlen von Zeilenumbrüchen getrennt sind:

with open('random_numbers.txt', 'r') as f: 
    numbers = [int(line) for line in f.readlines()] 
    total = sum(numbers) 
    numOfNums = len(numbers) 

"Zahlen" enthält alle Zahlen aus der Datei in einer Liste. Sie können dies ausdrucken oder drucken (','. Join (map (str, numbers))), wenn Sie die eckigen Klammern nicht möchten.

'total' ist ihre Summe

'numOfNums' ist, wie viele Zahlen in der Datei waren.

0

Was für mich schließlich arbeitete, war dies:

amount = 0 
total = 0 
infile = open ('random_numbers.txt', 'r') 
numbers = (infile.readline()) 
try: 

    while numbers: 
     numbers = (infile.readline()) 
     numbers = numbers.strip('\n') 
     numbers = int (numbers) 
     print (numbers) 
     total += numbers 
     amount += 1 

except ValueError: 
    pass 
print ('') 
print ('') 
amount +=1 
print ('Your total is: ' ,total) 
print ('The amount of numbers in file is: ', amount) 

Spitze Cory auf einen Versuch Hinzufügen und außer das, was ich glaube, dass der Trick tun endete.

+0

vergesst, jetzt ist es ein Problem mit dem Überspringen der ersten Nummer in der Datei – Whitekong

+0

Es überspringt die erste Zahl, weil Sie es sofort in der ersten Zeile Ihrer 'while' Anweisung überschreiben. Ich würde auch das "try/except" in die "while" -Schleife legen, so dass es nicht auf der ersten schlechten Zeile stoppt. –

+0

Wie würde ich es umgehen, es zu überschreiben? – Whitekong

0

Wenn Sie mich, ich möchte so kodieren:

from random import randint 

fname = 'random_numbers.txt' 
amount = int(input('How many random numbers do you want in the file? ')) 
with open(fname, 'w') as f: 
    f.write('\n'.join([str(randint(1, 500)) for _ in range(amount)])) 

with open(fname) as f: 
    s = f.read().strip()  
numbers = [int(i) for i in s.split('\n') if i.isdigit()] 
print(numbers) 

Oder wie folgt aus (müssen pip install numpy):

import numpy as np 
from random import randint 

fname = 'random_numbers.txt' 
amount = int(input('How many random numbers do you want in the file? ')) 
np.array([randint(1, 500) for _ in range(amount)]).tofile(fname) 

numbers = np.fromfile(fname, dtype='int').tolist() 
print(numbers) 
0

Ich denke, die Frage ist, wie Sie den Code, wie Sie platziert unbeabsichtigt ausgelassen die erste Zeile mit einem anderen Anruf von infile.readline()

amount = 0 
total = 0 
infile = open ('random_numbers.txt', 'r') 
numbers = (infile.readline()) 
try: 

    while numbers: 
     numbers = numbers.strip('\n') 
     numbers = int (numbers) 
     print (numbers) 
     total += numbers 
     amount += 1 
     numbers = (infile.readline())  #Move the callback here. 


except ValueError: 
    raise ValueError 
print ('') 
print ('') 
# The amount should be correct already, no need to increment by 1. 
# amount +=1 

print ('Your total is: ' ,total) 
print ('The amount of numbers in file is: ', amount) 

Funktioniert gut für mich.

Verwandte Themen