2017-05-04 4 views
0

데이터 유효성 검사를 지원하고 중요하게 데이터가 거부 된 이유를 나타내는 오류 로그를 제공하는 일반 유효성 검사기 모듈을 찾고 있습니다. 주로 평균 40 열과 약 40,000 행의 CSV 파일로 작업하고 있습니다. CSV 파일에는 개인 식별 정보, 연락처 정보 및 그들이 보유한 계정에 대한 세부 정보가 포함되어 있습니다.대량 데이터 (CSV) 유효성 검사에 Pyvaru 사용

예.

First Name|Last Name|Other Name|Passport Number|Date of Birth|Phone Number|Email Address|Physical Address|Account Number|Invoice Number|Date Opened|Amount Due|Date Due|etc|etc

나는 예를 들면, data type처럼 data length, options/choices, ranges, mandatory fields 등도 있습니다 조건 검증을 기본 재료를 검증 할 필요가 Amount Due 값이 제공된 경우 Date Due도 제공해야합니다. 그렇지 않으면 오류가 발생합니다.

Pyvaru은 몇 가지 기본 유효성 검사 클래스를 제공합니다. pyvaru를 사용하여 이러한 기본 유효성 검사 시나리오와 조건부 유효성 검사 시나리오를 모두 구현할 수 있습니까? 그렇다면 유효성 검사를 구조화하는 방법은 무엇입니까? 예를 들어 개체를 만들어야합니다. 식별자 객체, 그리고 나에 대한 계정 객체는 pyvaru를 사용합니까?

답변

0

Pyvaru는 파이썬 개체 (클래스 인스턴스 및 사전, 목록 등의 컬렉션)의 유효성을 검사하므로 CSV에서 시작하여 각 레코드를 DictReader을 사용하여 사전으로 변환합니다. 그래서, 같은 CSV를 부여 :

policyID,statecode,county,eq_site_limit,hu_site_limit,fl_site_limit,fr_site_limit,tiv_2011,tiv_2012,eq_site_deductible,hu_site_deductible,fl_site_deductible,fr_site_deductible,point_latitude,point_longitude,line,construction,point_granularity 
119736,FL,CLAY COUNTY,498960,498960,498960,498960,498960,792148.9,0,9979.2,0,0,30.102261,-81.711777,Residential,Masonry,1 
448094,FL,CLAY COUNTY,1322376.3,1322376.3,1322376.3,1322376.3,1322376.3,1438163.57,0,0,0,0,30.063936,-81.707664,Residential,Masonry,3 
206893,FL,CLAY COUNTY,190724.4,190724.4,190724.4,190724.4,190724.4,192476.78,0,0,0,0,30.089579,-81.700455,Residential,Wood,1 
333743,FL,CLAY COUNTY,0,79520.76,0,0,79520.76,86854.48,0,0,0,0,30.063236,-81.707703,Residential,Wood,3 
172534,FL,CLAY COUNTY,0,254281.5,0,254281.5,254281.5,246144.49,0,0,0,0,30.060614,-81.702675,Residential,Wood,1 

무언가 같이 유효성 검사 코드는 다음과 같습니다

import csv 
from pyvaru import Validator 
from pyvaru.rules import MaxLengthRule, MaxValueRule 


class CsvRecordValidator(Validator): 
    def get_rules(self) -> list: 
     record: dict = self.data 
     return [ 
      MaxLengthRule(apply_to=record.get('statecode'), 
          label='State Code', 
          max_length=2), 
      MaxValueRule(apply_to=record.get('eq_site_limit'), 
         label='Site limit', 
         max_value=40000), 
     ] 


with open('sample.csv', 'r') as csv_file: 
    reader = csv.DictReader(csv_file) 
    row = 0 
    for record in reader: 
     row += 1 
     validator = CsvRecordValidator(record) 
     validation = validator.validate() 
     if not validation.is_successful(): 
      print(f'Row {row} did not validate. Details: {validation.errors}') 

위의 예제는, 특별히 그 "statecode을 당신이 할 수있는 단지 바보 같은 예를 확인한다 "열의 최대 길이는 2이고"eq_site_limit "의 최대 값은 40k입니다. 당신은 apply() 방법 추상 클래스 ValidationRule를 서브 클래스와 구현하여 자신의 규칙을 구현할 수 있습니다 : 그것은 것을 확인 이전 사용자 정의 규칙을 사용하여 예를 들어 ... 비트 연산자를 사용하여 규칙을 깨뜨릴 수도 있습니다

class ContainsHelloRule(ValidationRule): 
    def apply(self) -> bool: 
     return 'hello' in self.apply_to 

~ ContainsHelloRule(apply_to=a_string, label="A test string")

을 따라서 규칙은 문자열이 "안녕하세요"문자열을 포함하지 않는 경우에만 유효합니다 : 문자열 MST "안녕하세요"당신은 쓸 수 있습니다 포함되어 있습니다.

유효성 검사 정규식이있는 PatternRule을 사용하여 각 행의 유효성을 검사하여 사전 변환없이 CSV 레코드의 유효성을 검사 할 수도 있지만 물론 어떤 열 값이 유효하지 않은지 알 수 없습니다.