>  기사  >  백엔드 개발  >  Python 읽기 및 쓰기 Json에는 중국어 처리 방법이 포함됩니다.

Python 읽기 및 쓰기 Json에는 중국어 처리 방법이 포함됩니다.

高洛峰
高洛峰원래의
2017-02-23 11:11:411200검색

오늘 프론트엔드용 데이터를 준비할 때 데이터 형식을 json 형식으로 변환해야 했습니다. 솔직히 중국어의 경우 실력이 좋지 않은 이상 정말 골치아플 때가 있습니다. Python의 코딩 규칙을 이해하면 처리하기가 정말 어렵습니다.

전체 로직

처리해야 할 것은 일부 기사를 처리하고 여러 html 파일을 생성한 다음 json을 사용하여 기사 목록을 표시하는 것입니다. , 그림, 초록 및 제목.

아이디어

향후 데이터 확장을 위해서는 데이터베이스가 있어야 하고 제출 입력으로 간단한 웹 페이지를 직접 작성하여 게시하는 것이 내 아이디어입니다. 배경 데이터베이스에 입력한 후 기사를 표시하는 페이지를 작성하고 표시 효과가 올바른 후 모든 데이터를 동적으로 크롤링하고 HTML 문서를 하나씩 생성하도록 요청을 작성합니다. 데이터베이스에서 최종 json 데이터를 추출하고 생성하기만 하면 됩니다.

프론트엔드

사실 프론트엔드는 아주 간단해서 최근에 웹페이지를 작성하다보니 할 수 있게 되었습니다. 몇 분 안에. 코드는 다음과 같습니다.

urls.py

from django.conf.urls import url, include
from . import views


urlpatterns = {
  url(r'^$', views.index, name='index'),
  url(r'add_article/', views.add_article, name='add_article'),
  url(r&#39;^article/(?P<main_id>\S+)/$&#39;, views.article, name=&#39;article&#39;),
}
views.py

# coding=utf-8
from django.shortcuts import render
from .models import Tzxy

# Create your views here.


def index(request):
  return render(request, &#39;index.html&#39;)


def add_article(request):
  error = &#39;error&#39;
  if request.method == &#39;POST&#39;:
    # 获取前段request的内容
    main_id = request.POST[&#39;main_id&#39;]
    img_url = request.POST[&#39;img_url&#39;]
    title = request.POST[&#39;title&#39;]
    content = request.POST[&#39;content&#39;]
    abstract = content[:50]
    print main_id
    indb = Tzxy(
          main_id=main_id,
          img_url=img_url,
          title=title,
          content=content,
          abstract=abstract
          )
    indb.save()
    error = &#39;success&#39;
    return render(request, &#39;index.html&#39;, {&#39;error&#39;: error})
  return render(request, &#39;index.html&#39;)


def article(request, main_id):
  article_detial = Tzxy.objects.get(main_id=main_id)
  return render(request, &#39;views.html&#39;, {&#39;content&#39;: article_detial})

models.py

from __future__ import unicode_literals
from django.db import models
from django.contrib import admin


class Tzxy(models.Model):
  main_id = models.CharField(max_length=10)
  img_url = models.CharField(max_length=50, null=True)
  title = models.CharField(max_length=50)
  content = models.TextField()
  abstract = models.CharField(max_length=200)

admin.site.register(Tzxy)

템플릿 간단하게 폼을 작성했습니다

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
  <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
</head>
<body>
<form method="post" action="/tzxy/add_article/">
{% csrf_token %}
main_id: <input type="text" name="main_id"><br>
img_url: <input type="text" name="img_url"><br>
title: <input type="text" name="title"><br>
{% if error == &#39;success&#39; %}
  <p class="alert alert-success">{{ error }}</p>
{% endif %}
<textarea name="content" rows="25" style="width: 600px;"></textarea><br>
  <input type="submit" name="Submit">
</form>
</body>
</html>

표시된 페이지

{% load custom_markdown %}
<!DOCTYPE html>
<html lang="zh-cn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
  <meta name="apple-touch-fullscreen" content="yes" />
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="format-detection" content="telephone=no">
  <meta http-equiv="Cache-Control" content="no-store" />
  <meta http-equiv="Pragma" content="no-cache" />
  <meta http-equiv="Expires" content="0" />
  <title>{{ content.title }}</title>
  <link rel="stylesheet" href="../../css/cssreset.min.css">
  <link rel="stylesheet" href="../../css/fx_tzxy_content.min.css">
</head>
<body>

  <p class="page">
    <h1>{{ content.title }}</h1>
    <p class="content">
      {{ content.content | custom_markdown | linebreaksbr }}
    </p>
  </p>

</body>
</html>

물론 일부 데이터를 처리하기 위해 마크다운을 사용했습니다. 마크다운 통합을 위해서는 "Django 개발 블로그(6) - 마크다운 지원 추가"로 이동하세요.
데이터를 크롤링하는 작은 스크립트는 다음과 같습니다. 요청 모듈을 사용해야 합니다

# coding=utf-8
import sys
import requests
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)


def tohtml(file_name, startpos, endpos):
  """
  请求网页数据后把网页源码存储为html格式,启动脚本时要先启动Django的Server
  :param file_name:生成文件名的前缀,最后一位用传入的数字来代替
  :param startpos:开始的数字
  :param endpos:结束的数字
  :return:None
  """

  for x in range(startpos, endpos):
    r = requests.get(&#39;http://127.0.0.1:8000/tzxy/article/&#39; + file_name + str(x))
    with open(&#39;/Users/SvenWeng/Desktop/test/&#39; + file_name + str(x) + &#39;.html&#39;, &#39;w&#39;) as f:
      f.write(r.text)
  print &#39;success&#39;


if __name__ == &#39;__main__&#39;:
  tzhtl_name = &#39;tzxy_tzhtl_h_&#39;
  djjyy_name = &#39;tzxy_djjyy_h_&#39;
  tohtml(djjyy_name, 1, 39)

필요에 따라 이름 중 일부를 수정할 수 있습니다.

json 생성

솔직히 json을 사용하는 방법은 매우 간단하고, json에 대한 Python의 지원도 매우 좋지만, 중국어의 경우 좀 짜증나네요. 제 코드는 다음과 같습니다:

# coding=utf-8
import sqlite3
import json
import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)

list_json = []

conn = sqlite3.connect(&#39;db.sqlite3&#39;)
c = conn.cursor()
sql = &#39;select * from Tzxy_tzxy&#39;
c.execute(sql)
all_thing = c.fetchall()

for x in all_thing:
  dic_member = {&#39;id&#39;: x[1].split(&#39;_&#39;)[3],
         &#39;img&#39;: x[2],
         &#39;title&#39;: x[3],
         &#39;abstract&#39;: &#39;&#39;}
  list_json.append(dic_member)
conn.close()

final_json = json.dumps(list_json, sort_keys=True, indent=4)
with open(&#39;test.json&#39;, &#39;w&#39;) as f:
  f.write(final_json)

코드 논리는 다음과 같습니다. 생성된 사전 정보를 담기 위해 빈 목록을 정의합니다. , 이전에 저장된 모든 데이터는 sqlite에 캡처됩니다. 데이터를 반복하여 원하는 형식의 사전을 생성하고 목록에 하나씩 삽입합니다. 그런 다음 Python에서 제공하는 json.dumps 메서드를 사용하여 데이터를 json 형식으로 변환한 후 파일에 씁니다.
로직도 문제 없는 것 같고 구현도 완벽했는데, 결국 json 파일을 열어 확인해 보니 모든 한자가 유니코드로 되어 있는 것을 발견했습니다. 이것은 단순한 사기입니다.

대충 검색해 보니 인터넷에 언급된 내용은 상세하지 않은 것 같고, 제시된 예도 모두 아주 아주 간단하게 중국어로 제공되는 것 같은데, 제가 하는 내용은 아닙니다. 네, 결국에는 공식 지침을 읽어야 했고 마침내 ensure_ascii=False라는 것을 발견했습니다. Python을 Json으로 변환할 때 이 방법을 사용하세요.

final_json = json.dumps(list_json, sort_keys=True, indent=4, ensure_ascii=False)

이렇게 처리하면 작성된 파일은 일반 중국어가 됩니다.

위의 중국어 처리가 포함된 Python에서 JSON을 읽고 쓰는 방법은 모두 편집자가 공유한 내용이므로 참고가 되셨으면 좋겠습니다. PHP 중국어 사이트도 지원해 주시길 바랍니다.

중국어 처리 방법을 포함한 Python의 Json 읽기 및 쓰기 관련 기사를 더 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.