2011-04-01 3 views
1

나는 최근에 YAML을 발견했으며, 내 프로젝트를위한 환상적인 포맷으로 판명되었다. (나는 텍스트 기반 RPG를 만들고있다.) 그것은 내가 완벽하게 필요로하는 모든 것을 다루고 있습니다 - 영역 파일들 (desc, exit, objs, npcs 등의 방), 스크립트 파일, npc 파일, 객체 파일 ... 그것들 모두를 다루십시오! 단 하나만 있습니다 ..."yaml.dump()"가 파일을 저장하는 방법을 좋아하지 않습니다. 대안이 있습니까?

이 파일의 값을 업데이트 할 때 변경 사항을 유지하려면 디스크에 다시 기록해야합니다. 불행히도 YAML의 dump() 메소드는 실제로 모든 것을 엉망으로 만든다. 먼저 모든 키를 영문자 순으로 정렬하면 한 줄에 하나의 k : v 쌍이 표시됩니다. 이렇게하면 효과적으로 5 줄의 파일을 가져 와서 94 줄로 바꿨습니다.

나는 YAML은 write()를 사용하여 디스크로 다시 개체를 작성 해봤지만 나를

TypeError: expected a character buffer object

가 발생합니다. Pickle은 그것을 구할 것이나, 나는 그것이 YAML의 데이터를 파괴 할 것이라고 생각한다. dump()없이 YAML 객체를 저장하는 좋은 방법이 있습니까? SQLite에 대한 언급을 들었습니다. YAML과 동일하게 작동합니까? 데이터베이스 경험이 거의 없지만 YAML 개체는 기본적으로 데이터베이스 인 것 같습니다. SQLite를 사용하기 위해 모든 것을 다시 코딩 할 가치가 있습니까? 지금 가지고있는 문제와 달리 변경된 값을 쉽게 저장할 수 있습니까?

여기에서 도움을 받으실 수 있습니다. 나는 YAML을 많이 사랑합니다. 나는 내 게임에 필요한 모든 데이터를 저장하는 방법을 찾기 위해 오랜 시간 노력했습니다. YAML을 발견했을 때 마치 천사의 합창이 그 위에 영광을 불어 넣은 것처럼 거룩한 빛으로 빛나는 것처럼 보였습니다. 내가 먼저 dump()을 사용하지 않고 YAML 데이터를 디스크에 저장하는 방법을 알고 싶습니다. 그렇지 않다면, 제안은 감사하겠습니다!

답변

1

YAML은 파이썬과 텍스트 편집 가능한 형식 사이에서 사전과 목록을 직렬화 및 비 직렬화하는 방법입니다. 풍부한 데이터, 다중 사용자 액세스, 빠른 데이터 조회, 데이터 무결성 보장 및 데이터베이스를 데이터베이스로 만드는 다른 모든 작업을 저장하는 데 적합하지 않습니다.

YAML을 데이터베이스로 사용하고 있지만 데이터베이스가 아닙니다. 예를 들어, 키의 재정렬은 key: value 쌍이 본질적으로 순서가없는 파이썬 사전으로 표현된다는 사실의 결과입니다.

확실히 데이터베이스에 대해 조금 배우는 데 시간을 할애해야합니다.

SQLite는 시작하기에 좋은 장소입니다. Postgres 또는 MySQL을 볼 수도 있습니다. SQL에 대한 초보자 안내서와 Python으로 데이터베이스 액세스를 읽는 것이 좋습니다. 웹에는 많은 것들이 있습니다.

+0

그러나 이것은 문제가되지 않습니다. YAML은 데이터를 사람이 읽을 수있는 형식으로 저장하는 데 적합합니다. 일단로드하면 원시 Python 데이터 구조를 가지므로 메모리를 사용하면서 현실적으로 제공 할 수있는 데이터베이스보다 빠른 액세스가 가능합니다. DBs는 데이터가 한 번에 메모리에있을 수없는 경우에 성공합니다. – delnan

+0

나는 파이썬에서 SQLite에 대해 이야기하는 몇 개의 vids를 조사했는데 그 경로를 배우는 것이 많은 것처럼 보였다. 내가 가지고있는 유일한 문제는 조금씩 내 진도를 멈출 수 있다는 것입니다. 그러나 단순히 2 차원 사전 객체에 액세스하는 것보다 더 강력 할 수 있습니다. 데이터베이스가 YAML과 비교할 때 얼마나 느리게 걸릴까요? 만약 내가 각 행이 그 지역의 1 개의 방에 필요한 모든 데이터를 보유하고 있고 50 개의 방이있는 데이터베이스에 매핑 된 영역이 있다면 그것은 정말로 그렇게 느린가? –

+0

문자열 처리가 덜 필요하기 때문에 일반적으로 데이터베이스는 YAML보다 빠릅니다 (그러나 DB 구조를 얼마나 잘 설계했는지에 따라 다름) – ncoghlan

0

YAML 및 Python을 사용하여 순서를 유지할 수 있습니다.

파이썬에는 OrderedDict가 있고 YAML에는 omap이라는 등가 순서 매핑이 있습니다.

불행히도 YAML을 사용하여 OrderedDict를 덤프하면 YAML omap로 변환하는 대신 OrderedDict Python 개체 유형을 유지하려고 시도합니다. 이것은 부분적으로 YAML 명세가 많은 언어들과 잘 어울리는 것을 의미하고, 기술적으로 YAML 맵이나 omap은 내가 믿는 중복 키를 허용하기 때문이다 (나는 그것을 재 연구해야 하겠지만, YAML과 JSON 사이의 '키'차이 - YAML은 JSON이없는 곳에 중복 키를 처리하는 방법을 선언합니다.)

어쨌든 YAML에게 OrderedDict로 데이터를로드하고 OrderedDict를 순차적으로 덤프하도록 지시하는 방법이 있습니다 지도 또는 omap에. 내가 찾은 가장 간결한 소스는 py-lessly입니다.비록 웹 주위에 몇 가지 다른 구현이 있습니다. 나는 py-lessly 코드가 필요없는 간단한 yaml 맵에 덤프하는 것을 좋아한다! 모든 사전 옆에 omap - YAML을 꽤 유지한다!

또한 추가 기능이있는 AttrDict라는 OrderedDict 하위 클래스에 YAML 데이터를로드하는 layered-yaml-attrdict-config이 있습니다. 이 구현에 저를 위해 몇 가지 작업을 추가해야했습니다. 덤프 할 때 순서가 없어 졌으므로 py가없는 구현의 코드를 추가했습니다. 또한 결합 된 dict 및 목록 구조로 작업하고 싶었고 AttrDict를 전체 데이터 구조에 재귀 적으로 적용하기 위해 몇 가지 추가 코드를 작성해야했습니다.

이러한 예제를 통해 YAML을 사용하여 정렬 된 매핑을 사용하는 방법을 볼 수 있습니다. 나는 현재 상대적으로 사람이 읽을 수 있고 어떤 순서가 중요한지 응용 프로그램 설정을 위해이 기능을 구현하고 있습니다.

관련 문제