ValueError: ตัวอักษรที่ไม่ถูกต้องสำหรับ int () ที่มีฐาน 10: ''


333

ฉันกำลังสร้างโปรแกรมที่อ่านไฟล์และหากบรรทัดแรกของไฟล์ไม่ว่างเปล่ามันจะอ่านสี่บรรทัดถัดไป ทำการคำนวณบนบรรทัดเหล่านั้นจากนั้นอ่านบรรทัดถัดไป หากบรรทัดนั้นไม่ว่างเปล่ามันจะดำเนินต่อไป อย่างไรก็ตามฉันได้รับข้อผิดพลาดนี้:

ValueError: invalid literal for int() with base 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())

3
คุณควรพิจารณาใช้ที่with open(file_to_read, 'r') as infile:นั่น
Omnifarious

คำตอบ:


311

เพียงเพื่อบันทึก:

>>> int('55063.000000')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'

รับฉันที่นี่ ...

>>> int(float('55063.000000'))
55063.0

จะต้องมีการใช้!


101
ฉันจะเพิ่มเพื่อให้ความชัดเจนมากขึ้นสำหรับผู้อ่านในอนาคตที่จริง int (ลอย ('1.0')) ทำงานเมื่อ int ('1.0') พ่น ValueError
katyhuff

5
นี่ควรเป็นคำตอบยอดนิยมสำหรับคำถามนี้ ฉันเกือบปิดหน้าและไม่เห็น ขอบคุณ!
iTurki

2
เพิ่มเพื่อตอบ int (float ('55063.000000')) ตามที่คำถามจะได้ int () กว่าจะเป็นคำตอบจริง ๆ สูงสุด
สูงสุด

ทำไมสิ่งนี้ถึงเกิดขึ้น @katyhuff
Muhamed Huseinbašić

7
คำตอบนี้ดูเหมือนจะไม่เกี่ยวข้องกับคำถาม คำถามกำลังถามว่าจะป้องกัน ValueError ได้อย่างไรเมื่อคุณโทรint()หาสตริงว่าง "ใช้ float () แทน" ไม่ได้แก้ปัญหานั้น คุณยังคงได้รับ ValueError
Kevin

74

ต่อไปนี้เป็นที่ยอมรับทั้งหมดในหลาม:

  • ผ่านการเป็นตัวแทนสตริงของจำนวนเต็มเข้า int
  • ผ่านการเป็นตัวแทนสตริงของลอยเข้า float
  • ผ่านการเป็นตัวแทนสตริงของจำนวนเต็มเข้า float
  • ลอยผ่านเข้าไป int
  • ผ่านจำนวนเต็มเข้า float

แต่คุณจะได้รับ a ValueErrorหากคุณผ่านการแทนค่าสตริงของfloatเข้าintหรือการแทนค่าสตริงของสิ่งใด ๆ ยกเว้นจำนวนเต็ม (รวมถึงสตริงว่าง) หากคุณต้องการส่งการแสดงสตริงของ float ไปที่intเนื่องจาก @katyhuff ชี้ไปที่ด้านบนคุณสามารถแปลงเป็น float ก่อนจากนั้นจึงเป็นจำนวนเต็ม:

>>> 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

7
คำตอบนี้ดูเหมือนจะไม่เกี่ยวข้องกับคำถาม คำถามกำลังถามว่าจะป้องกัน ValueError ได้อย่างไรเมื่อคุณโทรint()หาสตริงว่าง "ใช้ float () แทน" ไม่ได้แก้ปัญหานั้น คุณยังคงได้รับ ValueError
Kevin

3
@Kevin แม้ว่าสิ่งนี้จะไม่ตอบคำถามของ OP โดยตรง int(float(x))แต่มันจะช่วยให้ผู้คนที่มีปัญหานี้และไม่ทราบ เช่นนี้เป็นคำถามแรกที่ปรากฏขึ้นเมื่อค้นหาข้อผิดพลาดนี้
Kerwin Sneijders

57

Pythonic ของการวนซ้ำไฟล์และแปลงเป็น 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

