2009-12-03 54 views
124

Tôi đang tạo chương trình đọc tệp và nếu dòng đầu tiên của tệp không trống, nó đọc bốn dòng tiếp theo. Các 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 thì nó vẫn tiếp tục. Tuy nhiên, tôi nhận được lỗi này:ValueError: chữ không hợp lệ cho int() với base 10: ''

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

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

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

Bộ luật:

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()) 
+0

Bạn nên xem xét việc sử dụng 'với mở (file_to_read, 'r') là infile:' there. – Omnifarious

Trả lời

41

cách Pythonic của iterating trên một tập tin 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 là hơi phức tạp hơn, nhưng vẫn không thẳng forward:

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 vào lúc đó. Sử dụng h.next() thay vì next(h) trước Python 2.6.

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

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

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

+0

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

+2

bởi vì một trong những là hợp lý mong đợi và ignorable nhưng khác là dấu hiệu của một lỗi –

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

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

Và tại sao bạn cần tính toàn cầu? Đó chắc chắn là thiết kế tồi tệ nhất trong Python.

0

I am creating a program that reads a file and if the first line of the file is not blank, it reads the next four lines. Calculations are performed on those lines and then the next line is read.

Something như thế này nên làm việc:

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 
3

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

while file_to_read != " ": 

này không tìm thấy một chuỗi rỗ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.

Nghe lời khuyên của mọi người khác. Đâ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ĩ rằng vấn đề này đáng chú ý là tốt.

155

Chỉ cần cho các hồ sơ:

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

Got tôi ở đây ...

>>> float('55063.000000') 
55063.0 

Có được sử dụng!

+44

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

+3

Đâ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 nhìn thấy nó. Cảm ơn! – iTurki

+1

thêm để trả lời int (float ('55063.000000')) như câu hỏi là có được int(). Hơn nó sẽ thực sự trả lời hàng đầu – Max

1

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

+3

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ó không? – fmendez

4

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 cách (xử lý ngoại lệ).

6

Lý do là bạn đang nhận được một chuỗi rỗng hoặc chuỗi làm đối số vào int kiểm tra trước khi nó trống hoặc chứa ký tự alpha hoặc không nếu nó chứa hơn bỏ qua phần đó đơn giản.

+0

Điều này có vẻ 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. –

+0

Ok Danh tiếng ... !!! –

0

Đ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 cách bằng dấu cách vào danh sách nhưng bạn nhập dòng số nguyên theo hàng bằng cách sử dụng .input(). Giống như ví dụ tôi đã giải quyết vấn đề này trên HackerRank Bon-Appetit, và đã nhận lỗi sau khi biên dịch enter image description here

Vì vậy, thay vì đưa ra đầu vào cho các dòng chương trình bằng dòng cố gắng để lập bản đồ không gian số nguyên tách thành một danh sách bằng cách sử dụng map().

6

Sau đây là hoàn toàn chấp nhận được trong python:

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

Nhưng bạn nhận được một ValueError nếu bạn vượt qua một chuỗi đại diện của một phao vào int - như @katyhuff chỉ ra ở trên, bạn có thể chuyển đổi sang một phao đầu tiên, sau đó đến 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 
Các vấn đề liên quan