在编程中,计算带有条件的求和,可以根据使用的编程语言和数据结构选择合适的方法。以下是几种常见的解决方法,分别适用于 Python 和其他常用场景:
1、问题背景
有一段 Python 代码,其目的是从一个Excel文件中读取数据,然后执行一些操作。但是,在执行过程中遇到了一个问题:无法在代码中抛出异常。这意味着,当代码遇到错误时,不会打印出错误信息,导致调试困难。
2、解决方案
Step 1:确保异常被捕获
在 Python 中,异常是通过 try
、except
和 raise
关键字来处理的。try
块包含要执行的代码,except
块包含要捕获的异常类型,raise
用于抛出异常。
在这段代码中,try
块包含了所有代码,但是没有 except
块来捕获异常。因此,当代码遇到错误时,没有相应的异常处理逻辑,导致无法打印出错误信息。
Step 2:在适当的地方添加 except
块
为了能够捕获异常并打印出错误信息,需要在代码中添加 except
块。except
块应该放在 try
块的后面,用于捕获 try
块中抛出的异常。
在修改后的代码中,在 try
块后面添加了 except
块,并使用了通配符 Exception
来捕获所有类型的异常。当代码遇到错误时,会进入 except
块,并打印出异常信息。这样,就可以看到错误信息,并方便调试。
Step 3:使用 raise
来抛出异常
在某些情况下,可能需要在代码中抛出异常,以便在其他地方处理异常。可以使用 raise
关键字来抛出异常。raise
后面可以跟异常类型和异常信息。
例如,在上面的代码中,如果源路径不存在,则会抛出 FileNotFoundError
异常,并打印出异常信息。这样,在其他地方就可以捕获到这个异常,并进行相应的处理。
代码示例
from xlutils.copy import copy
from xlrd import open_workbook
import xlwt
import os
import shutil
import glob
def openexcel_main():
book = open_workbook('input.xls', formatting_info=True)
sheet = book.sheet_by_index(0)
wb = copy(book)
w_sheet = wb.get_sheet(0)
folder_name = ['do_not_delete', 'internal_builds']
for j in range(0, 2):
folder = folder_name.pop()
for i in range(1, (sheet.nrows)):
cell_test_group = sheet.cell(i, 0)
data = str(cell_test_group.value)
print('#####################################')
print(data)
list = []
source_path = '/mnt/' + folder + '/pybuild/' + data + '/MAIN/'
if os.path.exists(source_path):
try:
os.chdir(source_path)
all_subdirs = [d for d in os.listdir('.') if os.path.isdir(d)]
for dirs in all_subdirs:
dir = os.path.join('/mnt/' + folder + '/pybuild/' + data + '/MAIN/', dirs)
os.chdir(dir)
current = os.getcwd()
new = str(current).split("/")[6]
list.append(new)
list.sort()
val = list
for i in range(1, 4):
if val == []:
break
else:
print(i)
current_build_number = val.pop()
print('Current_Build:' + current_build_number)
source_path_copy = r"" + source_path + "/" + current_build_number + "/"
print('Copying From:' + source_path_copy)
dest_path = r"/home/builds_repo/" + folder + "/pybuild/" + data + "/MAIN/" + current_build_number + "/"
os.chdir(source_path_copy)
file_name = (glob.glob('*[_bin].*')).pop()
print('File_Copied:' + file_name)
if not os.path.exists(dest_path):
os.makedirs(dest_path)
shutil.copyfile(source_path_copy + file_name, dest_path + file_name)
except Exception as e: # Use Exception if not sure which exception will raise
print('File Not Found ..', e)
else:
raise FileNotFoundError('Source path does not exist')
def main():
openexcel_main()
if __name__ == '__main__':
main()
总结
- 小规模数据:列表推导式和
filter
是首选。 - 分组和条件:
defaultdict
或pandas
是优选。 - 大规模数据:
numpy
或pandas
提供高效解决方案。 - 数据库存储数据:SQL 查询是最佳方法。
根据数据的规模和场景选择合适的方式可以提高代码效率和可读性。