#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
проглатывает его. Это может привести к очень неожиданному поведению.