zoukankan      html  css  js  c++  java
  • python json及mysql——读取json文件存sql、数据库日期类型转换、终端操纵mysql及python codecs读取大文件问题

    preface: 近期帮师兄处理json文件,须要读到数据库里面,以备其兴许从数据库读取数据。数据是关于yelp站点里面的: https://github.com/Yelp/dataset-examples,http://www.yelp.com/dataset_challenge/. 涉及到一些json和sql的问题,记录下。

    一、python sql安装

    python 自带轻型数据库sqlite,只是用不了。须要mysql才行。pip安装mysql失败。easy_install安装也失败。这不科学。

    后经过同仁的帮忙。用conda成功安装,这什么鬼。好吧。查了下是python自带的包管理器conda

    pip install MySQLdb
    easy_install MySQLdb
    pip install MySQL
    easy_install MySQL
    ipython
    which python
    sudo conda search mysql
    conda search mysql
    conda install mysql-python

    二、处理json数据

    python有自带解析json的包,如同解析html的beautifulsoup, 解析xml的xml包等等。用json.loads()函数可破。下面几句代码可破。

    import json
    import codecs
    f = codecs.open(file_name,encoding = "utf-8")
    for line in f:
        line = line.strip("
    ")
        line_dict = json.loads(line)
    
    须要注意的是:

    1.卤主用的是codecs读入文件。以前以为

    with codecs.open(file_name,encoding = "utf-8") as f:
        text = f.readlines()

    通过readlines()是一行一行的读入,可是这次遇到1.4G的json文件时。内存溢出。转为直接用上面的,而非用readlines()函数读。

    2.json.loads()传入的參数须要是json字符串。卤主一行一行的读入,传入json字符串,解析后。是一个字典。接下来就优点理了。看个人须要进行分析。

    #============================

    方法2:将整个json文件作为參数传入到

    f = file(file_name)

    s = json.load(f)

    但这样会遇到ValueError:Extra data错误,查了下资料,说是多个json对象的问题。这不废话么。一个目录里肯定多个json对象。stackoverflow里面解释的非常具体http://stackoverflow.com/questions/21058935/python-json-loads-shows-valueerror-extra-data。


    >>> json.loads('{}')
    {}
    >>> json.loads('{}{}') # == json.loads(json.dumps({}) + json.dumps({}))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:Python27libjson\__init__.py", line 338, in loads
        return _default_decoder.decode(s)
      File "C:Python27libjsondecoder.py", line 368, in decode
        raise ValueError(errmsg("Extra data", s, end, len(s)))
    ValueError: Extra data: line 1 column 3 - line 1 column 5 (char 2 - 4)
    
    >>> dict1 = {}
    >>> dict2 = {}
    >>> json.dumps([dict1, dict2])
    '[{}, {}]'
    >>> json.loads(json.dumps([dict1, dict2]))
    [{}, {}]

    卤主没用方法2。故没有深究。

    三、存sql

    一開始没试过。等真正查找博客编写自己的代码的时候比自己想象的简单。直接上有凝视的代码。


    import MySQLdb as mdb
    #须要创建数据库yelp_dataset_challenge_academic_daaset
    conn = mdb.connect(host = 'XXX.XX.XX.XX', user = 'XXX', passwd = 'XX', db = 'yelp_dataset_challenge_academic_daaset')
    cur  = conn.cursor()#初始化游标
    #conn.set_character_set("utf-8")
    cur.execute('SET NAMES utf8;') 
    cur.execute('SET CHARACTER SET utf8;')
    cur.execute('SET character_set_connection=utf8;')
    #===============建表,先删除已存在的记录。

    表本身不删除。不用drop,用delete table_name = "yelp_academic_dataset_checkin" delete_table = "delete from "+table_name cur.execute(delete_table) #须要在数据库中创建表yelp_academic_dataset_checkin,及字段和字段属性类型。

    #写sql语句创建也行。不 insert_sql = "insert into yelp_academic_dataset_checkin (type,business_id,checkin_info) values (%s,%s,%s)" #=====从json得到value的一些步骤,略。============ values_tuple = (str(temp_values[0]),str(temp_values[1]),str(temp_values[2])) cur.execute(insert_sql,values_tuple) #运行完了,须要关掉 conn.commit() conn.close()



    四、写入日期型数据

    需求变。代码也跟着变。唉。让一个程序猿崩溃,改三次需求即可。

    有个字段在数据库里是date类型,而不是varchar(),python字符串到mysql数据库里面须要是date类型的,有两种方法可破,第一,python字符串转为date类型,然后写到数据库里。其二。python字符串写到里面,再在调用函数转为date类型,写到数据库里。卤主用了另外一种方法,用时过多差点吐血。mysql有函数str_to_date(),可帮助将字符串类型的数据转为date类型数据。

    但注意參数变化。

    date_string = "2015-07"
    name = "shifeng"
    values_tuple = (name, date_string)
    insert_sql = "insert into table_name (name_field, date_field) values(%s,str_to_date(%s, "%%Y-%%m"))"
    cur.execute(insert_sql, values_tuple)
    存sql见第三步,这里主要说明的是str_to_date函数。第一个參数为字符串,二个參数个日期的格式,注意格式。注意格式,注意格式(重要的事情要说三遍)。字符串是四位数的年龄加杠符号加两位数的月份。那么str_to_date函数第二个參数须要是百分号加Y加杠符号加百分号加m的字符串,假设字符串里的杠是逗号。那么第二个參数里面也相应的是逗号,另外,这里有两个百分号。是由于python须要转义,若是直接在mysql里面操作的时候直接:

    insert into table_name(name_field, date_field) values("shifeng", str_to_date("2015-07","%Y-%m"))
    就可以。


    五、终端操纵mysql

    首先下载mysql

    sudo apt-get install mysql-client

    其次。连上数据库

    mysql -h XX.XX.XX.XX -u user_name password database_name

    接下来可做一些操作如同在数据中命令的操作:

    show tables;
    select * from table_name;
    insert into table_name(name_field, date_field) values("shifeng", str_to_date("2015-07","%Y-%m"))
    delete from table_name;

    另外似乎能够json--->dataframe--->sql,用pandas.io.json相关的。卤主没有试过,以后有机会能够一试。

    參考:

    1.https://github.com/Yelp/dataset-examples

    2.http://www.yelp.com/dataset_challenge/

    3.http://stackoverflow.com/questions/21058935/python-json-loads-shows-valueerror-extra-data

  • 相关阅读:
    LeetCode> 989. 数组形式的整数加法
    Java> Java核心卷读书笔记
    npx是干嘛的
    typescript教程
    http Get 发送body数据
    59. 螺旋矩阵 II
    使用静态代理模式实现公用的报表导出功能
    win10更新后 sqlserver客户端连接一段时间后报错 CryptUnprotectData: Win32 错误:-2146893813 (Microsoft.SqlServer.RegSvrEnum)或该项不适用于在指定状态下使用
    Docker Compose-Window
    Docker的容器使用与连接-Window
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7072890.html
Copyright © 2011-2022 走看看