Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2011 00:23:47

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

прочитать из текстового файла

Помогите прочитать файл, строки которого содержат числа , пустые строки и комментарии. два числа в одной строке — это координаты. Нужно получить вектор (список) отрезков, отрезок определяется вектором (точкой) , т.е. двумя координатами.


Формат текстового такой:

# пример файла с данными

#любой отрезок состоит из двух векторов (точек)
# первый отрезок
#начало первого отрезка
1.1 0.1
#конец первого отрезка
1.2 0.1


#второй отрезок

1.2 0.1
1.3 0.2

# третий отрезок
1.2 0.2
1.4 0.4
Должна получиться такая структура:
b1=array([[[1.1,0.1],[1.2,0.1]],[[1.2,0.1],[1.3,0.2]],[[1.2,0.2],[1.4,0.4]]]);

print b1
[[[ 1.1 0.1]
[ 1.2 0.1]]

[[ 1.2 0.1]
[ 1.3 0.2]]

[[ 1.2 0.2]
[ 1.4 0.4]]]
P.S. для численных расчетов что выгоднее numpy или scipy массив (или список не знаю как правильнее)?



Офлайн

#2 Апрель 27, 2011 01:36:58

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

прочитать из текстового файла

import re
import decimal
s = '''# пример файла с данными

#любой отрезок состоит из двух векторов (точек)
# первый отрезок
#начало первого отрезка
1.1 0.1
#конец первого отрезка
1.2 0.1


#второй отрезок

1.2 0.1
1.3 0.2

# третий отрезок
1.2 0.2
1.4 0.4'''
nums = re.findall('\d\.\d', s)
nums = map(lambda x: decimal.Decimal(x), nums)
print map(lambda x1,y1,x2,y2:[[x1,y1],[x2,y2]],nums[::4],nums[1::4],nums[2::4],nums[3::4])



Отредактировано (Апрель 27, 2011 01:51:00)

Офлайн

#3 Апрель 27, 2011 10:42:13

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

прочитать из текстового файла

Спасибо! А не подскажите как перейти к числам?

$ cat 1.dat 
# myfile
1.11 1.
.32 1.13

1.33 1.11
1.51 1.61

1.51 1.62
2.12 2.72

$ cat 2.py
#!/usr/bin/python
import decimal
import re
file = open("1.dat", "r")
s=file.read()
#print s
nums=re.findall('\d*\.\d*',s);
#print nums
#nums = map(lambda x: x, nums)
nums = map(lambda x: decimal.Decimal(x), nums)
#print nums
b1=map(lambda x1,y1,x2,y2:[[x1,y1],[x2,y2]],nums[::4],nums[1::4],nums[2::4],nums[3::4])
print b1
b1[0][1]*b1[0][0]

$ ./2.py
[[[Decimal('1.11'), Decimal('1')], [Decimal('0.32'), Decimal('1.13')]], [[Decimal('1.33'), Decimal('1.11')], [Decimal('1.51'), Decimal('1.61')]], [[Decimal('1.51'), Decimal('1.62')], [Decimal('2.12'), Decimal('2.72')]]]
Traceback (most recent call last):
File "./2.py", line 14, in <module>
b1[0][1]*b1[0][0]
TypeError: can't multiply sequence by non-int of type 'list'



Офлайн

#4 Апрель 27, 2011 11:10:52

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

прочитать из текстового файла

сообразил :-)

b1=array(map(lambda x1,y1,x2,y2:[[x1,y1],[x2,y2]],nums[::4],nums[1::4],nums[2::4],nums[3::4]))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version