IT

txt 파일을 json 파일로 만들기

esmile1 2024. 7. 28. 00:06

txt 파일을 json 파일로 만들기: KJV 성경 구절 앱 개발을 위한 데이터베이스 구축

소개

이 글에서는 코딩 초보자를 위해 txt 파일을 json 파일로 변환하는 과정을 단계별로 설명합니다. 이 과정은 KJV(King James Version) 성경 구절 앱 개발을 위한 데이터베이스 구축에 활용됩니다. 작업 환경은 idx.google과 Mac mini를 사용합니다.

환경 설정 및 작업 과정

1. 작업 디렉토리 생성

mkdir bible_app
cd bible_app

2. 가상 환경 설정

python3 -m venv venv
source venv/bin/activate

3. 필요한 라이브러리 설치

pip install pandas

4. 프로젝트 구조 생성

mkdir data
mkdir scripts
touch scripts/txt_to_json.py

5. txt 파일 준비

subdirectory인 data 폴더에 kjv_bible.txt 파일을 위치시킵니다.

6. Python 스크립트 작성

scripts/txt_to_json.py 파일을 열고 다음 코드를 입력합니다:

import json
import pandas as pd

def txt_to_json(input_file, output_file):
    with open(input_file, 'r') as file:
        lines = file.readlines()

    bible_data = []
    for line in lines:
        parts = line.strip().split('|')
        if len(parts) == 5:
            book, chapter, verse, text, _ = parts
            bible_data.append({
                'book': book,
                'chapter': int(chapter),
                'verse': int(verse),
                'text': text
            })

    df = pd.DataFrame(bible_data)
    result = df.to_json(orient='records')

    with open(output_file, 'w') as f:
        json.dump(json.loads(result), f, indent=2)

input_file = 'data/kjv_bible.txt'
output_file = 'data/kjv_bible.json'

txt_to_json(input_file, output_file)
print("Conversion completed successfully!")

7. 스크립트 실행

터미널에서 다음 명령어를 실행합니다:

python scripts/txt_to_json.py

8. 결과 확인

data/kjv_bible.json 파일이 생성되었는지 확인합니다.

9. json 파일 구조 확인

생성된 json 파일을 열어 다음과 같은 구조인지 확인합니다:

[
  {
    "book": "Genesis",
    "chapter": 1,
    "verse": 1,
    "text": "In the beginning God created the heaven and the earth."
  },
  ...
]

10. 데이터 유효성 검사

Python 인터프리터를 열어 다음 코드로 데이터를 검사합니다:

import json

with open('data/kjv_bible.json', 'r') as f:
    data = json.load(f)

print(f"Total verses: {len(data)}")
print(f"First verse: {data[0]}")
print(f"Last verse: {data[-1]}")

11. 웹 앱 기본 구조 생성

mkdir templates
mkdir static
touch app.py

12. Flask 설치

pip install flask

13. app.py 작성

app.py 파일에 다음 코드를 입력합니다:

from flask import Flask, render_template, request, jsonify
import json

app = Flask(__name__)

with open('data/kjv_bible.json', 'r') as f:
    bible_data = json.load(f)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/search')
def search():
    query = request.args.get('q', '')
    results = [verse for verse in bible_data if query.lower() in verse['text'].lower()]
    return jsonify(results)

if __name__ == '__main__':
    app.run(debug=True)

14. HTML 템플릿 생성

templates/index.html 파일을 생성하고 다음 내용을 입력합니다:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>KJV Bible Search</title>
</head>
<body>
    <h1>KJV Bible Search</h1>
    <input type="text" id="search-input" placeholder="Enter search term">
    <button onclick="search()">Search</button>
    <div id="results"></div>

    <script>
    function search() {
        const query = document.getElementById('search-input').value;
        fetch(`/search?q=${query}`)
            .then(response => response.json())
            .then(data => {
                const resultsDiv = document.getElementById('results');
                resultsDiv.innerHTML = data.map(verse =>
                    `<p>${verse.book} ${verse.chapter}:${verse.verse} - ${verse.text}</p>`
                ).join('');
            });
    }
    </script>
</body>
</html>

15. 앱 실행

터미널에서 다음 명령어를 실행합니다:

python app.py

16. 브라우저에서 확인

웹 브라우저를 열고 http://localhost:5000에 접속하여 앱을 테스트합니다.

17. 기능 개선: 고급 검색

app.py에 다음 함수를 추가합니다:

def advanced_search(query, book=None, chapter=None):
    results = []
    for verse in bible_data:
        if (book is None or verse['book'] == book) and \\\\
           (chapter is None or verse['chapter'] == chapter) and \\\\
           query.lower() in verse['text'].lower():
            results.append(verse)
    return results

@app.route('/advanced-search')
def advanced_search_route():
    query = request.args.get('q', '')
    book = request.args.get('book')
    chapter = request.args.get('chapter')
    if chapter:
        chapter = int(chapter)
    results = advanced_search(query, book, chapter)
    return jsonify(results)

18. HTML 템플릿 업데이트

index.html에 고급 검색 폼을 추가합니다:

<h2>Advanced Search</h2>
<input type="text" id="adv-search-input" placeholder="Enter search term">
<input type="text" id="book-input" placeholder="Book (optional)">
<input type="number" id="chapter-input" placeholder="Chapter (optional)">
<button onclick="advancedSearch()">Advanced Search</button>

<script>
function advancedSearch() {
    const query = document.getElementById('adv-search-input').value;
    const book = document.getElementById('book-input').value;
    const chapter = document.getElementById('chapter-input').value;
    fetch(`/advanced-search?q=${query}&book=${book}&chapter=${chapter}`)
        .then(response => response.json())
        .then(data => {
            const resultsDiv = document.getElementById('results');
            resultsDiv.innerHTML = data.map(verse =>
                `<p>${verse.book} ${verse.chapter}:${verse.verse} - ${verse.text}</p>`
            ).join('');
        });
}
</script>

19. 스타일 추가

static/style.css 파일을 생성하고 기본 스타일을 추가합니다:

body {
    font-family: Arial, sans-serif;
    max-width: 800px;
    margin: 0 auto;
    padding: 20px;
}

input, button {
    margin: 5px;
    padding: 5px;
}

#results {
    margin-top: 20px;
}

HTML 파일의 <head> 섹션에 스타일시트 링크를 추가합니다:

<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">

20. 최종 테스트 및 배포 준비

앱을 다시 실행하고 모든 기능이 정상적으로 작동하는지 확인합니다. 문제가 없다면 배포를 위한 requirements.txt 파일을 생성합니다:

pip freeze > requirements.txt

결론

이 과정을 통해 txt 파일을 json 파일로 변환하고, 이를 활용하여 KJV 성경 구절 검색 웹 앱을 개발하는 방법을 배웠습니다. 이 앱은 기본 검색과 고급 검색 기능을 제공하며, 추후 더 많은 기능을 추가할 수 있는 기반이 되었습니다. 이 프로젝트를 통해 데이터 처리, 웹 개발, 그리고 사용자 인터페이스 디자인의 기초를 경험할 수 있었습니다.

 

Citations:

[1] https://formason.tistory.com/23

[2] https://eomiso.tistory.com/entry/How-to-use-Katex-in-Tistory-blogs티스토리에서-Latex-사용하기

[3] https://www.npmjs.com/package/tistory-skin/v/1.3.0?activeTab=dependencies

[4] https://github.com/iolo/hexo-migrator-tistory

[5] https://whiseung.tistory.com/entry/Apps-Script-시작-그리고-Google-Sheets-데이터-가져오기