<p>您可以逐行读取文件,按空格拆分,并反向使用元素来创建字典:</p>
<pre><code>with open("your_file", "r") as f: # open the file for reading
# read it line by line, split and invert the fields to use as k:v for your dict
data = dict(reversed(line.split()) for line in f)
# {'trendmar': '+41G', 'ttpsenet': '1.4G', 'tyibahco': '3.6G',
# 'uberhelp': '+19M', 'umljgate': '+9.2G'}
</code></pre>
<p>注意<code>dict</code>本质上是一个散列映射,因此它不能有重复的键-如果重复键的值出现在文件中,它们将被最新的值覆盖。你知道吗</p>
<p><strong>更新:</strong>如果要保留所有值,必须将它们存储为列表,例如:</p>
<pre><code>import collections
data = collections.defaultdict(list) # initiate all fields as lists
with open("your_file", "r") as f: # open the file for reading
for line in f: # read the file line by line
value, key = line.split() # split the line to value and key
data[key].append(value) # append the value to the list for its key
</code></pre>
<p>现在你的<code>data</code>看起来像:</p>
<pre><code>{'trendmar': ['-34G', '+41G'], 'ttpsenet': ['1.4G'], 'tyibahco': ['3.6G'],
'uberhelp': ['-13M', '+19M'], 'umljgate': ['-8.9G', '+9.2G']}
</code></pre>
<p><strong>更新2:</strong>如果要对值求和,则首先需要将它们转换为浮点值,然后使用常规算术运算来获得最终值,因此首先编写一个函数,将SI速记符号转换为本机<code>float</code>:</p>
<pre><code>QUANTIFIER_MAP = {"p": 1e15, "t": 1e12, "g": 1e9, "m": 1e6, "k": 1e3}
def si_to_float(number):
try:
last_char = number[-1].lower()
if last_char in QUANTIFIER_MAP:
return float(number[:-1]) * QUANTIFIER_MAP[last_char]
return float(number)
except ValueError:
return 0.0
</code></pre>
<p>现在您可以在创建<code>data</code>时用<code>list</code>替换<code>float</code>,并对值求和,而不是追加:</p>
<pre><code>import collections
data = collections.defaultdict(float) # initiate all fields as integers
with open("your_file", "r") as f: # open the file for reading
# read it line by line, split and invert the fields to use as k:v for your dict
for line in f: # read the file line by line
value, key = line.split() # split the line to value and key
data[key] += si_to_float(value) # convert to float and add to the value for this key
</code></pre>
<p>这将导致<code>data</code>如下:</p>
<pre><code>{'trendmar': 7000000000.0, 'ttpsenet': 1400000000.0, 'tyibahco': 3600000000.0,
'uberhelp': 6000000.0, 'umljgate': 300000000.0}
</code></pre>
<p>如果要将这些值返回到SI缩写符号中,则必须编写<code>si_to_float()</code>的相反函数,然后使用它转换所有<code>data</code>值,即:</p>
<pre><code>QUANTIFIER_STACK = ((1e15, "p"), (1e12, "t"), (1e9, "g"), (1e6, "m"), (1e3, "k"))
def float_to_si(number):
for q in QUANTIFIER_STACK:
if number >= q[0]:
return "{:.1f}".format(number / q[0]).rstrip("0").rstrip(".") + q[1].upper()
return "{:.1f}".format(number).rstrip("0").rstrip(".")
# now lets traverse the previously created 'data' and convert its values:
for k, v in data.items():
data[k] = float_to_si(v)
</code></pre>
<p>这将最终导致<code>data</code>包含:</p>
<pre><code>{'trendmar': '7G', 'ttpsenet': '1.4G', 'tyibahco': '3.6G',
'uberhelp': '6M', 'umljgate': '300M'}
</code></pre>