在编程中,计算带有条件的求和,可以根据使用的编程语言和数据结构选择合适的方法。以下是几种常见的解决方法,分别适用于 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 查询是最佳方法。
根据数据的规模和场景选择合适的方式可以提高代码效率和可读性。