likoyrgos Δημοσ. 26 Φεβρουαρίου 2022 Δημοσ. 26 Φεβρουαρίου 2022 Γειά σας! Έχουμε το εξής πρόβλημα σε 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 βγάζει λάθος? Ευχαριστώ!
SOADNICK Δημοσ. 27 Φεβρουαρίου 2022 Δημοσ. 27 Φεβρουαρίου 2022 (επεξεργασμένο) Καλησπέρα, απ' το 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() το άφησα έτσι. Επεξ/σία 27 Φεβρουαρίου 2022 από SOADNICK Προσθήκη εξήγησης
virxen75 Δημοσ. 27 Φεβρουαρίου 2022 Δημοσ. 27 Φεβρουαρίου 2022 θέλει binary αρχείο να δουλέψει fin=open("test.txt","rb")
likoyrgos Δημοσ. 27 Φεβρουαρίου 2022 Μέλος Δημοσ. 27 Φεβρουαρίου 2022 Οκ ευχαριστώ πολύ για τις απαντήσεις ! Λύθηκε η απορία !
DrKo Δημοσ. 1 Μαρτίου 2022 Δημοσ. 1 Μαρτίου 2022 (επεξεργασμένο) Στις 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() Δουλεύει και με πολλαπλές γραμμές, και με αριθμούς με παραπάνω ψηφία. Επεξ/σία 1 Μαρτίου 2022 από DrKo 1
likoyrgos Δημοσ. 10 Μαρτίου 2022 Μέλος Δημοσ. 10 Μαρτίου 2022 Τώρα είδα την νεα απάντηση! Θα προσπαθήσω να την καταλάβω μιας και είμαι ολίγον άσχετος και τώρα την μαθαίνω (για προσωπική χρήση, απο ενδιαφέρον). Ευχαριστώ πάντως !
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα