Python读写Json涉及到中文的处理方法


Posted in Python onSeptember 12, 2016

今天在帮前端准备数据的时候,需要把数据格式转成json格式,说实话,涉及到中文有时候真的是很蛋疼,除非对Python的编码规则比较了解,不然处理起来真的很蛋疼。

整个逻辑

我们需要处理的是把一些文章处理,生成多个html文件,然后用json来显示文章的列表,图片,摘要和标题。

思路

为了以后的数据扩展,那必须有一个数据库,我的想法就是自己写一个简单的网页做为提交输入,然后post到后台以后录入到数据库中,再写一个展示文章的页面,展示效果正确后,写一个requests动态的把所有的数据都爬下来生成一个一个的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'^article/(?P<main_id>\S+)/$', views.article, name='article'),
}
views.py

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

# Create your views here.


def index(request):
  return render(request, 'index.html')


def add_article(request):
  error = 'error'
  if request.method == 'POST':
    # 获取前段request的内容
    main_id = request.POST['main_id']
    img_url = request.POST['img_url']
    title = request.POST['title']
    content = request.POST['content']
    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 = 'success'
    return render(request, 'index.html', {'error': error})
  return render(request, 'index.html')


def article(request, main_id):
  article_detial = Tzxy.objects.get(main_id=main_id)
  return render(request, 'views.html', {'content': 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 == 'success' %}
  <div class="alert alert-success">{{ error }}</div>
{% 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>

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

</body>
</html>

当然,我里面使用了markdown来处理了一些数据。有关markdown的集成,可以移步《Django开发博客(六)——添加markdown支持》
爬数据的小脚本如下,需要使用到requests模块

# coding=utf-8
import sys
import requests
reload(sys)
sys.setdefaultencoding('utf8')


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('http://127.0.0.1:8000/tzxy/article/' + file_name + str(x))
    with open('/Users/SvenWeng/Desktop/test/' + file_name + str(x) + '.html', 'w') as f:
      f.write(r.text)
  print 'success'


if __name__ == '__main__':
  tzhtl_name = 'tzxy_tzhtl_h_'
  djjyy_name = 'tzxy_djjyy_h_'
  tohtml(djjyy_name, 1, 39)

里面的一些命名自己可以根据需要去修改。

生成json

说实话,json的使用方式很简单,Python对json的支持也很好,不过涉及到中文就有点蛋疼了,我的代码是这样的:

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

list_json = []

conn = sqlite3.connect('db.sqlite3')
c = conn.cursor()
sql = 'select * from Tzxy_tzxy'
c.execute(sql)
all_thing = c.fetchall()

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

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

代码逻辑是:定义一个空列表,用来装生成的字典信息,然后从sqlite里面把之前存的数据全部抓出来。把数据循环生成自己想要的格式的字典,一个一个的插到列表中。再用Python提供的json.dumps方法把数据转成json格式,再写入文件就行了。
逻辑看上去是没什么问题,实现起来也很完美,但是最后我打开json文件检查的时候发现所有的中文都变成Unicode了。这简直是坑爹啊。

大致查了一下,好像网络上对这块说的内容并不详细,举得例子也都是非常非常简单的那种,直接给中文的,并不是我想要的,最后只能硬着头皮去看官方的说明,最后找到了这么一个东西ensure_ascii=False,在Python转Json的时候带上这个方法,也就是

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

这样处理之后,写入文件就是正常的中文了。

以上这篇Python读写Json涉及到中文的处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解析Python中的二进制位运算符
May 13 Python
Python修改MP3文件的方法
Jun 15 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
Jun 16 Python
Python中模块与包有相同名字的处理方法
May 05 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
Python微信操控itchat的方法
May 31 Python
python实现的生成word文档功能示例
Aug 23 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
Python任务自动化工具tox使用教程
Mar 17 Python
Python通过len函数返回对象长度
Oct 22 Python
python opencv实现图像配准与比较
Feb 09 Python
详细介绍Python的鸭子类型
Sep 12 #Python
Python 读写文件和file对象的方法(推荐)
Sep 12 #Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 #Python
浅谈python对象数据的读写权限
Sep 12 #Python
python获取list下标及其值的简单方法
Sep 12 #Python
Python循环语句中else的用法总结
Sep 11 #Python
python字典键值对的添加和遍历方法
Sep 11 #Python
You might like
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
php SQL防注入代码集合
2008/04/25 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
jquery实现Li滚动时滚动条自动添加样式的方法
2015/08/10 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
2017/01/21 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
Python PyQt5标准对话框用法示例
2017/08/23 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
英国景点门票网站:attractiontix
2019/08/27 全球购物
党员年终民主评议的自我评价
2013/11/05 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
学生犯错保证书
2015/05/09 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
小学生教师节广播稿
2015/08/19 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js