ValueError: chữ không hợp lệ cho int () với cơ sở 10: ''


333

Tôi đang tạo một chương trình đọc một tệp và nếu dòng đầu tiên của tệp không trống, nó sẽ đọc bốn dòng tiếp theo. Tính toán được thực hiện trên các dòng đó và sau đó dòng tiếp theo được đọc. Nếu dòng đó không trống, nó tiếp tục. Tuy nhiên, tôi nhận được lỗi này:

ValueError: invalid literal for int() with base 10: ''.

Nó đang đọc dòng đầu tiên nhưng không thể chuyển đổi nó thành một số nguyên.

Tôi có thể làm gì để khắc phục vấn đề này?

Mật mã:

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
Bạn nên xem xét sử dụng with open(file_to_read, 'r') as infile:ở đó.
Omnifarious

Câu trả lời:


312

Chỉ để cho bản ghi âm thôi:

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

Đưa tôi đến đây ...

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

Đã được sử dụng!


101
Tôi sẽ chỉ thêm, để cung cấp rõ ràng hơn cho các độc giả trong tương lai, thực sự, int (float ('1.0')) hoạt động khi int ('1.0') ném ValueError.
katyhuff

5
Đây phải là câu trả lời hàng đầu được chấp nhận cho câu hỏi này. Tôi gần như đóng trang và không thấy nó. Cảm ơn!
iTurki

2
thêm vào để trả lời int (float ('55063.000000')) vì câu hỏi là get int (). Hơn nó sẽ thực sự trả lời hàng đầu
Tối đa

Lý do tại sao điều này xảy ra? @katyhuff
Muhamed Huseinbašić

7
Câu trả lời này dường như không liên quan gì đến câu hỏi. Câu hỏi đặt ra là làm thế nào người ta có thể ngăn chặn ValueError khi bạn gọi int()trên một chuỗi trống. "Sử dụng float () thay vì" không giải quyết được vấn đề đó. Bạn vẫn nhận được ValueError.
Kevin

74

Những điều sau đây hoàn toàn được chấp nhận ở python:

  • chuyển một đại diện chuỗi của một số nguyên vào int
  • chuyển một đại diện chuỗi của một float vào float
  • chuyển một đại diện chuỗi của một số nguyên vào float
  • chuyền phao vào int
  • chuyển một số nguyên vào float

Nhưng bạn có được một ValueErrornếu bạn vượt qua một chuỗi đại diện của một phao vào int, hoặc một chuỗi đại diện của bất cứ điều gì nhưng một số nguyên (bao gồm cả chuỗi rỗng). Nếu bạn muốn chuyển một đại diện chuỗi của một float cho một int, như @katyhuff chỉ ra ở trên, bạn có thể chuyển đổi thành một float trước, sau đó thành một số nguyên:

>>> 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
Câu trả lời này dường như không liên quan gì đến câu hỏi. Câu hỏi đặt ra là làm thế nào người ta có thể ngăn chặn ValueError khi bạn gọi int()trên một chuỗi trống. "Sử dụng float () thay vì" không giải quyết được vấn đề đó. Bạn vẫn nhận được ValueError.
Kevin

3
@Kevin Mặc dù điều này không trả lời trực tiếp câu hỏi của OP. Tuy nhiên, nó giúp những người gặp vấn đề này và không bận tâm int(float(x)). Vì đây là câu hỏi đầu tiên bật lên khi tìm kiếm lỗi này.
Kerwin Sneijder

57

Cách lặp lại của Pythonic trên một tệp và chuyển đổi sang int:

for line in open(fname):
   if line.strip():           # line contains eol character(s)
       n = int(line)          # assuming single integer on each line

Những gì bạn đang cố gắng làm hơi phức tạp hơn một chút, nhưng vẫn không đơn giản:

h = open(fname)
for line in h:
    if line.strip():
        [int(next(h).strip()) for _ in range(4)]     # list of integers

Bằng cách này, nó xử lý 5 dòng tại thời điểm đó. Sử dụng h.next()thay vì next(h)trước Python 2.6.

Lý do bạn có ValueErrorlà vì intkhông thể chuyển đổi một chuỗi rỗng thành số nguyên. Trong trường hợp này, bạn cần kiểm tra nội dung của chuỗi trước khi chuyển đổi hoặc ngoại trừ lỗi:

try:
   int('')
except ValueError:
   pass      # or whatever

4
Thử / ngoại trừ của bạn không phân biệt giữa thứ gì đó hợp lý có thể mong đợi (dòng trống / trống) và thứ gì đó khó chịu như số nguyên.
John Machin

và tại sao bạn muốn phân biệt những thứ đó?
SilentGhost

3
bởi vì một là hợp lý có thể mong đợi và không thể biết được nhưng cái kia là dấu hiệu của một lỗi
John Machin

3
và tại sao một dòng trống có thể mong đợi một cách hợp lý và không phải là số nguyên?
SilentGhost

1
điều này là tốt nếu bạn chắc chắn rằng danh sách của bạn thực sự là một danh sách các số nguyên được xâu chuỗi. Nếu bạn không chắc chắn mình có thể làm đượcn = int(line) if line.is_integer() else int(float(line))
Mike Furlender

23

Tôi tìm thấy một công việc xung quanh. Python sẽ chuyển đổi số thành float. Đơn giản chỉ cần gọi float trước sau đó chuyển đổi nó thành int sẽ hoạt động: output = int(float(input))


11

Lý do là bạn đang nhận được một chuỗi rỗng hoặc một chuỗi làm đối số thành int. Kiểm tra xem nó trống hay nó chứa các ký tự alpha. Nếu nó chứa các ký tự, sau đó chỉ cần bỏ qua phần đó.


