Saya membuat sebuah program yang membaca sebuah file, dan jika baris pertama dari file yang tidak kosong, bunyinya empat baris. Perhitungan dilakukan pada baris tersebut dan kemudian baris berikutnya adalah membaca. Jika baris yang tidak kosong terus. Namun, saya mendapatkan error ini:
ValueError: tidak valid literal untuk int() dengan dasar 10: ''.
Itu adalah membaca baris pertama, tetapi dapat't dikonversi ke integer.
Apa yang dapat saya lakukan untuk memperbaiki masalah ini?
Kode:
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())
Hanya untuk catatan:
>>> int('55063.000000')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'
Punya saya di sini...
>>> float('55063.000000')
55063.0
Untuk digunakan!
Pythonic cara iterasi file dan konversi ke int:
for line in open(fname):
if line.strip(): # line contains eol character(s)
n = int(line) # assuming single integer on each line
Apa yang anda're coba lakukan adalah sedikit lebih rumit, tapi masih tidak lurus ke depan:
h = open(fname)
for line in h:
if line.strip():
[int(next(h).strip()) for _ in range(4)] # list of integers
Cara ini proses 5 baris pada satu waktu. Menggunakan jam.next()
bukan berikutnya(h)
sebelum Python 2.6.
Alasan anda harus ValueError
karena int
tidak dapat mengkonversi string kosong ke integer. Dalam hal ini anda'd butuhkan untuk memeriksa isi dari string sebelum konversi, atau kecuali kesalahan:
try:
int('')
except ValueError:
pass # or whatever
Berikut adalah benar-benar diterima di python:
int
mengapung
mengapung
int
mengapung
Tapi anda mendapatkan ValueError
jika anda lulus representasi string dari float ke int
, atau representasi string dari apa-apa tapi integer (termasuk string kosong). Jika anda ingin lulus representasi string dari pelampung untuk sebuah int
, seperti @katyhuff poin di atas, anda dapat mengkonversi ke float pertama, kemudian ke integer:
>>> 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
Anda've punya masalah dengan baris ini:
while file_to_read != " ":
Ini tidak menemukan string kosong. Ia menemukan sebuah string yang terdiri dari satu ruang. Mungkin ini bukan apa yang anda cari.
Mendengarkan orang lain's saran. Ini sangat tidak idiomatik kode python, dan akan lebih jelas jika anda iterate atas file secara langsung, tetapi saya pikir masalah ini dicatat juga.
readings = (infile.readline())
print readings
while readings != 0:
global count
readings = int(readings)
Ada's masalah dengan kode tersebut. bacaan
ini baris baru membaca dari file - it's a string. Oleh karena itu anda tidak harus membandingkannya dengan 0. Selanjutnya, anda bisa't hanya dikonversi ke integer kecuali anda're yakin it's memang salah satu. Misalnya, baris kosong akan menghasilkan kesalahan di sini (seperti yang anda've pasti tahu).
Dan mengapa anda perlu global count? Yang's paling pasti desain yang buruk di Python.
Ini juga bisa terjadi ketika anda memiliki untuk memetakan ruang dipisahkan bilangan bulat untuk daftar tapi anda memasukkan integer baris demi baris menggunakan .input()
.
Seperti misalnya saya memecahkan masalah ini pada HackerRank Bon Appetit, dan mendapat error berikut ketika kompilasi
Jadi, bukannya memberikan masukan untuk program baris demi baris mencoba untuk memetakan ruang dipisahkan bilangan bulat ke dalam daftar menggunakan peta()
metode.
saya menciptakan sebuah program yang membaca file, dan jika baris pertama dari file tidak kosong, bunyinya empat garis-garis. Perhitungan dilakukan pada baris tersebut dan kemudian baris berikutnya adalah baca.
Hal seperti ini harus bekerja:
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
Saya punya masalah yang sama ketika mencoba untuk menggunakan readlines() dalam loop yang sama dengan file obyek... kecurigaan Saya adalah menembak readling() dalam readline() untuk file yang sama objek yang disebabkan kesalahan ini.
Solusi terbaik yang dapat digunakan seek(0) untuk me-reset file pointer atau Menangani kondisi dengan pengaturan beberapa bendera kemudian membuat objek baru untuk file yang sama dengan memeriksa set kondisi....