Προς το περιεχόμενο

Error σε πρόγραμμα Python .Γιατί ?


likoyrgos

Προτεινόμενες αναρτήσεις

Γειά σας!

Έχουμε το εξής πρόβλημα σε Python 3.7.2:

 Έστω ότι σε ένα αρχείο κειμένου «test.txt»  υπάρχουν αποθηκευμένοι 10 διψήφιοι αριθμοί χωρισμένοι μεταξύ τους με ένα κενό διάστημα, όπως αυτοί που φαίνονται παρακάτω :
 

10

 11

 12 

13

 14 

15 

16 

17

 18

 19

Να γραφεί πρόγραμμα που να υπολογίζει και να εμφανίζει τον μέσο όρο των αριθμών που είναι μεγαλύτεροι του 17.

η λύση που έδωσα είναι :

sum=0.0
pl=0
fin=open("test.txt","w")

for i in range (10,20):
    fin.write(str(i)+" ")

fin=open("test.txt","r")

print(fin.read())

fin.seek(0,0)

for i in range(10):
    a=int(fin.read(2))
    fin.seek(1,1) 
    if a>17:
        sum=sum+a
        pl+=1
    

mo=sum/pl
print ("Mesos oros= ",mo)

 

και μου βγάζει το μήνυμα : 

fin.seek(1,1)
io.UnsupportedOperation: can't do nonzero cur-relative seeks

Δεν καταλαβαίνω το λάθος με την seek μιας και λέω να μετακινηθεί μια θέση δεξιότερα απο αυτή που είναι ήδη για να "αποφύγω" το κενό.

Βέβαια το πρόβλημα το έλυσα βάζοντας στην θέση της seek --> fin.read(1) και δουλεύει μια χαρά!

Μπορεί κάποιος να λύσει την απορία μου γιατί με την seek βγάζει λάθος?

Ευχαριστώ!


 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Καλησπέρα,

απ' το documentation :

Αναφορά σε κείμενο

In text files (those opened without a b in the mode string), only seeks relative to the beginning of the file are allowed (the exception being seeking to the very file end with seek(0, 2)) and the only valid offset values are those returned from the f.tell(), or zero. Any other offset value produces undefined behaviour.

Θες οπωσδήποτε λύση με χρήση της seek;

Αν ναι, αυτό δουλεύει:

for i in range(10):
	# a=int(fin.read(2))
	# fin.seek(1,1) 
	
	fin.seek(fin.tell())
	a = int(fin.read(3))
	
	if a > 17:
		sum += a
		pl += 1

Η διαφορά είναι ότι στη seek χρησιμοποιώ αναζήτηση απ' την αρχή του αρχείου (whence = 0) και offset που δίνεται από την tell() όπως λέει το doc. Οπότε από κάτω διαβάζω 3 χαρακτήρες πχ "10 " (μαζί με το κενό) ώστε η tell() μετά να δείξει στον επόμενο διψήφιο.

Προφανώς αυτό σημαίνει ότι το πρόγραμμα δε θα παίξει με μη διψήφιους αριθμούς αλλά μιας και είχες και εσύ hardcoded το 2 στη read() το άφησα έτσι.

Επεξ/σία από SOADNICK
Προσθήκη εξήγησης
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
Στις 27/2/2022 στις 10:51 ΜΜ, likoyrgos είπε

Οκ ευχαριστώ πολύ για τις απαντήσεις !

Λύθηκε η απορία !

Μιας και λύθηκε η απορία, μία πιο σωστή λύση θα ήταν:

from pathlib import Path
from statistics import mean


def main():
    file_name = "test.txt"
    numbers = [float(word.strip()) for word in Path(file_name).read_text().split()]
    print(numbers)
    result = mean([number for number in numbers if number > 17])
    print(result)


if __name__ == '__main__':
    main()

Εάν θέλεις να το κάνεις πιο compact, μπορείς να κάνεις: 

from pathlib import Path
from statistics import mean


def main():
    file_name = "test.txt"
    print(mean([i for i in [float(word.strip()) for word in Path(file_name).read_text().split()] if i >= 17]))


if __name__ == '__main__':
    main()

 

Δουλεύει και με πολλαπλές γραμμές, και με αριθμούς με παραπάνω ψηφία. 

Επεξ/σία από DrKo
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Τώρα είδα την νεα απάντηση!

Θα προσπαθήσω να την καταλάβω μιας και είμαι ολίγον άσχετος και τώρα την μαθαίνω (για προσωπική χρήση, απο ενδιαφέρον).

Ευχαριστώ πάντως !

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...