4
ลอง / ยกเว้นของคุณไม่แยกความแตกต่างระหว่างสิ่งที่คาดหวังที่เหมาะสม (บรรทัดว่าง / เปล่า) และสิ่งที่น่ารังเกียจเช่นไม่ใช่จำนวนเต็ม
John Machin

และทำไมคุณต้องการแยกแยะสิ่งเหล่านั้น
SilentGhost

3
เพราะเป็นเหตุผล expectable และเพิกเฉย แต่อื่น ๆ ที่แสดงให้เห็นถึงข้อผิดพลาด
จอห์นเมชิน

3
และทำไมบรรทัดว่างเปล่าที่คาดหวังอย่างสมเหตุสมผลและไม่ใช่จำนวนเต็มไม่ใช่?
SilentGhost

1
นี่เป็นสิ่งที่ดีถ้าคุณแน่ใจว่ารายการของคุณเป็นรายการของจำนวนเต็มแบบสตริง หากคุณไม่แน่ใจคุณสามารถทำได้n = int(line) if line.is_integer() else int(float(line))
Mike Furlender

23

ฉันพบวิธีแก้ไข Python จะแปลงตัวเลขเป็นทศนิยม เพียงแค่เรียก float ก่อนจากนั้นจึงแปลงเป็น int จะทำงาน: output = int(float(input))


11

เหตุผลก็คือคุณได้รับสตริงว่างหรือสตริงเป็นอาร์กิวเมนต์เข้าสู่ int ตรวจสอบว่ามันว่างเปล่าหรือมีตัวอักษร ถ้ามันมีตัวอักษรอยู่แล้วก็ไม่สนใจส่วนนั้น


2
ดูเหมือนความคิดเห็น เมื่อคุณมีชื่อเสียงเพียงพอคุณจะสามารถแสดงความคิดเห็นในโพสต์ใด ๆ
Joshua Drake

8

เหตุผลที่คุณได้รับข้อผิดพลาดนี้คือคุณพยายามแปลงอักขระช่องว่างเป็นจำนวนเต็มซึ่งเป็นไปไม่ได้และถูก จำกัด โดยสิ้นเชิงและนั่นเป็นสาเหตุที่คุณได้รับข้อผิดพลาดนี้ป้อนคำอธิบายรูปภาพที่นี่

ตรวจสอบรหัสของคุณและแก้ไขมันจะทำงานได้ดี



3

คุณประสบปัญหากับบรรทัดนี้:

while file_to_read != " ":

ไม่พบสตริงว่าง พบสตริงที่ประกอบด้วยหนึ่งช่องว่าง สมมุติว่านี่ไม่ใช่สิ่งที่คุณกำลังมองหา

ฟังคำแนะนำของคนอื่น นี่ไม่ใช่รหัสงูหลามที่ใช้สำนวนมากและจะชัดเจนกว่าถ้าคุณวนซ้ำไฟล์โดยตรง แต่ฉันคิดว่าปัญหานี้ก็คุ้มค่าเช่นกัน


3

กรุณาทดสอบฟังก์ชั่นนี้ ( split()) กับไฟล์ง่าย ๆ ฉันพบปัญหาเดียวกันและพบว่าเป็นเพราะsplit()เขียนไม่ถูกต้อง (จัดการกับข้อยกเว้น)


1
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

มีปัญหากับรหัสนั้น readingsเป็นบรรทัดใหม่ที่อ่านจากไฟล์ - มันเป็นสตริง ดังนั้นคุณไม่ควรเปรียบเทียบกับ 0 นอกจากนี้คุณไม่สามารถแปลงเป็นจำนวนเต็มได้จนกว่าคุณจะแน่ใจว่ามันเป็นจริง ตัวอย่างเช่นบรรทัดว่างจะสร้างข้อผิดพลาดได้ที่นี่

และทำไมคุณต้องนับทั่วโลก นั่นเป็นการออกแบบที่แย่ที่สุดใน Python


1

นอกจากนี้ยังอาจเกิดขึ้นเมื่อคุณมีการทำแผนที่พื้นที่แยกจำนวนเต็มในรายการ .input()แต่คุณใส่เส้นจำนวนเต็มโดยสายใช้ ตัวอย่างเช่นฉันกำลังแก้ไขปัญหานี้กับ HackerRank Bon-Appetitและเกิดข้อผิดพลาดดังต่อไปนี้ขณะรวบรวม ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นแทนที่จะให้อินพุตกับโปรแกรมทีละบรรทัดพยายามแมปจำนวนเต็มของช่องว่างที่แยกออกเป็นรายการโดยใช้map()วิธีการ


