Python inFile z pętlą


Próbuję otworzyć plik w Pythonie, aby usunąć średnie z pliku input.txt. Po wykonaniu średnich należy je umieścić na przykład po nazwisku każdej osoby
<student>'s score is <avg> bacons.

Nie rozmawialiśmy jeszcze o tym na zajęciach, więc nie jestem pewien, co robię. Domyślam się, że powinniśmy używać pętli, ale nie jestem do końca pewien, jak bym to zaimplementował.
Oto kod, który zwraca tę średnią jako nieprawidłową składnię:
def main():
inFile = open("input.txt","r")
numVals = int(inFile.readline())
name = inFile.readline()
number = float(int(inFile.readline().split())
avg = float(int(number[0]* .3 + number[1]* .1 + number[2]* .6))
print("name[0 , len(name)]'s Score is",avg,"bacons.")
inFile.close()main()

Plik wejściowy zawiera
5
Amelia
90 100 75
George
87 90 90
Adam
100 80 85
Jenny
75 80 90
Carl
86 87 88

Jakakolwiek pomoc w tej sprawie byłaby bardzo mile widziana. Nie mam pojęcia, co robić.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twoim pierwszym problemem jest ta linia:
number = float(int(inFile.readline().split())

Masz cztery
(
C, ale tylko trzy
)
C.
Dlatego Python oczekuje, że wyrażenie będzie kontynuowane w następnym wierszu, ale widzi
=
, które nie może pojawić się w środku wyrażenia, więc generuje
SyntaxError
.
Kiedy otrzymasz
SyntaxError
w wierszu, który wygląda zupełnie normalnie, możesz spróbować dwóch dobrych rzeczy.
Najpierw podziel tę linię na mniejsze części, umieść te mniejsze części w interaktywnym tłumaczu i tak dalej.
Po drugie, gdy jesteś pewien, że ta linia jest w porządku, spójrz na linię nad nią i policz nawiasy (zarówno nawiasy, jak i nawiasy). Dobry edytor znacznie to ułatwia - lub po prostu wpisz łańcuch do interaktywnego interpretera; jeśli nie zamknąłeś wszystkich nawiasów klamrowych, otrzymasz
...
zamiast
& > & > & >
, co oznacza, że ​​czeka na Ciebie zakończ poprzednią linię, nie czekając na całą nową linię.
Po przejściu przez to otrzymasz
ValueError
, ponieważ próbujesz zadzwonić do
int
z
listy
trzech wierszy, które otrzymałeś z
readline
. To nie działa; musisz zadzwonić do
int
na każdym z nich. Więc zamiast tego:
numbers = float(int(inFile.readline().split()))

Zrób to:
numbers = [float(int(number)) for number in inFile.readline().split()]

Jeśli jeszcze nie nauczyłeś się rozumieć listy, będziesz musiał to zrobić za pomocą pętli. Na przykład:
numbers = inFile.readline().split()
for n in range(len(numbers)):
numbers[n] = float(int(numbers[n]))

Nawiasem mówiąc, nie bardzo rozumiem, dlaczego robisz
float (int (...))
. Jeśli chcesz skrócić je wszystkie do wartości całkowitych, nie potrzebujesz tutaj
float
- mnożenie liczb całkowitych przez .3 działa dobrze. Jeśli chcesz przechowywać jakąkolwiek część dziesiętną, nie potrzebujesz
int
. Więc po prostu użyj jednego lub drugiego.
I robisz to samo w następnym wierszu:
avg = float(int(number[0]* .3 + number[1]* .1 + number[2]* .6))

Wynik to
liczba [0] * .3 + liczba [1] * .1 + liczba [2] * .6
to
float
jak
89.1
dla George'a. Następnie konwertujesz to na
int
, co da ci
89
. Następnie konwertujesz go z powrotem na
float
, uzyskując
89.0
. Nie mogę sobie wyobrazić, że właśnie tego chcesz - prawdopodobnie chcesz nieprzekonwertowanego
89.1
lub może obciętego
89
jako
int
zamiast
89.0
jako wprowadzający w błąd
float
.
Poza tym sposób drukowania jest dość dziwny i nie jestem pewien, co to ma zrobić:
print("name[0 , len(name)]'s Score is",avg,"bacons.")

Spowoduje to wydrukowanie czegoś takiego:
name[0 , len(name)]'s Score is 89.0 bacons.

Jeśli chcesz wyświetlić wartość zmiennej, nie cytuj jej:
print(name, "'s Score is",avg,"bacons.")

Ale cokolwiek spróbujesz zrobić z tymi
0
i
len (name)
... cóż, nie wiem, co próbujesz zrobić, więc nie mogę wyjaśnić, jak Zrób to.
W każdym razie to wydrukuje:
George 's Score is 89.0 bacons.

Prawdopodobnie nie potrzebujesz tej spacji po
George
, prawda? Najlepszym sposobem obejścia tego jest użycie formatowania ciągów:
print("{}'s Score is {} bacons'".format(name, avg))

Jeśli jeszcze się tego nie nauczyłeś, szczerze mówiąc, myślę, że najlepiej jest zająć się dodatkową spacją lub może przepisać zdanie tak, aby nie stanowiło problemu:
print(name, 'has a score of', avg, 'bacons.')

Lub, oczywiście, naucz się tego sam, zanim twój nauczyciel do tego dojdzie. To nie jest takie trudne.
Wreszcie, przechodząc obok tego, czytasz tylko jedno nazwisko i listę numerów, a nie
numVals
z nich. Aby to zrobić, potrzebujesz pętli:
def main():
inFile = open("input.txt","r")
numVals = int(inFile.readline())
for i in range(numVals):
name = inFile.readline()
# ... the rest of your code that happens for each player
# ... the code that happens after all the players, like inFile.close()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W końcu to rozgryzłem. Mój kod nie działał z wielu powodów, głównie b/c Nie wiedziałem, jak ważne są wcięcia
def main(): inFile = open("input.txt","r")
numVals = int(inFile.readline())
for i in range(numVals): name = inFile.readline().replace("\n","")
numbers = inFile.readline().split()
avg = float(numbers[0])*.3 + float(numbers[1])*.1 + float(numbers[2])*.6
print(name,'has a final score of',avg)
inFile.close()
main()

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się