在遍历数据列表时,我该如何继续遍历RuntimeError?例如,假设我有如下函数f:
t_ints = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def f(x):
for i in x:
if i==3:
continue
elif i ==6:
raise RuntimeError('NOP')
print(f'Processing integer {i}')
print("Done")
return
f(t_ints)
该函数将打印除3之外的每个数字,传递3并继续到4。但是,当它达到6时,它将生成标题为NOP的RunTimeError I。因此,输出结果为:
Processing integer 1
Processing integer 2
Processing integer 4
Processing integer 5
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
c:\Users\jalmendarez.MSQT\Visual Studio Code\Test Notebooks\Test Sheet 1.py in
251 return
252
---> 253 f(t_ints)
c:\Users\jalmendarez.MSQT\Visual Studio Code\Test Notebooks\Test Sheet 1.py in f(x)
245
246 elif i ==6:
----> 247 raise RuntimeError('NOP')
248 print(f'Processing integer {i}')
249
RuntimeError: NOP
我想要传递像上面这样的整数列表,并将t_ints循环中的函数应用于每个列表。
z=[
[11, 22, 33, 3, 55, 66, 87, 8, 9, 10],
[31, 3, 53, 54, 3, 66, 7, 8, 9, 10],
[2,4,6,8,10,11,35]
]
所以我编写了下面的代码来循环遍历每个列表,它忽略并传递3,然后继续列表。然而,当它遇到6时,由于错误而停止并不继续。我尝试使用try/except。我希望我的循环忽略RuntimeError('NOP')并继续。
INPUT:
for i in z:
try:
f(i)
except RuntimeError:
pass
OUTPUT:
Processing integer 11
Processing integer 22
Processing integer 33
Processing integer 55
Processing integer 66
Processing integer 87
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 31
Processing integer 53
Processing integer 54
Processing integer 66
Processing integer 7
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 2
Processing integer 4
我想要的实际输出是:
Processing integer 11
Processing integer 22
Processing integer 33
Processing integer 55
Processing integer 66
Processing integer 87
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 31
Processing integer 53
Processing integer 54
Processing integer 66
Processing integer 7
Processing integer 8
Processing integer 9
Processing integer 10
Done
Processing integer 2
Processing integer 4
Processing integer 8
Processing integer 10
Processing integer 11
Processing integer 35
关于如何使用类似于"continue“的东西来跳过一个抛出的错误,有什么想法吗?
--编辑--阅读这个!!
好的,这是真正的问题,因为它与我上面创建的函数没有任何关系。很抱歉读了很长时间,但这是必要的。
我创建了函数f作为示例,以查看是否可以通过RunTimeError。这是为了解决我的一个更大的问题。我有大约一百万行和23列的df。有一个ID栏。但实际上,只有大约18,000个唯一的ids。因此,我创建了一个for循环,它遍历每个唯一的ID。在这个循环中,我为每个ID创建了一个具有行/列的过滤数据帧。使用过滤后的数据,我根据列中的可用值和我创建的一些函数来运行曲线拟合,以计算指数下降曲线。这是一个简单的方程式。http://www.petrocenter.com/reservoir/DCA_theory.htm
一旦运行了曲线拟合,我就将曲线拟合求解的参数插入到指数下降曲线函数中。我将该函数的新值作为新列添加到for循环中唯一ID的dataframe中。然后,我将每个唯一的I数据帧与新的曲线拟合函数数据列一起存储在一个字典中。因此,我可以访问具有原始值的每个IDs数据帧,并使用指数下降曲线拟合基于曲线的估计值。
基本上我的曲线拟合了18,000次。通过这个过程,一些曲线拟合产生了无法解决曲线拟合的RunTimeError。不是所有的问题都能解决,我觉得没问题。我没有时间检查18,000个唯一的it数据,以确保它足够干净,可以进行曲线拟合。因此,我希望能够跳过出现RunTimeError的那些ID实例,并转到for循环中的下一个惟一ID。
发布于 2021-07-29 07:36:47
实现问题是您的错误处理程序必须位于您希望处理错误的级别。您的代码无法处理处理循环中的错误。当引发错误时,函数将退出循环,退出函数,并引发错误供调用程序处理。现在继续循环已经太晚了。
如果要在函数内继续循环,则必须处理函数内的异常。很简单,您根本不应该引发异常。正如您已经描述了所需的功能,case 3
和case 6
之间没有区别。
def f(x):
for i in x:
if i == 3 or i == 6:
continue
print(f'Processing integer {i}')
print("Done")
return
对OP编辑的响应
我认为您已经确定了post的核心问题:在您发布的代码中,循环本身引发异常;在实际示例中,循环调用一个函数,然后该函数引发异常。看起来你需要的代码很简单,就像这样:
for row in df:
try:
params = fit_function(row)
exception RuntimeError:
print(row, " failed to fit.)
continue # if there is more row processing for a successful fit.
发布于 2021-07-29 07:40:56
问题是您正在捕获,并且只处理外部循环中的异常。您的函数f没有对您引发的异常进行任何处理。我认为你需要抛出一个异常,否则在3
和6
之间没有区别。第二个建议是改变你的函数f,使其更原子化,而不是运行在整个列表上,你可以有一个函数来测试每个元素,并在某些情况下引发异常。
在f
函数中使用try-catch,而不是通过z
在循环中设置try-except块。你的代码应该是这样的:
def f(x):
for i in x:
try:
if i==3:
continue
elif i ==6:
raise RuntimeError('NOP')
print(f'Processing integer {i}')
except RuntimeError:
continue
print("Done")
return
z=[
[11, 22, 33, 3, 55, 66, 87, 8, 9, 10],
[31, 3, 53, 54, 3, 66, 7, 8, 9, 10],
[2,4,6,8,10,11,35]
]
for i in z:
try:
f(i)
except RuntimeError:
pass
-编辑后提供的详细信息代码更新-
import pandas as pd
import logging
#Setup logging to a file
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
#Your fit function
def fit(filtered_df):
#Your exponential decline fit goes here
return fit_results
#Reading your dataset
df = pd.read_csv("all_your_data.csv")
#list of dataframes results
fit_results = []
#list of failed_ids
failed_ids = []
for unique_id in df.YOUR_ID_COLUMN.unique():
try:
fit_results.append(fit(df[df.YOUR_ID_COLUMN==unique_id]))
except RuntimeError:
failed_ids.append(unique_id)
logging.error("{} curve fit failed".format(unique_id))
https://stackoverflow.com/questions/68568404
复制相似问题