Python:循环访问数据时继续超过"RuntimeError"



当循环遍历数据列表时,我将如何继续越过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:Usersjalmendarez.MSQTVisual Studio CodeTest NotebooksTest Sheet 1.py in 
251     return
252 
---> 253 f(t_ints)
c:Usersjalmendarez.MSQTVisual Studio CodeTest NotebooksTest 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_int这样的整数列表,并对每个列表应用for循环中的函数。

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。这是为了解决一个更大的问题。df大约有一百万行23列。有一列是id。实际上只有18000个唯一的id。因此,我创建了一个for循环,遍历每个唯一的ID。在这个循环中,我创建了一个过滤的数据框,每个ID都有行/列。有了过滤后的数据,我根据列中可用的值和我创建的一些函数来计算指数下降曲线,运行曲线拟合。这是一个简单的方程。http://www.petrocenter.com/reservoir/DCA_theory.htm

一旦曲线拟合运行,我将曲线拟合解决的参数代入我的指数下降曲线函数。我将该函数的新值作为for循环中唯一ID的新列添加到数据框中。然后,我将每个具有新的曲线拟合函数数据列的唯一id数据框存储在字典中。因此,我可以访问具有原始值的每个id数据帧,并使用指数下降曲线基于曲线拟合的估价值。

基本上我拟合了18000次曲线。在这个过程中,一些曲线拟合会产生一个RunTimeError,表示无法求解曲线拟合。我不介意不是所有的问题都解决了。我没有时间检查18,000个唯一id数据,以确保它足够干净,符合曲线拟合。所以我希望能够跳过那些ID实例,其中RunTimeError显示,并移动到下一个唯一的ID在for循环。

实现问题是您的错误处理程序必须在您希望处理错误的级别上。您的代码无法在处理循环中处理错误。当抛出错误时,函数退出循环,退出函数,并抛出错误供调用程序处理。已经来不及继续循环了。

如果要在函数内继续循环,则必须处理函数内的异常。很简单,您根本不应该引发异常。正如您所描述的所需功能,情况3和情况6之间没有区别。

def f(x):
for i in x:
if i == 3 or i == 6:
continue

print(f'Processing integer {i}')

print("Done")
return

对OP's EDIT的响应

我认为你已经确定了你的帖子的中心问题:在你发布的代码中,循环本身引发了异常;在实际示例中,循环调用一个函数,该函数引发异常。您需要的代码似乎很简单,就像这样:

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.

问题是您只在外部循环中捕获和处理异常。你的函数f对你引发的异常没有任何处理。我在考虑你需要提出一个异常,否则36没有区别。第二个建议是修改函数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)) 

最新更新