Python : 키당 여러 줄의 구성 파일 읽기
-
20-09-2019 - |
문제
쿼리 및 예상 결과가있는 구성 파일을 읽는 작은 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
, 그러나 asafe_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';"
도움이되기를 바랍니다!
안부, 크리스토프
제휴하지 않습니다 StackOverflow