python数据存储技巧
1.文本存储
比如我们现在有10篇文章,每篇文章由三部分组成,题目,作者,内容(title,author,content),然后要求这三个部分明确展示出来,并且每篇文章之间用=====分割。
大致思路:
针对每篇文章的三个部分,前两个部分归为一行,然后每篇文章之间用=====分割。
代码实现
items表示那10篇文章每一篇文章用item表示,则有,
for item in items: title=item[0] author=item[1] content=item[2] insertlist=[title,author,content] with open("1.text",'a',encoding='utf-8') as fs: fs.write('\n'.join(insertlist)) #构建列表,用join的分割符用\n fs.write('\n'+'='*60='\n')
2.Json的存储
千万要注意,json字符串需要用双引号
import json
with open('data.json','w','encoding='utf-8') as fs:
fs.write(json.dumps(data,indent=2,ensure_ascii=False))
其中indent,代表缩进字符个数,如果不加就没有json的层次感了,json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False。
3.CSV的存储
利用python第三方模块pandas,调用DataFrame对象的to_csv方法将数据保存到csv
import pandas as pd df=pd.DataFrame(字典字典类型的数据) df.to_csv('weiboi.csv', encoding='gb2312', index = False) #insert into csv
4.mysql-动态sql语句
传入一个动态变化的字典即可。
比如说一开始的时候我们有这样的一个表叫user,需要保存三个字段id,name,age然后我们可以构建下面的字典和表名
d={'id':'1001','name':'zhangsan','age':'17'}
tables='user'
d={'id':'1001','name':'zhangsan','age':'17'} tables='user' keys=','.join(d.key()) values=','.join(['%s']*len(d)) sql=f'INSERT INTO {table}({keys})VALUES({values})' try: if cursor.execute(sql,tuple(d.values())): print('ok') db.commit() except: print('no') db.rollback() db.close()
现在我们就完成了插入操作,但是有的时候我们需要 主键存在是更细,不存在时插入怎么办呢,首先我们看下面语句
INSERT INTO user(id,name,age) VALUES(%s,%s,%s) ON DUPLICATE KEY UPDATE id=%s,name=%s,age=%s
ON DUPLICATE KEY UPDATE 可以达到以下目的:
向数据库中插入一条记录:
若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。
否则插入一条新的记录。
然后我们对上面整体做一个代码整理。如下
d={'id':'1001','name':'zhangsan','age':'17'} tables = 'name' keys = ','.join(data_dic.keys()) values = ','.join(['%s'] * len(data_dic)) sql =f'INSERT INTO {tables}({keys})VALUES({values}) ON DUPLICATE KEY UPDATE ' update = ','.join([f"{k}={v}" for k,v in data_dic.items()]) sql += update try: if cursor.execute(sql,tuple(d.values())): print('ok') db.commit() except: print('no') db.rollback() db.close()
同样的如果你懂pandas,你可以这样
pd.io.sql.to_sql(datatosql, 'tablename', yconnect, schema='ptos', if_exists='append')