DjangoでCSVのファイルをアップロードして、文字コードをチェックボックスで指定してアップロードして、変換してDLさせたい

2024年6月18日

理解しました。以下は、CSV ファイルをアップロードし、文字コードを指定して変換し、ダウンロードさせるための Django プロジェクト内の簡単なサンプルです。このサンプルでは、pandaschardet ライブラリを使用しています。

  1. charset_converter アプリケーション内の views.py ファイルに以下のようなビューを作成します。
python
# charset_converter/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.core.files.storage import FileSystemStorage
import pandas as pd
import chardet

def convert_csv(request):
    if request.method == 'POST' and request.FILES['file']:
        uploaded_file = request.FILES['file']
        selected_encoding = request.POST.get('selected_encoding', 'utf-8')

        try:
            # アップロードされた CSV ファイルを一時的な場所に保存
            fs = FileSystemStorage()
            filename = fs.save(uploaded_file.name, uploaded_file)
            file_path = fs.url(filename)

            # ファイルの文字コードを判定
            result = chardet.detect(uploaded_file.read(10000))
            detected_encoding = result['encoding']
            confidence = result['confidence']

            print(f"Detected encoding: {detected_encoding}, Confidence: {confidence}")

            # ファイルを再度開いてから読み込み
            with fs.open(filename, 'rb') as f:
                df = pd.read_csv(f, encoding=detected_encoding)

            # 指定されたエンコーディングに変換
            converted_csv = df.to_csv(encoding=selected_encoding, index=False)

            # ダウンロード用のレスポンスを作成
            response = HttpResponse(converted_csv, content_type='text/csv')
            response['Content-Disposition'] = f'attachment; filename="{uploaded_file.name}_converted.csv"'

            return response

        except Exception as e:
            return render(request, 'charset_converter/result.html', {'error_message': str(e)})

    return render(request, 'charset_converter/convert_csv.html')
  1. charset_converter フォルダ内に templates フォルダを作成し、その中に convert_csv.htmlresult.html テンプレートを作成します。
html
<!-- charset_converter/templates/charset_converter/convert_csv.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSV Converter</title>
</head>
<body>
    <h2>CSV Converter</h2>
    <form method="post" action="{% url 'convert_csv' %}" enctype="multipart/form-data">
        {% csrf_token %}
        <label for="file">Upload CSV File:</label>
        <input type="file" name="file" accept=".csv" required><br>
        <label for="selected_encoding">Select Target Encoding:</label>
        <select name="selected_encoding">
            <option value="utf-8">UTF-8</option>
            <option value="shift-jis">Shift_JIS</option>
            <!-- 追加のエンコーディングが必要な場合はここに追加 -->
        </select><br>
        <input type="submit" value="Convert and Download">
    </form>
</body>
</html>
html
<!-- charset_converter/templates/charset_converter/result.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Conversion Result</title>
</head>
<body>
    <h2>Conversion Result</h2>
    {% if error_message %}
        <p>Error: {{ error_message }}</p>
    {% endif %}
</body>
</html>
  1. urls.py ファイルを以下のように変更します。
python
# charset_converter/urls.py
from django.urls import path
from .views import convert_csv

urlpatterns = [
    path('convert_csv/', convert_csv, name='convert_csv'),
]
  1. プロジェクトの urls.py ファイルも変更します。
python
# your_project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('charset_converter/', include('charset_converter.urls')),
]

これで、http://127.0.0.1:8000/charset_converter/convert_csv/ にアクセスすると、CSV ファイルをアップロードし、変換してダウンロードできるフォームが表示されます。

未分類

Posted by ぼっち