EOF w Pythonie

0

Jak w Pythonie wczytuje się np. liczby umieszczone w kolejnych wierszach, jeżeli nie wiem ile tych liczb mam. Chodzi mi o zrobienie czegoś na kształt EOF w C.
Spróbowałem coś takiego, ale w SPOJ wyrzuca mi błąd wykonania NZEC:

suma = 0

while True:
    a = input()
    if a == '':
        break
    suma += int(a)
print(suma)

Program wczytuje liczby w kolejnych linijkach i podaje ich sumę.

0

Możesz iterować po fileinput.input():

import fileinput
     
print(sum(int(line) for line in fileinput.input()))
python test.py <<EOF
> 1
> 2
> 3
> EOF
6
0

Nie robię na codzien w Pythonie, ale czy tu przypadkiem nie chodzi o EOL? Bo EOF jak nazwa wskazuje to end of file.

0
axelbest napisał(a):

ale czy tu przypadkiem nie chodzi o EOL? Bo EOF jak nazwa wskazuje to end of file.
Chodzi mi o EOF. Żebym wiedział przy wczytywaniu, że to już koniec. Coś w stylu C;

c = getchar();
while (c != EOF) {
   zrob_cos_ze_znakiem(c);
   c = getchar();
}
0
axelbest napisał(a):

Nie robię na codzien w Pythonie, ale czy tu przypadkiem nie chodzi o EOL? Bo EOF jak nazwa wskazuje to end of file.
Python pobiera całą linię poleceniem input(), nie w tym problem.
Problem, że jak mu powiedzieć, że koniec wszystkich linii, a nie wiem ile tych linii.

0

Nie musisz wiedzieć gdzie jest koniec pliku, ani ile jest linii. Skorzytaj z context managera i będziesz miał problem z głowy:

with open('file.txt') as f:
    lines = f.read().splitlines()

Po wykonaniu tego kodu będziesz miał kolejne linie pliku w kolejnych elementach listy lines.

0
Haskell napisał(a):

Nie musisz wiedzieć gdzie jest koniec pliku, ani ile jest linii. Skorzytaj z context managera i będziesz miał problem z głowy:

with open('file.txt') as f:
    lines = f.read().splitlines()

Tylko, że ja nie znam nazwy pliku. Tak jest np. jak rozwiązuję sobie zadania na sprawdzarce (np. SPOJ). Muszę korzystać ze standardowego wejścia i wyjścia :(

0
> seq 10 | python3 -c 'import sys; print(sum(map(int, sys.stdin)))'
55
> seq 10 | python3 -c 'import sys; print(sum(int(ln) for ln in sys.stdin))'
55
> seq 10 | python3 -c '
  import sys
  
  total = 0
  for line in sys.stdin:
      total += int(line)
  
  print(total)
  '
55
> 

SPOJ jest ujowy. Przerzuć się na LeetCode.

0

Pokaż to zadanie, żebyśmy dokładnie wiedzieli o co chodzi, bo tak to zgadujemy.

0
Mózg napisał(a):
  import sys
  
  total = 0
  for line in sys.stdin:
      total += int(line)
  
  print(total)
  
> 

Ten sposób działa. Dzięki:)

0
lion137 napisał(a):

Pokaż to zadanie, żebyśmy dokładnie wiedzieli o co chodzi, bo tak to zgadujemy.
To było zadanie:
https://pl.spoj.com/problems/SUMA/

Ale tu nie chodziło o algorytm, bo ten jest prosty tylko o technikę, żeby to weszło bez błędów.
Przerzuciłem się z C/C++ na Python. Mówią, że łatwiejszy a tu takie kwiatki;)

0

Ja zwykle robiłem to tak:

while True:
    try:
        txt = input()
        #tu twój kod
    except:
        break

pamiętaj tylko że w niektórych zadaniach występują puste linie o których nie ma wzmianki w specyfikacji, musisz to uwzględnić.

0

Jednym wielkim kwiatkiem jest SPOJ, jak już @Mózg wspomniał, lepiej się przerzucić na LeetCode, nawet na CodeWars albo pewnie jeszcze trochę podobnych serwisów by się znalazło, tam dostajesz sensowne środowisko uruchomieniowe i konkretną informację co jest źle, w którym momencie, przy jakim teście itd. :)

0
Guaz napisał(a):

Jednym wielkim kwiatkiem jest SPOJ, jak już @Mózg wspomniał, lepiej się przerzucić na LeetCode, nawet na CodeWars albo pewnie jeszcze trochę podobnych serwisów by się znalazło, tam dostajesz sensowne środowisko uruchomieniowe i konkretną informację co jest źle, w którym momencie, przy jakim teście itd. :)

Chciałem trochę problemów algorytmicznych porozwiązywać, a znałem tylko SPOJ ze starych dobrych czasów;)
PS. Tu by mi się ta wiadomość nie przydała, gdzie błąd.

0
sig napisał(a):

Ja zwykle robiłem to tak:

while True:
    try:
        txt = input()
        #tu twój kod
    except:
        break

To też mógłby być sposób. Próbowałem wcześniej, ale wyjątki jeszcze chyba nie opanowałem, bo coś mi nie wychodziło.

0

Niestety dalej napotykam problem z wczytywaniem. Mianowicie mam niewiadomą liczbę linii postaci np "+ 2 3" i muszę wczytać linię i napisać wynik, w tym wypadku chodzi o dodawanie. Robię to wcześniejszym sposobem kolegi Mózga:

import sys

for item in sys.stdin:
    wiersz = [str(s) for s in input().split()] 
    if wiersz[0] == "+":
        wynik = int(wiersz[1]) + int(wiersz[2])
        print(wynik)
    elif wiersz[0] == "-":
        wynik = int(wiersz[1]) - int(wiersz[2])
        print(int(wynik))

Niestety liczy tylko co drugą linijkę. Gdzie jest błąd?

1

przekombinowałeś

import sys

for item in sys.stdin:
    wiersz = item.split()
    if wiersz[0] == "+":
        wynik = int(wiersz[1]) + int(wiersz[2])
        print(wynik)
    elif wiersz[0] == "-":
        wynik = int(wiersz[1]) - int(wiersz[2])
        print(int(wynik))

edit: masz input.split(), a to wczytuje dodatkową linię. Tą wczytaną przez for item ... pomijasz

0
pjanu napisał(a):
for item in sys.stdin:
    wiersz = [str(s) for s in input().split()]

https://i.imgur.com/LOrydob.jpg

0
sig napisał(a):

przekombinowałeś

Faktycznie przekombinowałem. Czego ja nie zmieniałem. Łączę praktykę z teorią (nie działa i nie wiem dlaczego). Prostota Pythona kolejny raz mnie zawodzi.
Wielkie dzięki sig:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1