Разделение строки по типу данных внутри каждой строки файла в Python - PullRequest
1 голос
/ 27 ноября 2010

Можно с уверенностью сказать, что я новичок в программировании и Python, поэтому мне очень нужна помощь в обработке файла.

Мой файл представляет собой файл данных с целым числом, строкой и числом с плавающей точкой в ​​каждой строке, и мне нужно сравнить первое целое число с другими целочисленными значениями и число с плавающей запятой с некоторым другим значением, мне нужно иметь значения в виде чисел не как часть строки для выполнения некоторых математических операций.

Это код, который я сделал, но я просмотрел все в Google и не могу найти функцию, которая делает это:

readfile = open('file_being_read.dat').read()

def parsa_lista(file_to_read):
    converted = []
    for line in file_to_read:
       #conversion should happen here and write it to the list named "converted" 
       #my google-fu has failed me..
    return converted

print parsa_lista(readfile)

Файл выглядит следующим образом, но занимает около 600 строк. Кроме того, я собираюсь об этом в процессе обучения по ходу обучения, и я действительно был не в состоянии найти помощь, возможно, это связано с отсутствием базовых знаний о типах данных или чем-то подобным.

Это вывод списка, напечатанного с помощью «% r»:

...
249 LEU 89.81637573242188\n
250 ALA 6.454087734222412\n
251 ILE 42.696006774902344\n
252 VAL 39.9482421875\n
253 LEU 58.06844711303711\n
254 SER 6.285697937011719\n
255 HIS 22.92508316040039\n
256 THR 49.1857795715332\n
257 ASN 15.033650398254395\n
258 SER 12.086835861206055\n
259 VAL 28.70435905456543\n
260 VAL 39.53983688354492\n
261 ASN 18.63718605041504\n
262 PRO 15.275177955627441\n
263 PHE 120.84526062011719\n
264 ILE 26.20943260192871\n
265 TYR 16.6826114654541\n
266 ALA 34.382598876953125\n
267 TYR 179.9381103515625\n
268 ARG 77.62599182128906\n
269 ILE 45.021034240722656\n
270 ARG 133.72328186035156\n
...

Надеюсь, что вы, ребята, сможете мне помочь, даже некоторые общие рекомендации о том, как мне следует поступать в этом случае при разбивке строк и сравнении значений, будут высоко оценены.

Ответы [ 2 ]

4 голосов
/ 27 ноября 2010

Ответ Игнасио в основном совершенно правильный, и он отправил его еще до того, как я начал печатать.Тем не менее, позвольте мне объяснить его двухслойность чуть более подробно.

Чтение файла

Во-первых, критика вашего кода:

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
2 голосов
/ 27 ноября 2010
vals = line.split()
converted.append((int(vals[0]), vals[1], float(vals[2])))
...