0

ฉันกำลังสร้างโปรแกรมที่อ่านไฟล์และหากบรรทัดแรกของไฟล์ไม่ว่างเปล่ามันจะอ่านสี่บรรทัดถัดไป ทำการคำนวณบนบรรทัดเหล่านั้นจากนั้นอ่านบรรทัดถัดไป

สิ่งนี้ควรใช้งานได้:

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

0

ฉันได้รับข้อผิดพลาดที่คล้ายกันปรากฎว่าชุดข้อมูลมีค่าว่างซึ่ง python ไม่สามารถแปลงเป็นจำนวนเต็มได้


4
คุณช่วยอธิบายเพิ่มเติมเล็กน้อยด้วยตัวอย่างเกี่ยวกับวิธีที่ OP สามารถแก้ไขได้หรือไม่?
fmendez

ค่าว่างหมายถึงที่ว่างเปล่าซึ่งสามารถแปลงเป็นสตริงทลอย ถ้าคุณพยายามแปลงให้ลอยก็จะแสดงข้อผิดพลาด
saravanan saminathan

0

ฉันเจอปัญหาเดียวกันเมื่อพยายามใช้ readlines () ข้างในสำหรับลูปสำหรับวัตถุไฟล์เดียวกัน ... ความสงสัยของฉันคือการอ่าน readling () ข้าง readline () สำหรับวัตถุไฟล์เดียวกันทำให้เกิดข้อผิดพลาดนี้

ทางออกที่ดีที่สุดสามารถใช้ find (0) เพื่อรีเซ็ตตัวชี้ไฟล์หรือจัดการสภาพด้วยการตั้งค่าสถานะบางส่วนจากนั้นสร้างวัตถุใหม่สำหรับไฟล์เดียวกันโดยตรวจสอบเงื่อนไขการตั้งค่า ...


0

ฉันเพิ่งเจอกรณีที่ไม่มีคำตอบเหล่านี้ทำงาน ฉันพบข้อมูล CSV ที่มีข้อมูล null ผสมกับข้อมูลและไบต์ว่างเหล่านั้นไม่ได้รับการตัดทอน ดังนั้นสตริงตัวเลขของฉันหลังจากการปอกประกอบด้วยไบต์เช่นนี้

\x00\x31\x00\x0d\x00

เพื่อตอบโต้สิ่งนี้ฉันทำ:

countStr = fields[3].replace('\x00', '').strip()
count = int(countStr)

... โดยที่ field คือรายการค่า csv ที่เกิดจากการแยกบรรทัด


0

ดูเหมือนว่าบางครั้งการอ่านจะเป็นสตริงว่างและเห็นได้ชัดว่ามีข้อผิดพลาดเกิดขึ้น คุณสามารถเพิ่มการตรวจสอบพิเศษของคุณ while loop ก่อนคำสั่งint (readings)เช่น:

while readings != 0 | readings != '':
    global count
    readings = int(readings)

0

ฉันมีเวลายากที่จะหาเหตุผลที่แท้จริงมันเกิดขึ้นเมื่อเราไม่ได้อ่านไฟล์อย่างถูกต้อง คุณต้องเปิดไฟล์และอ่านด้วย readlines () วิธีการดังต่อไปนี้:

with open('/content/drive/pre-processed-users1.1.tsv') as f:
    file=f.readlines()

แก้ไขรูปแบบเอาต์พุต


0

คำตอบของคุณกำลังโยนข้อผิดพลาดเนื่องจากบรรทัดนี้

readings = int(readings)
  1. ที่นี่คุณพยายามแปลงสตริงเป็นชนิด int ซึ่งไม่ใช่ฐาน -10 คุณสามารถแปลงสตริงเป็น int เฉพาะถ้ามันเป็นฐาน 10 มิฉะนั้นจะโยน ValueError โดยระบุตัวอักษรที่ไม่ถูกต้องสำหรับ int () ด้วยฐาน 10
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.