2
Điều này trông giống như một bình luận. Khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào.
Joshua Drake

8

Lý do bạn gặp phải lỗi này là do bạn đang cố gắng chuyển đổi một ký tự khoảng trắng thành một số nguyên, điều này hoàn toàn không thể và bị hạn chế. Và đó là lý do tại sao bạn gặp phải lỗi này.nhập mô tả hình ảnh ở đây

Kiểm tra mã của bạn và sửa nó, nó sẽ hoạt động tốt


8

Vì vậy, nếu bạn có

floatInString = '5.0'

Bạn có thể chuyển đổi nó intvớifloatInInt = int(float(floatInString))


3

Bạn đã có một vấn đề với dòng này:

while file_to_read != " ":

Điều này không tìm thấy một chuỗi trống. Nó tìm thấy một chuỗi bao gồm một không gian. Có lẽ đây không phải là những gì bạn đang tìm kiếm.

Lắng nghe lời khuyên của mọi người. Đây không phải là mã python rất thành ngữ và sẽ rõ ràng hơn nhiều nếu bạn lặp lại trực tiếp tệp, nhưng tôi nghĩ vấn đề này cũng đáng lưu ý.


3

Vui lòng kiểm tra chức năng này ( split()) trên một tệp đơn giản. Tôi đã phải đối mặt với cùng một vấn đề và thấy rằng đó là vì split()không được viết đúng (xử lý ngoại lệ).


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

Có một vấn đề với mã đó. readingslà một dòng mới được đọc từ tệp - đó là một chuỗi. Do đó, bạn không nên so sánh nó với 0. Hơn nữa, bạn không thể chuyển đổi nó thành một số nguyên trừ khi bạn chắc chắn đó là số nguyên . Ví dụ: các dòng trống sẽ tạo ra lỗi ở đây (như bạn chắc chắn đã tìm ra).

Và tại sao bạn cần số lượng toàn cầu? Đó chắc chắn là thiết kế tồi trong Python.


1

Điều này cũng có thể xảy ra khi bạn phải ánh xạ các số nguyên được phân tách không gian vào một danh sách nhưng bạn nhập dòng số nguyên theo từng dòng bằng cách sử dụng .input(). Ví dụ như tôi đã giải quyết vấn đề này trên HackerRank Bon-Appetit và đã gặp lỗi sau khi biên dịch nhập mô tả hình ảnh ở đây

Vì vậy, thay vì đưa đầu vào cho dòng chương trình theo từng dòng, hãy thử ánh xạ các số nguyên được phân tách không gian vào một danh sách bằng map()phương thức.


0

Tôi đang tạo một chương trình đọc một tệp và nếu dòng đầu tiên của tệp không trống, nó sẽ đọc bốn dòng tiếp theo. Tính toán được thực hiện trên các dòng đó và sau đó dòng tiếp theo được đọc.

Một cái gì đó như thế này sẽ hoạt động:

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

Tôi đã nhận được các lỗi tương tự, hóa ra bộ dữ liệu có các giá trị trống mà python không thể chuyển đổi thành số nguyên.


4
Bạn có thể giải thích thêm một chút với một số ví dụ về cách OP có thể giải quyết nó?
fmendez

giá trị trống có nghĩa là trống có thể được chuyển đổi thành chuỗi float. Nếu bạn cố gắng chuyển đổi sang float, nó sẽ hiển thị lỗi
saravanan saminathan 13/12/19

0

Tôi gặp vấn đề tương tự khi cố gắng sử dụng readlines () bên trong vòng lặp cho cùng một đối tượng tệp ... Sự nghi ngờ của tôi là bắn readling () bên trong readline () cho cùng một đối tượng tệp gây ra lỗi này.

Giải pháp tốt nhất có thể là sử dụng tìm kiếm (0) để đặt lại con trỏ tệp hoặc Điều kiện xử lý với việc đặt một số cờ sau đó tạo đối tượng mới cho cùng một tệp bằng cách kiểm tra điều kiện đặt ....


0

Gần đây tôi đã gặp một trường hợp mà không có câu trả lời nào trong số này làm việc. Tôi đã gặp dữ liệu CSV khi có các byte rỗng được trộn lẫn với dữ liệu và các byte rỗng đó không bị tước. Vì vậy, chuỗi số của tôi, sau khi tước, bao gồm các byte như thế này:

\x00\x31\x00\x0d\x00

Để chống lại điều này, tôi đã làm:

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

... Trong đó các trường là danh sách các giá trị csv do chia dòng.


0

Điều này có vẻ như các bài đọc đôi khi là một chuỗi rỗng và rõ ràng là một lỗi mọc lên. Bạn có thể thêm một kiểm tra bổ sung vào vòng lặp while của bạn trước lệnh int (readings) như:

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

0

Tôi đã có thời gian khó khăn để tìm ra lý do thực tế, nó xảy ra khi chúng ta không đọc đúng từ tập tin. bạn cần mở tệp và đọc bằng phương thức readlines () như dưới đây:

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

Nó sửa đầu ra được định dạng


0

câu trả lời của bạn là ném lỗi vì dòng này

readings = int(readings)
  1. Ở đây bạn đang cố gắng chuyển đổi một chuỗi thành kiểu int không phải là cơ sở 10. bạn chỉ có thể chuyển đổi một chuỗi thành int nếu nó là cơ sở 10 nếu không nó sẽ ném ValueError, nêu rõ chữ không hợp lệ cho int () với cơ sở 10.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.