문제

쿼리 및 예상 결과가있는 구성 파일을 읽는 작은 DB 테스트 스위트를 작성하고 있습니다.

query         = "SELECT * from cities WHERE name='Unknown';"
count         = 0
level         = 1
name          = "Check for cities whose name should be null"
suggested_fix = "UPDATE cities SET name=NULL WHERE name='Unknown';"

이것은 잘 작동합니다. 나는 각 줄을 Python을 사용하여 나눕니다 string.partition('=').

내 문제는 매우 긴 SQL 쿼리입니다. 현재, 나는이 쿼리를 한쪽 라이너로 붙여 넣습니다.

나는 많은 줄에 걸쳐 있더라도 표현의 권리를 읽는 우아하고 피스닉적인 방법을 찾고 싶습니다.

메모:

  • 내 SQL 쿼리에는 다음을 포함 할 수 있습니다 =
  • 나는 강제에 대한 아이디어를 좋아하지 않습니다 "기존 파일이없는 많은 파일이 있기 때문에 오른쪽 주위에 있습니다.

편집하다:

configparser 훌륭하지만 멀티 린 항목의 모든 라인의 시작 부분에 공간이나 탭을 추가하도록 강요합니다. 이것은 큰 고통 일 수 있습니다.

미리 감사드립니다.

아담

도움이 되었습니까?

해결책

이것은 거의 정확히 사용 사례입니다. (위키 백과, 파이썬 구현, 선적 서류 비치; 당신은보고 싶을 수도 있습니다 JSON 대안으로). Yaml은 몇 가지 장점이 있습니다 configparser 또는 json:

  • 인간의 가독성 (더 큰 파일의 경우 JSON보다 낫다);
  • 임의의 Python 객체를 직렬화 할 수 있습니다 (이는 SAFE를 사용하지 않습니다. pickle, 그러나 a safe_load 이 문제를 완화하기 위해 Python 구현에서 기능). 이것은 이미 단순한 것에 유용합니다. datetime 물체.

완전성을 위해 주요 단점 (IMO) :

  • JSON 구현보다 느린 순서에 따른 파이썬 구현;
  • JSON보다 플랫폼 전체에서 휴대용이 적습니다.

예를 들어

import yaml

sql = """
query         : "SELECT * from cities
WHERE name='Unknown';"
count         : 0
level         : 1
name          : "Check for cities whose name should be null"
suggested_fix : "UPDATE cities SET name=NULL WHERE name='Unknown';"
"""

sql_dict = yaml.safe_load(sql)

print(sql_dict['query'])

인쇄물

SELECT * from cities WHERE name='Unknown';

다른 팁

Python 표준 라이브러리 모듈 configparser 기본적으로이를 지원합니다. 구성 파일은 표준 형식이어야합니다.

[Long Section]
short: this is a normal line
long: this value continues
    in the next line

위의 구성 파일은 다음 코드로 읽을 수 있습니다.

import ConfigParser
config = ConfigParser.ConfigParser()
config.read('longsections.cfg')
long = config.get('Long Section', 'long')

정규 표현식을 사용하는 것이 좋습니다 ... 코드는 이렇게 보일 수 있습니다.

import re

test="""query = "select * from cities;"
count = 0
multine_query = "select *
from cities
     where name='unknown';"
"""

re_config = re.compile(r'^(\w+)\s*=\s*((?:".[^"]*")|(?:\d+))$', re.M)
for key, value in re_config.findall(test):
    if value.startswith('"'):
        value = value[1:-1]
    else:
        value = int(value)
    print key, '=', repr(value)

이 예제의 출력은 다음과 같습니다.

~> python test.py 
query = 'select * from cities;'
count = 0
multine_query = "select *\nfrom cities\n     where name='unknown';"

도움이되기를 바랍니다!

안부, 크리스토프

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top