2013-05-25 1 views
1
rows = [] 
FILE = open("testing.txt", "r") 
for blob in FILE: rows.append([int(i) for i in blob.split(" ")]) 

Здесь testing.txt содержитнедействительных буквальные для Int() с основанием 10 с файлом, который содержит только целых чисел

01 23 04 05 67 
08 09 10 
11 
12 

Но когда я запускаю код, я получаю следующее сообщение об ошибке:

ValueError        Traceback (most recent call last) 
<ipython-input-1-2086c8bf9ab4> in <module>() 
     1 rows = [] 
     2 FILE = open("testing.txt", "r") 
----> 3 for blob in FILE: rows.append([int(i) for i in blob.split(" ")]) 

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

Так что мой вопрос: что случилось с int()? Я думал, что это нормально, если аргумент является целым числом (например, int(5) == 5). Спасибо.

+0

Вы не должны использовать список (е) или f.readlines(), чтобы добраться до строк в файле? – Powertieke

+0

Peter Varo: Да, это работает, когда я избавляюсь от '\ n' и удостоверяюсь, что между каждым последовательным числом есть только одно пустое место. Но почему автор в этой ссылке смог добиться успеха, когда triangle.txt содержит 100 строк? –

+0

triange.txt и

ответ

1

Очевидно, что ваш test.txt имеет код новой строки в конце. Добавить if в список понимания:

for blob in FILE: 
    rows.append([int(i) for i in blob.split(" ") if i.isdigit()]) 
+0

Это было мое первое предположение, но я удалил это .. damned :) –

+0

Как работает 'if i'? –

+0

@YifengXu при необходимости для проверки значения из итератора (список из split). Подробнее здесь - http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions – ndpu

2

Проблема, как уже отмечалось, является новой строки.

Предлагаю использовать split() вместо split(" "). Это будет рассматривать все пробелы как разделители, включая новые строки. Таким образом, вы избежите звонка int() по телефону \n.

+0

+1 лучшее решение. –

+0

A. E. Drew: Я думаю, что намерение состоит в том, чтобы добавить новую запись в «строки», как только она дойдет до следующей строки. Например, если файл содержит: 1 \ n 2 3, я ожидаю 'rows == [[1], [2,3]]' –

+0

@YifengXu, я думаю, вы получите поведение, которое вы хотите с помощью ' сплит() '. Каждая строка по-прежнему добавляется отдельно в цикл for. Вы просто не запускаете 'int()' on ''\ n'' в своем понимании списка. Единственное отличие состоит в том, что пустая строка добавит пустой список в строки, а не вызывает ошибку. –

0

Вы можете поместить все в машиночитаемом однострочника:

with open('testing.txt') as fobj: 
    rows = [[int(item) for item in row.split()] for row in fobj if row.strip()] 

with будет гарантировать, что файл будет закрыт после того, как вы выходите из контекста, то есть после того, как вы dedent. BTW, split() без аргументов - особенно , предназначенный для разделения строк, найденных в файле, потому что он разбивается на все пробельные символы: ' \t\r\n\v\f'. Чтобы избежать пустого списка для пустой строки, проверьте, что значение row.strip() истинно.

0

Я предполагаю, что я хотел бы написать код так:

with open('testing.txt','r') as f: 
    data=[[int(n) for n in line.strip().split()] for line in f]