dateutil.parser.parse() 解析距离字符串?
有没有人知道一个Python的库,能像dateutil处理日期那样处理距离字符串?如果有一个这样的工具就太好了,能像下面这样工作:
>>> from awesome_dist_module import Distance
>>> d = Distance("100 ft")
>>> d.meters
30.48
>>> d = Distance("100 feet")
>>> d.meters
30.48
>>> d.miles
0.0189393939
这里最重要的不是转换本身,而是能够输入一个表示某种测量的字符串,然后得到一个浮点数,表示你选择的另一种测量,而不需要知道字符串里具体是什么测量。
有没有这样的东西呢?
3 个回答
1
以下这些模块有没有符合你的需求呢?
units
>>> from units import unit
>>> metre = unit('m')
>>> second = unit('s')
>>> print(metre(10) / second(2))
5 m / s
>>> print(metre(10) ** 3)
1000 m * m * m
magnitude
>>> from magnitude import mg
>>> print mg(10, 'm/s') ** 2
100.0000 m2 / s2
>>> print (mg(10, 'm') * 2 / (10, 'm/s2')).sqrt()
1.4142 s
>>> tsq = mg(10, 'm') * 2 / (10, 'm/s2')
>>> print tsq ** 0.5
1.4142 s
>>> print mg(1, "lightyear") / mg(1, "c")
>>> 31557600.0000 s
>>> y = mg(1, "lightyear") / (1, "c")
>>> print y.ounit("year")
1.0000 year
>>> print y.ounit('day')
>>> print yd
365.2500 day
>>> power = mg(100, 'kg') * (2, 'gravity') * (5, 'km/h')
>>> print power
2724.0694 m2 kg / s3
>>> print power.ounit('mW')
2724069.4444 mW
>>> print power.ounit('kW')
2.7241 kW
Unum(文档在源代码里)
quantities(文档)
2
如果你知道自己需要哪些单位(而不需要查找成百上千种不同的单位),那么你可以很简单地自己实现这个功能。下面是一个例子:
class Distance():
METER = 1
FOOT = 0.3048
UNITS = { "feet" : FOOT,
"ft" : FOOT,
"foot" : FOOT,
"meters" : METER,
"mts" : METER,
"meter" : METER,
"mt" : METER }
def __init__(self, string):
number, unit = string.split()
number = long(number)
self.value = number * Distance.UNITS[unit]
if __name__ == "__main__":
d = Distance("1500 ft")
print d.value
这段代码会帮你处理字符串的读取。之后你就可以使用任何单位转换的库了。
3
我为你写了这个,不过你可以根据自己的需要进行扩展:
class Distance(object):
METER = 1
FOOT = 0.3048
MILE = 1609.344
INCH = 0.0254
UNITS = {'meters': METER,
'mts': METER,
'mt': METER,
'feet': FOOT,
'foot': FOOT,
'ft': FOOT,
'miles': MILE,
'mls': MILE,
'ml': MILE,
'inch': INCH,
}
def __init__(self, s):
self.number, unit = s.split()
self._convert(unit)
def _convert(self, unit):
self.number = float(self.number)
if self.UNITS[unit] != 1:
self.number *= self.UNITS[unit]
@ property
def meters(self):
return self.number
@ meters.setter
def meters(self, v):
self.number = float(v)
@ property
def miles(self):
return self.number / self.MILE
@ miles.setter
def miles(self, v):
self.number = v
self._convert('miles')
@ property
def feet(self):
return self.number / self.FOOT
@ feet.setter
def feet(self, v):
self.number = v
self._convert('feet')
@ property
def inch(self):
return self.number / self.INCH
@ inch.setter
def inch(self, v):
self.number = v
self._convert('inch')
这里有一些例子:
>>> d = Distance('1302.09029321 mts')
>>> d.meters
1302.09029321
>>> d.feet
4271.949780872703
>>> d.inch
51263.39737047244
>>> d.miles
0.8090813978925575
>>> d.miles = 1
>>> d.meters
1609.344
>>> d.feet
5280.0
>>> d.inch = .0002
>>> d.inch
0.00019999999999999998
>>> d.feet
1.6666666666666664e-05
>>> d.meters
5.08e-06
>>> d.miles
3.156565656565656e-09
>>> d.feet = 1
>>> d.meters
0.3048
>>> d.miles
0.0001893939393939394
编辑:添加了设置器