キロからピコ、ナノからギガなど、さまざまな SI プレフィックス間の数値の変換をサポートする Python ライブラリを探しています。どのようなものをお勧めしますか?
6 に答える
辞書
以下に示すようなサードパーティのライブラリを使用したくない場合は、実際に独自の解析関数を実装できます。
辞書を使用して、プレフィックスをそれらの値に一致させます。私はすでにあなたのためにそれをしました:
_prefix = {'y': 1e-24, # yocto
'z': 1e-21, # zepto
'a': 1e-18, # atto
'f': 1e-15, # femto
'p': 1e-12, # pico
'n': 1e-9, # nano
'u': 1e-6, # micro
'm': 1e-3, # mili
'c': 1e-2, # centi
'd': 1e-1, # deci
'k': 1e3, # kilo
'M': 1e6, # mega
'G': 1e9, # giga
'T': 1e12, # tera
'P': 1e15, # peta
'E': 1e18, # exa
'Z': 1e21, # zetta
'Y': 1e24, # yotta
}
次に、正規表現を使用して(ここでの私の回答で説明されているように)、入力を検索または解析し、辞書を使用して適切な値を取得できます。
Unum
Unumは完成度が高く、完全に文書化されたライブラリです。
長所:
- 任意の単位を定義できます(基本単位の組み合わせである限り、マグニチュードはユーザー定義の単位のみをサポートします)。
短所:
- プレフィックスをうまく処理しません
- 名前空間がすべてのユニット定義で乱雑になります(名前空間に
M
、S
などの名前の変数が含まれることになります)
マグニチュード
別のライブラリであるMagnitudeを使用することもできます。それはあなたが話しているすべての種類のSI単位接頭辞をサポートし、さらに解析も処理します。サイトから:
物理量は、10 km/hのような単位での数値です。単位は文字列として指定されます。それらは、SI単位のいずれかに加えて、非SIの束、ビット、ドル、およびそれらの任意の組み合わせにすることができます。標準のSIプレフィックスを含めることができます。
...
yoctoからyottaまで、およびkibiからexbiまで、すべての標準プレフィックスが理解されます。
これが最良の答えかどうかはわかりませんが、私の場合は機能しています。私のソリューションを自由に確認してください。私はPythonで初めて働いています.建設的な批判は大歓迎です...肯定的なフィードバックとともに:D
これは私のコードです:
class Units:
def __init__(self):
global si;
si = {
-18 : {'multiplier' : 10 ** 18, 'prefix' : 'a'},
-17 : {'multiplier' : 10 ** 18, 'prefix' : 'a'},
-16 : {'multiplier' : 10 ** 18, 'prefix' : 'a'},
-15 : {'multiplier' : 10 ** 15, 'prefix' : 'f'},
-14 : {'multiplier' : 10 ** 15, 'prefix' : 'f'},
-13 : {'multiplier' : 10 ** 15, 'prefix' : 'f'},
-12 : {'multiplier' : 10 ** 12, 'prefix' : 'p'},
-11 : {'multiplier' : 10 ** 12, 'prefix' : 'p'},
-10 : {'multiplier' : 10 ** 12, 'prefix' : 'p'},
-9 : {'multiplier' : 10 ** 9, 'prefix' : 'n'},
-8 : {'multiplier' : 10 ** 9, 'prefix' : 'n'},
-7 : {'multiplier' : 10 ** 9, 'prefix' : 'n'},
-6 : {'multiplier' : 10 ** 6, 'prefix' : 'u'},
-5 : {'multiplier' : 10 ** 6, 'prefix' : 'u'},
-4 : {'multiplier' : 10 ** 6, 'prefix' : 'u'},
-3 : {'multiplier' : 10 ** 3, 'prefix' : 'm'},
-2 : {'multiplier' : 10 ** 2, 'prefix' : 'c'},
-1 : {'multiplier' : 10 ** 1, 'prefix' : 'd'},
0 : {'multiplier' : 1, 'prefix' : ''},
1 : {'multiplier' : 10 ** 1, 'prefix' : 'da'},
2 : {'multiplier' : 10 ** 3, 'prefix' : 'k'},
3 : {'multiplier' : 10 ** 3, 'prefix' : 'k'},
4 : {'multiplier' : 10 ** 3, 'prefix' : 'k'},
5 : {'multiplier' : 10 ** 3, 'prefix' : 'k'},
6 : {'multiplier' : 10 ** 6, 'prefix' : 'M'},
7 : {'multiplier' : 10 ** 6, 'prefix' : 'M'},
8 : {'multiplier' : 10 ** 6, 'prefix' : 'M'},
9 : {'multiplier' : 10 ** 9, 'prefix' : 'G'},
10 : {'multiplier' : 10 ** 9, 'prefix' : 'G'},
11 : {'multiplier' : 10 ** 9, 'prefix' : 'G'},
12 : {'multiplier' : 10 ** 12, 'prefix' : 'T'},
13 : {'multiplier' : 10 ** 12, 'prefix' : 'T'},
14 : {'multiplier' : 10 ** 12, 'prefix' : 'T'},
15 : {'multiplier' : 10 ** 15, 'prefix' : 'P'},
16 : {'multiplier' : 10 ** 15, 'prefix' : 'P'},
17 : {'multiplier' : 10 ** 15, 'prefix' : 'P'},
18 : {'multiplier' : 10 ** 18, 'prefix' : 'E'},
}
def convert(self, number):
# Checking if its negative or positive
if number < 0:
negative = True;
else:
negative = False;
# if its negative converting to positive (math.log()....)
if negative:
number = number - (number*2);
# Taking the exponent
exponent = int(math.log10(number));
# Checking if it was negative converting it back to negative
if negative:
number = number - (number*2);
# If the exponent is smaler than 0 dividing the exponent with -1
if exponent < 0:
exponent = exponent-1;
return [number * si[exponent]['multiplier'], si[exponent]['prefix']];
# If the exponent bigger than 0 just return it
elif exponent > 0:
return [number / si[exponent]['multiplier'], si[exponent]['prefix']];
# If the exponent is 0 than return only the value
elif exponent == 0:
return [number, ''];
そして、これがどのように機能するかです:
c1 = +1.189404E-010
fres = -4.07237500000000E+007;
ls = +1.943596E-005;
units = sci.Units();
rValue, rPrefix = units.convert(c1);
print rValue;
print rPrefix;
print units.convert(fres);
print units.convert(ls);
そして、応答は次のとおりです。
118.9404
p
[-40.72375, 'M']
[19.435959999999998, 'u']
誰かがこれが役立つかどうかはわかりません。お願いします。私はここに投稿したので、それを見て助けを求めている人々は、おそらくそれを最適化できるかもしれません:)
これが古いスレッドであることは知っていますが、あらゆる種類のプレフィックス単位変換処理を処理する、私が作成した Python ライブラリへの参照を捨てたいと思います。
主な機能のリストは次のとおりです。
- SIとNISTのプレフィックス単位間の変換(
kB
~GiB
) - 同じタイプの単位間の変換 (SI から SI、または NIST から NIST)
- 人間が判読できる自動プレフィックス選択 (hurry.filesize https://pypi.python.org/pypi/hurry.filesizeなど)
- 基本的な算術演算 (50GiB から 42KiB を引く)
- 豊富な比較操作 (
1024 Bytes == 1KiB
) - ビット演算 (
<<
,>>
,&
,|
,^
) - デバイスのストレージ容量の読み取り (Linux/OS X サポートのみ)
- argparse https://docs.python.org/2/library/argparse.html カスタム型としての統合
- プログレスバー https://code.google.com/p/python-progressbar/ より良いファイル転送速度ウィジェットとして統合
- 文字列の解析
- 並べ替え