pandas: игнорировать исключение в lambda

#python #pandas #exception #lambda

#python #pandas #исключение #лямбда

Вопрос:

У меня есть этот фрейм данных, который состоит из URL-адресов PDF

                                               Source
0  http://www.ampire.com.tw/en/download.asp?fileN...
1  http://www.ampire.com.tw/en/download.asp?fileN...
2  http://www.buckeyeshapeform.com/media/1240/iso...
3  http://www.ionix-systems.com/files/EN91002009I...
4  http://php2.twinner.com.tw/files/chiplus/ISO90...
  

Я создал функцию, которая преобразует эти URL-адреса в изображения, а затем распознает их и возвращает определенную строку, и я хочу, чтобы эта строка заполняла новый столбец
, вот что я делаю:

 import cv2
import requests
import pdf2image
import pytesseract
import dateutil.parser as dparser
import pandas as pd
import numpy as np
def address(x):
    pdf = requests.get(x,stream=True)
    images = pdf2image.convert_from_bytes(pdf.raw.read())
    sora = 'sora.png'
    images[0].save(sora, 'PNG')
    img = cv2.imread(sora, cv2.IMREAD_COLOR)
    #img = cv2.blur(img, (5, 5))

    #HSV (hue, saturation, value)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    h, s, v = cv2.split(hsv)
    cv2.imwrite('temp.png',v)
    p = pytesseract.image_to_string(cv2.imread('temp.png'))
    for line in p.lower().split('n'):
        if ':20' in line and ('iso' in line or 'iatf' in line or '1so' in line):
            return(line.title())
        elif ': 20' in line and ('iso' in line or 'iatf' in line or '1so' in line):
            return(line.title())
            
            
  

я хочу запустить что-то с помощью lambda, чтобы, если URL-адрес недоступен или не содержит PDF-файла или какой-либо подобной ошибки, просто введите «Down» в столбце «B», что-то выглядит так

 df['B'] = df['Source'].apply(lambda x: "Down" if Exception else address(x))
  

как правильно это сделать?

Комментарии:

1. Почему бы просто не вернуться "Down" из вашей функции? Посмотрите на try-except блоки.

2. исключение возникает в строке images = pdf2image.convert_from_bytes(pdf.raw.read()) , которая не продолжается до конца, я попытался сделать это в форме try и, кроме того, все еще ничего не получил, я делаю это неправильно

3. Покажите, что вы пробовали

4. спасибо, что указали, когда я пошел читать функцию, прежде чем вставить ее, я понял, какой я идиот

Ответ №1:

Я бы проверил ваш ответ requests.get() и вернул Down , если ответ не соответствует ожиданиям. Это может выглядеть так:

 import cv2
import requests
import pdf2image
import pytesseract
import dateutil.parser as dparser
import pandas as pd
import numpy as np
def address(x):
    pdf = requests.get(x,stream=True)
    if pdf.status_code != 200: # You could be even more specific here
        return "Down"
    else:
        images = pdf2image.convert_from_bytes(pdf.raw.read())
        sora = 'sora.png'
        images[0].save(sora, 'PNG')
        img = cv2.imread(sora, cv2.IMREAD_COLOR)
        #img = cv2.blur(img, (5, 5))

        #HSV (hue, saturation, value)
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        h, s, v = cv2.split(hsv)
        cv2.imwrite('temp.png',v)
        p = pytesseract.image_to_string(cv2.imread('temp.png'))
        for line in p.lower().split('n'):
            if ':20' in line and ('iso' in line or 'iatf' in line or '1so' in line):
                return(line.title())
            elif ': 20' in line and ('iso' in line or 'iatf' in line or '1so' in line):
                return(line.title())
  

Ответ №2:

я делал это неправильно, я пытался добавить try и except идиотским способом

 def address2(x):
    for link in x:
        try:
            pdf = requests.get(link,stream=True)
            images = pdf2image.convert_from_bytes(pdf.raw.read())
            sora = 'sora.png'
            images[0].save(sora, 'PNG')
            img = cv2.imread(sora, cv2.IMREAD_COLOR)
            #img = cv2.blur(img, (5, 5))
            #HSV (hue, saturation, value)
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
            h, s, v = cv2.split(hsv)
            cv2.imwrite('temp.png',v)
            p = pytesseract.image_to_string(cv2.imread('temp.png'))
            for line in p.split('nn'):
                for country in pycountry.countries:
                    if country.name in line and('Quality' not in line) and ('Certificat' not in line):
                        return(line.title())
                    elif country.alpha_3 in line and('Quality' not in line) and ('Certificat' not in line):
                        return(line.title())
        except:
            return("Down")
  

но я исправил это на:

 import cv2
import requests
import pdf2image
import pytesseract
import dateutil.parser as dparser
import pandas as pd
import numpy as np
def address(x):
    try:
        pdf = requests.get(x,stream=True)
        images = pdf2image.convert_from_bytes(pdf.raw.read())
        sora = 'sora.png'
        images[0].save(sora, 'PNG')
        img = cv2.imread(sora, cv2.IMREAD_COLOR)
        #img = cv2.blur(img, (5, 5))

        #HSV (hue, saturation, value)
        hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
        h, s, v = cv2.split(hsv)
        cv2.imwrite('temp.png',v)
        p = pytesseract.image_to_string(cv2.imread('temp.png'))
        for line in p.lower().split('n'):
            if ':20' in line and ('iso' in line or 'iatf' in line or '1so' in line):
                return(line.title())
            elif ': 20' in line and ('iso' in line or 'iatf' in line or '1so' in line):
                return(line.title())
    except:
        return("Down")
  

и теперь все в порядке

Комментарии:

1. Вы должны стараться избегать использования такого общего except: блока. Вместо этого перехватывайте только ожидаемое исключение, например except: TheRelevantExceptionType . Это потому, что, если что-то еще не работает в вашем try блоке из 10 строк, вы можете этого не заметить, поскольку ваш самый общий except проглатывает его. Это может привести к очень неожиданному поведению.