Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: TypeError σε άνοιγμα αρχείου

TypeError σε άνοιγμα αρχείου 13 Χρόνια 11 Μήνες πριν #1031

  • Danny Pedrosa
  • Το Άβαταρ του/της Danny Pedrosa
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 12
Έχω την εξής άσκηση που με έχει δυσκολέψει σε ένα σημείο και θα ήθελα βοήθεια.Η άσκηση λέει:Να γραφεί πρόγραμμα σε python που θα αποθηκεύει όλα τα ετήσια ημερολόγια του 21ου αιώνα σε ξεχωριστά αρχεία με ονόματα της μορφής xxxx.txt,όπου xxxx το αντίστοιχο έτος.
Εγώ σκέφτηκα το εξής:

for i in range(2001,2101):
a=calendar(i)
b=i,".txt"
hmerologio=open(b,"w")
hmerologio.write(a)
hmerologiao.close()

Aλλά μου βγάζει το εξής λάθος:
TypeError: coercing to Unicode: need string or buffer, tuple found

Μπορεί κάποιος να μου πει τι να αλλάξω για να τρέχει;
Τελευταία διόρθωση: 13 Χρόνια 10 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 11 Μήνες πριν #1032

  • TravelerInTime
  • Το Άβαταρ του/της TravelerInTime
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 2
Πρώτα απ'όλα στην τρίτη γραμμή αυτό που ήθελες να γράψεις είναι b= i +'.txt' διότι έτσι κάνεις assign μία τιμή στη μεταβλητή b. Έτσι όπως το έχεις γράψει εσύ ορίζεις μια πλειάδα που αποτελείται από έναν ακέραιο και ένα string, συνεπώς η μεταβλητή b έχει δύο αντικειμένα μέσα της και δεν μπορεί να χρησιμοποιηθεί ως όνομα αρχείου. Αλλά και έτσι όπως σου είπα στην αρχή δεν είναι επίσης σωστό, διότι η Python δεν υποστηρίζει concantenation μεταξύ ενός integer και ενός string, και συνεπώς χρειάζεται να μετατρέψεις τον integer σε string. Το σωστό δηλαδή θα είναι να γράψεις b= str(i) +'.txt'
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 11 Μήνες πριν #1033

  • Danny Pedrosa
  • Το Άβαταρ του/της Danny Pedrosa
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 12
Ευχαριστώ για την απάντηση το έκανα έτσι,όπως μου είπες,δηλαδή:

for i in range(2001,2101):
a=calendar(i)
hmerologio=open(str(i)+".txt","w")
hmerologio.write(a)
hmerologio.close()

αλλά μου βγάζει τώρα το εξής λάθος:

hmerologio=open(str(i)+".txt","w")
TypeError: an integer is required

Νομίζω ότι την εντολή open("xxxx.txt","w") αυτό που δίνεις ως πρώτη παράμετρο πρέπει να μπει σε εισαγωγικά,αλλά δεν μπορώ να σκεφτώ κάτι.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 11 Μήνες πριν #1034

  • TravelerInTime
  • Το Άβαταρ του/της TravelerInTime
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 2
Φτιάξε μια μεταβλητή name πριν ανοίξεις το αρχείο που θα παράγεις εκεί το όνομα του αρχείου (όπως είχες πριν με τη b), διότι για κάποιο λόγο θα πρέπει να δώσεις στην open ένα "έτοιμο" string σαν όρισμα και δεν τα πάει και τόσο καλά με την παραγωγή του ονόματος του αρχείου εκείνη την ώρα.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 11 Μήνες πριν #1035

  • Danny Pedrosa
  • Το Άβαταρ του/της Danny Pedrosa
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 12
Το έκανα και αυτό και πάλι μου βγάζει το ίδιο error:TypeError: an integer is required

Έκανα αυτό:

for i in range(2001,2101):
a=calendar(i)
b=str(i)+".txt"
hmerologio=open(b,"w")
hmerologio.write(a)
hmerologio.close()
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 10 Μήνες πριν #1036

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Καλησπέρα Danny

Μια ερώτηση καταρχάς. Σε ποια γραμμή σου εμφανίζεται το λάθος?

Ο τρόπος που καλείς την open είναι σωστός. Διαβάζοντας τον κώδικα σου, η πρώτη σκέψη που μου ήρθε στο μυαλό ήταν ότι το λάθος βρισκόταν στην write, και συγκεκριμένα στο argument που πρέπει να λάβει το οποίο πρέπει να είναι τύπου string.

