<p>必须记住,从文件中读取的所有值都是字符串而不是数字。如果你想做计算,你必须智能地转换这些值</p>
<p>你也可以简化你的逻辑一点;同时,通过限制try/except块中的内容来改进代码。try块中的大型语句体在尝试调试问题时会导致问题</p>
<p>所以,让我们从读者总是会给你一个列表开始。如果列表中有两个元素,那么就知道它是起始/结束余额行。否则,它是一个显示完整事务详细信息的行</p>
<pre><code>with open(filename) as csv_file:
reader = csv.reader(filename, delimiter=',') # , is the default, so you
# can eliminate this
for row in reader:
if len(row) == 2:
balance_type, value = row
if balance_type == 'starting':
self.start_amt += float(value)
if balance_type == 'ending':
self.end_amt += float(value)
else:
if len(row) == 4:
trans_date, comment, trans_type, amount = row
if trans_type == 'debit':
self.debit_list.append(float(amount))
if trans_type == 'credit':
self.credit_list.append(float(amount))
else:
# We have some garbage data
print('Invalid data {}'.format(row))
</code></pre>
<p>现在我们正在做一些显式检查,以避免在解析信息时出错</p>
<p>这看起来像是一些冗余代码,但每当您处理外部数据(如文件、用户输入、来自数据库或网络资源的信息)时,最好假设您将获得垃圾数据,并在检查/验证该数据时尽可能明确和彻底</p>