Am creat un program care citește un fișier și dacă prima linie a fișierului nu este gol, se spune în următorii patru linii. Calculele sunt realizate pe aceste linii și apoi pe următoarea linie se citesc. În cazul în care linia nu este gol continuă. Cu toate acestea, primesc aceasta eroare:
ValueError: invalid literal pentru int() cu baza 10: ''.
Este citit prima linie, dar poate't converti la un număr întreg.
Ce pot face pentru a remedia această problemă?
Cod:
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())
Doar pentru înregistrare:
>>> int('55063.000000')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'
M-a adus aici...
>>> float('55063.000000')
55063.0
Trebuie să fie folosit!
Pythonic mod de iterarea peste un fișier și de conversie la int:
for line in open(fname):
if line.strip(): # line contains eol character(s)
n = int(line) # assuming single integer on each line
Ce-ai're încercarea de a face este puțin mai complicat, dar încă nu drept-înainte:
h = open(fname)
for line in h:
if line.strip():
[int(next(h).strip()) for _ in range(4)] # list of integers
Acest fel procesele de 5 linii la timp. Folosesc sec.next()în loc de
a doua(sec)` înainte de Python 2.6.
Motivul pentru care ai avut ValueError
este pentru int
nu se poate converti un șir gol la număr întreg. În acest caz,'d trebuie să fie verificați conținutul șirului înainte de conversie, sau doar o eroare:
try:
int('')
except ValueError:
pass # or whatever
Următoarele sunt total acceptabil în python:
int
int
Dar ai ValueError daca treci un șir de reprezentare de un float în int
, sau o reprezentare șir de nimic, dar un număr întreg (inclusiv șir gol). Dacă nu doriți să treacă un șir de reprezentare a unui float la un int
, ca @katyhuff puncte de mai sus, puteți converti la un float în primul rând, apoi la un număr întreg:
>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5
Te'am o problemă cu această linie:
while file_to_read != " ":
Acest lucru nu găsi un șir gol. Se constată un șir format dintr-un singur spațiu. Probabil acest lucru nu este ceea ce cauți pentru.
Ascultați toată lumea's sfaturi. Acest lucru nu este foarte idiomatice cod python, și ar fi mult mai clară dacă ai repeta peste fișierul direct, dar cred că această problemă este de remarcat faptul ca.
Vă rugăm să testați această funcție (split()
) pe un simplu fișier. Am fost confruntă cu aceeași problemă și a constatat că a fost pentru că split()
nu a fost scrisă corect (excepție de manipulare).
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
Nu's o problema cu acel cod. lecturi
este o noua linie de citit din fișier - l's un șir de caractere. Prin urmare, nu ar trebui să compare cu 0. În continuare, puteți't doar converti la un număr întreg dacă nu're sigur it's într-adevăr unul. De exemplu, liniile goale va produce erori aici (ca tine'cu siguranta ve aflat).
Și de ce ai nevoie global conta? Ca's cel mai sigur design rău în Python.
Acest lucru ar putea întâmpla, de asemenea, atunci când trebuie să hartă spațiu separat numere întregi să o lista, dar introduceți numere întregi linie cu linie, folosind .de intrare()
.
Ca de exemplu am fost rezolve această problemă pe HackerRank pofta Buna, și am următoarea eroare în timpul compilării
Deci, în loc de a da de intrare la program linie cu linie, să încerce să harta spațiu separat numere întregi într-o listă utilizând harta lui () metodă.
eu voi crea un program care citește un dosar și, dacă prima linie a fișierului nu este gol, se spune în următorii patru linii. Calculele sunt efectuate pe aceste linii și apoi pe următoarea linie este citeste.
Ceva de genul asta ar trebui sa mearga:
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
Am ajuns în aceeași problemă atunci când încearcă să utilizeze readlines() în interiorul pentru bucla pentru același fișier obiect... suspiciunea Mea este ardere readling() în interiorul readline() pentru același fișier obiect cauzate de această eroare.
Mai bună soluție poate fi utilizarea caută(0) pentru a reseta pointer de fișier sau Se ocupe de starea cu stabilirea unor pavilion apoi a crea un obiect nou pentru același fișier de verificare a seta starea....