Ответ Игнасио в основном совершенно правильный, и он отправил его еще до того, как я начал печатать.Тем не менее, позвольте мне объяснить его двухслойность чуть более подробно.
Чтение файла
Во-первых, критика вашего кода:
readfile = open('file_being_read.dat').read()
Это будет читатьвесь ваш файл в гигантскую строку.Когда вы пытаетесь перебрать эту строку, вы будете перебирать ее по буквам.Вместо этого измените эту строку на следующую:
readfile = open('file_being_read.dat')
Теперь, когда вы перебираете этот файловый объект, вы будете построчно читать файл.
Токенизация
Вы обнаружили, что перебирая файл, вы получаете текст построчно.Теперь вам нужно разбить каждую строку на эти три значения.
Если значения разделены пробелами (как отрывок из вашего файла данных), Python делает это очень легко с помощью метода str.split
.
>>> line
'249 LEU 89.81637573242188\n'
>>> line.split()
['249', 'LEU', '89.81637573242188']
Подойдет любое количество или тип (табуляция, пробел) между этими значениями.Фактически, даже завершающий символ новой строки удаляется.Итак, теперь у вас есть список из трех строк.
Интерпретация
Далее вам необходимо преобразовать строки в целые числа и числа с плавающей запятой.Здесь используются встроенные функции int
и float
.
>>> vals[0]
'249'
>>> int(vals[0])
249
>>> vals[2]
'89.81637573242188'
>>> float(vals[2])
89.816375732421875
. На данный момент вам просто нужно упаковать эти значения вкортеж и добавьте их в converted
.
datum = int(vals[0]), vals[1], float(vals[2])
>>> datum
(249, 'LEU', 89.816375732421875)
Почему кортеж вместо списка?Списки изменчивы: вы можете добавлять и удалять элементы.Это, вероятно, не то, что вам нужно.
(Вы, вероятно, обычно видите скобки вокруг литерала кортежа. Это один из немногих случаев, когда порядок операций делает их ненужными. Вы можете поставить скобки вокруг всего правогосторона задания, и она будет работать просто отлично.)
Собираем все вместе
def parsa_lista(file_to_read):
converted = []
for line in file_to_read:
vals = line.split()
datum = int(vals[0]), vals[1], float(vals[2])
converted.append(datum)
return converted