#python #string #parsing #type-conversion #integer
#python #строка #синтаксический анализ #преобразование типа #целое число
Вопрос:
Я пытаюсь проанализировать файл с этим форматом
2010-11-04 00:03:50.209589 M003 ON Sleeping begin
2010-11-04 00:03:57.399391 M003 OFF
2010-11-04 00:15:08.984841 T002 21.5
2010-11-04 00:30:19.185547 T003 21
2010-11-04 00:30:19.385336 T004 21
Мне нужно выбрать число в третьем столбце. После выбора строки я выбираю ее третье поле. Затем я разделяю его, выбираю тип (M или T) и число (остальная часть третьего поля). Вот проблема: когда я пытаюсь выбрать номер, я получаю следующую ошибку: Недопустимый литерал для int() с базой 10: «. Я пробовал много вещей (например, удаление EOF или любых конечных символов) до «num», но все же у меня есть эта проблема.
temp_sensors = 0 #total number of temperature sensors
f = open('data', 'r')#open the dataset
line = f.readline() #reading line
while line:
step = line.split()#dividing the line into different words
sensor_type = step[2][:1]
sensor_number = step[2][2:]
sensor_value = step[3]
#print(sensor_number)
#num = sensor_number[:2]
#print(type(num))
num = sensor_number.rstrip()
appoggio = int(num)
#print(type(num))
if sensor_type == "T":
if appoggio > temp_sensors:
temp_sensors = appoggio
line = f.readline()
print("NUMERO TEMP MAX: " str (temp_sensors))
Для запуска кода вам нужен текстовый файл data.txt с несколькими событиями датчика, с форматом, показанным ранее. Ошибка, которую я получаю, это:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-b89fbf305c4a> in <module>
28 # print(type(num))
29 num = sensor_number.rstrip()
---> 30 appoggio = int(num)
31 #print(type(appoggio))
32 #print(type(num))
ValueError: invalid literal for int() with base 10: ''
Комментарии:
1. Пожалуйста, сообщите нам, в какой строке входного файла возникает ошибка.
num
кажется пустой строкой — каково значениеsensor_number
?2. Да, вначале я думал так же, но я напечатал все (как вы можете видеть из комментария). Например, в первой строке переменные предполагают: sensor_number = 003 (но это строка) num = 003 appoggio создает ошибку. Я думал, это потому, что, когда я выбирал число в sensor_numbe, оно добавляет пробел в конце строки, пробел, который не позволяет преобразовать целое число в int, поэтому я использовал sensor_number.rstrip(). Но, похоже, это не работает
3. Пожалуйста, покажите, какое содержимое
line
иstep
находится в цикле, в котором происходит сбой. Предоставленные вами данные будут работать правильно, поэтому у вас должно быть больше данных, имеющих немного другой формат.4. вы получаете ту же ошибку с
int("")
— поэтому вы пытаетесь преобразовать пустую строку в число. Используйтеprint()
, чтобы увидеть, что у вас есть в переменнойnum
, а затем проверьте команды, которые генерируют это значение, и используйтеprint()
, чтобы увидеть, какое значение оно использует, и т.д. Вызываетсяprint debuging
. Вероятно, вы получаете данные, отличные от ожидаемых, и они выдают не то,num
что вы ожидаете.5. @KenY-N вы правы. В файле 150 000 строк, я не смог проверить их все самостоятельно. Я напечатал и в строке 1476694 формат неверен. Есть строка, в которой формат: 2011-05-10 18:42:45.169231 c ОТКЛЮЧЕН. . Спасибо!
Ответ №1:
Я согласен с предыдущими ораторами, кажется, что в одной строке используется другой формат. По этой причине пустая строка, похоже, выдает ошибку при преобразовании в целое число. Я предлагаю заранее протестировать формат.
import re
def readdata(fname):
ptrn = r'^d{4}-d{2}-d{2} d{2}:d{2}:d{2}.d{6} [MT]d{3} .*s $'
sensor_count = 0
with open(fname) as fp:
for i,line in enumerate(fp):
if not re.match(ptrn, line):
print(f'Illegal format in line {i}: {line!r}')
continue
dt,tm,sensor,value = line.rstrip().split(' ',3)
sensor_type,sensor_number = sensor[0],int(sensor[1:])
print(sensor_type, sensor_number)
if sensor_type == 'T':
sensor_count = max(sensor_count, sensor_number)
print(f'Number of temperature sensors: {sensor_count}')