작은 메모장

6. 파일 속성 리스트와 중요 정보 탐지 본문

실더스 루키즈 교육

6. 파일 속성 리스트와 중요 정보 탐지

으앙내눈 2023. 11. 28. 17:33

< 프레임워크란? >

Frame + work, 즉 어떤 틀에 맞춰서 동작하는 작업

왜 이게 필요한가?
어떤 커다란 프로젝트나 계획에서 개발자들이 서로 다른 환경에서 개발한다면 충돌, 오류의 위험이 커짐.

때문에 이러한 변수들을 통제하기 위해, 체계적으로 정해진 환경에서 개발한다면 이러한 요인을 최대한으로 줄일 수 있음.

그런 목적으로 기초적인 환경이 정해져 있는 것을 프레임워크라고 함.

 

파이썬 웹 프레임 워크
- Django (어려움, 용이함)

- Flask API (쉬움, 가벼움)

- Fast API (백엔드, 요즘 뜨고 있음)

 

< 사용한 라이브러리 >

pip install flask

 

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello_world():
    return "Hello Flask"


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

기본 Flask 연습

 

<!DOCTYPE html>
<html>
<head>
    <title>Download Page</title>
</head>
<body>
    <h1>Download Page for translate result</h1>
    <p>Translating Complete.</p>
    <label>{{file_name}} </br>You can download result</label>
    <form action="{{url_for('download_report')}}">
        <input type="submit" value="Download result">
    </form>
</body>
</html>

result.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>RSS Reading&Translating Site</title>
</head>
<body>
    <h1>Upload RSS Site URL</h1>
    <form method="post" action="{{url_for('process')}}" enctype="multipart/form-data">
        <input type="text" name="input_url">
        <input type="submit" value="submit">
    </form>
</body>
</html>

upload.html

from flask import Flask, render_template, request
from flask import send_file
from googletrans import Translator
from datetime import datetime
import pandas as pd
import feedparser
import openpyxl
import time

app = Flask(__name__)


def rss_get(url):
    feed = feedparser.parse(url)

    now = datetime.now()
    file_name = f"{now.strftime('%Y-%m-%d')}_result.xlsx"
    file_path = f"static/{file_name}"

    titles = []
    links = []
    descriptions = []
    authors = []
    pubDatas = []

    for entry in feed.entries:
        titles.append(entry.title)
        links.append(entry.link)
        descriptions.append(entry.description)
        authors.append(entry.author)
        pubDatas.append(entry.published)

    data = {
        "Title": titles,
        "Link": links,
        "Description": descriptions,
        "Author": authors,
        "Publish": pubDatas,
    }

    df = pd.DataFrame(data)
    df.to_excel(file_path, index=False)

    return [file_name, file_path]


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


@app.route("/process", methods=["POST"])
def process():
    url = request.form["input_url"]
    file_info = rss_get(url)

    workbook = openpyxl.load_workbook(file_info[1])
    sheet = workbook.active

    # 구글 번역
    translator = Translator()
    for row in sheet.iter_rows():
        for cell in row:
            translated_text = translator.translate(cell.value, dest="en").text
            cell.value = translated_text

        time.sleep(1)

    workbook.save("transrated_excel.xlsx")

    return render_template("result.html", file_name=[file_info[0]])


@app.route("/download_report")
def download_report():
    return send_file("transrated_excel.xlsx", as_attachment=True)


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

app.py

 

RSS 링크를 올리면 정보를 저장 후 번역해서 그걸 사용자에게 돌려줌

 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Result Page</title>
    <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='style.css')}}">
    </head>
<body>
    <h1>Result Page</h1>
    <form method="post" action="{{url_for('compress')}}">
    <table border="1">
        <thead>
            <tr>
                <th>File name</th>
                <th>File size</th>
                <th>File date</th>
                <th>File Select</th>
            </tr>
        </thead>
        <tbody>
            {% for file in files%}
            <tr>
                <td>{{file[0]}}</td>
                <td>{{file[1]}}</td>
                <td>{{file[2]}}</td>
                <td><input type="checkbox" name="files" value="{{file[0]}}"></td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    <button type="submit">Compress File</button>
    </form>
    
</body>
</html>

list.html

from flask import Flask, render_template, request, send_file
import os
from datetime import datetime
import zipfile

app = Flask(__name__)


@app.route("/")
def list():
    upload_path = "uploads"
    files = []

    for file in os.listdir(upload_path):
        file_path = os.path.join(upload_path, file)
        ctime_datetime = datetime.fromtimestamp(os.path.getctime(file_path)).strftime(
            "%Y-%m-%d %H:%M:%S"
        )
        files.append((file, os.path.getsize(file_path), ctime_datetime))

    return render_template("list.html", files=files)


@app.route("/compress", methods=["POST"])
def compress():
    upload_path = "uploads"
    files = request.form.getlist("files")
    zip_path = os.path.join(upload_path, "compress.zip")
    with zipfile.ZipFile(zip_path, "w") as zip_file:
        for file in files:
            file_path = os.path.join(upload_path, file)
            zip_file.write(file_path, file)


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

app.py

 

특정 디랙토리(static)에 있는 파일 정보를 긁어오고, 이를 선택해 압축하는 프로그램