Δημιουργώ ένα πρόγραμμα που διαβάζει ένα αρχείο και αν η πρώτη γραμμή του αρχείου δεν είναι κενή, διαβάζει τις επόμενες τέσσερις γραμμές. Οι υπολογισμοί εκτελούνται σε αυτές τις γραμμές και στη συνέχεια διαβάζεται η επόμενη γραμμή. Εάν αυτή η γραμμή δεν είναι κενή, συνεχίζει. Ωστόσο, λαμβάνω αυτό το σφάλμα:
για int() με βάση το 10: ''.`
Διαβάζει την πρώτη γραμμή, αλλά δεν μπορεί να τη μετατρέψει σε ακέραιο αριθμό.
Τι μπορώ να κάνω για να διορθώσω αυτό το πρόβλημα;
Ο κώδικας:
file_to_read = raw_input("Enter file name of tests (empty string to end program):")
try:
infile = open(file_to_read, 'r')
while file_to_read != " ":
file_to_write = raw_input("Enter output file name (.csv will be appended to it):")
file_to_write = file_to_write + ".csv"
outfile = open(file_to_write, "w")
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
minimum = (infile.readline())
maximum = (infile.readline())
Πυθονικός τρόπος επανάληψης ενός αρχείου και μετατροπής σε int:
for line in open(fname):
if line.strip(): # line contains eol character(s)
n = int(line) # assuming single integer on each line
Αυτό που προσπαθείτε να κάνετε είναι ελαφρώς πιο περίπλοκο, αλλά και πάλι δεν είναι απλό:
h = open(fname)
for line in h:
if line.strip():
[int(next(h).strip()) for _ in range(4)] # list of integers
Με αυτόν τον τρόπο επεξεργάζεται 5 γραμμές κάθε φορά. Χρησιμοποιήστε h.next()
αντί για next(h)
πριν από την Python 2.6.
Ο λόγος που είχατε ValueError
είναι επειδή το int
δεν μπορεί να μετατρέψει ένα κενό αλφαριθμητικό σε ακέραιο αριθμό. Σε αυτή την περίπτωση θα πρέπει είτε να ελέγξετε το περιεχόμενο του αλφαριθμητικού πριν από τη μετατροπή, είτε να εξαιρέσετε ένα σφάλμα:
try:
int('')
except ValueError:
pass # or whatever
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
Υπάρχει ένα πρόβλημα με αυτόν τον κώδικα. Το readings
είναι μια νέα γραμμή που διαβάζεται από το αρχείο - είναι μια συμβολοσειρά. Επομένως, δεν πρέπει να το συγκρίνετε με το 0. Επιπλέον, δεν μπορείτε απλά να το μετατρέψετε σε ακέραιο εκτός αν είστε σίγουροι ότι είναι πράγματι ακέραιος. Για παράδειγμα, οι κενές γραμμές θα παράγουν σφάλματα εδώ (όπως σίγουρα έχετε διαπιστώσει).
Και γιατί χρειάζεστε την παγκόσμια καταμέτρηση; Αυτό είναι σίγουρα κακός σχεδιασμός στην Python.
Δημιουργώ ένα πρόγραμμα που διαβάζει ένα αρχείο και αν η πρώτη γραμμή του αρχείου δεν είναι κενή, διαβάζει τις επόμενες τέσσερις γραμμές. Οι υπολογισμοί εκτελούνται σε αυτές τις γραμμές και στη συνέχεια η επόμενη γραμμή διαβάζεται.
Κάτι τέτοιο θα πρέπει να λειτουργεί:
for line in infile:
next_lines = []
if line.strip():
for i in xrange(4):
try:
next_lines.append(infile.next())
except StopIteration:
break
# Do your calculation with "4 lines" here