Αυτό με το int είναι περίεργο. Η calendar τι ακριβώς κάνει? Βασικά τι τιμή επιστρέφει?

Κάτι ακόμα, αν και δε νομίζω να παίζει ρόλο. Ποια έκδοση της python χρησιμοποιείς? 2 ή 3?
Τελευταία διόρθωση: 13 Χρόνια 10 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 10 Μήνες πριν #1037

  • Danny Pedrosa
  • Το Άβαταρ του/της Danny Pedrosa
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 12
Kατ'αρχάς σας ευχαριστώ πολύ για τις απαντήσεις σας.Το λάθος μου ήταν ότι στην αρχή του προγράμματος επειδή η άσκηση ζητούσε κι άλλα πράγματα είχα φορτώσει 4 βιβλιοθήκες με τη μορφή from libraryname import *,αυτό , όμως ,χωρίς να ξέρω το λόγο δημιούργησε πρόβλημα στην python για να τρέξει σωστά το πρόγραμμα.Έτσι χρησιμοποίησα την εντολή import libraryname και κάθε φορά τις καλούσα με dot notation.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 10 Μήνες πριν #1039

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Σε γενικές γραμμές για να αποφεύγεται το name pollution, καλό είναι να μη χρησιμοποιείται το
from module import *

Για να μην επεκταθώ, διάβασε και αυτό

Αυτό που κατά πάσα πιθανότητα συνέβαινε ήταν, κάποιο από τις βιβλιοθήκες που είχες φορτώσει να "ξαναόριζε" την open και για αυτό προέκυπτε και το λάθος.

Αν τη βιβλιοθήκη την είχες δημιουργήσει εσύ, τότε να προσέχεις να μην αλλάζεις ποτέ τις reserved words της python ή των άλλων βιβλιοθηκών που χρησιμοποιείς. Αν θες να αλλάξεις το όνομα στη βιβλιοθήκη γίνεται εύκολα με search and replace / replace all, αλλά αν η ίδια βιβλιοθήκη χρησιμοποιείται σε κάποιο άλλο πρόγραμμα, θα πρέπει να κάνεις και σε εκείνο τις αντίστοιχες αλλαγές.
Τελευταία διόρθωση: 13 Χρόνια 10 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: ΑΠΟΡΙΑ ΣΕ ΑΣΚΗΣΗ 13 Χρόνια 10 Μήνες πριν #1040

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 684
  • Ληφθείσες Ευχαριστίες 111
Danny Pedrosa έγραψε:
Έτσι χρησιμοποίησα την εντολή import libraryname και κάθε φορά τις καλούσα με dot notation.

Just for the record.

Υπολογιστικά είναι πιο γρήγορο να καλείς μια μέθοδο έτσι:
from module import method
method(arguments)
αντί για έτσι:
import module
module.method(args)

Η διαφορά μεταξύ των δύο είναι μικρή, αλλά αν η μέθοδος σου χρησιμοποιείται μέσα σε κάποιο πολύ μεγάλο loop, τότε θα κερδίσεις λίγο χρόνο εκτέλεσης.

Επίσης είναι πιο σύντομο για να το γράφεις...
Τελευταία διόρθωση: 13 Χρόνια 10 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Απ: TypeError σε άνοιγμα αρχείου 13 Χρόνια 10 Μήνες πριν #1048

  • myle
  • Το Άβαταρ του/της myle
  • Αποσυνδεμένος
  • Admin
  • Δημοσιεύσεις: 467
  • Ληφθείσες Ευχαριστίες 15
Παρενθετικά, κάθε "τελεία" που χρησιμοποιούμε (πχ module.a.b.function()) σημαίνει και ένα dictionary lookup.

Αντίστοιχα και σε οποιοδήποτε άλλο μέρος. Αν και σπάνια χρειάζεται, μπορούμε πχ να κάνουμε:
a = d.get
a()

αντί για
d.get()
«Αν υποθέσουμε ότι αυτό είναι δυνατό, (να μεταδώσουμε τη σοφία παντού) τότε ειλικρινά ο τρόπος ζωής των θεών θα περάσει στους ανθρώπους. Τα πάντα θα είναι γεμάτα...
Τελευταία διόρθωση: 13 Χρόνια 10 Μήνες πριν από pmav99.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.348 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου