前两天读GitHub上的新冠肺炎的时间数据仓库的代码,他是将要写入的数据保存在他自己的mongodb的数据库里了,就想自己转一下json到csv,结果弄了半天没弄成,烦得要死,现在静下来,好好打一下这几个库模块的基础。
一、demjson库:(其实就相当于json模块的dumps和loads,其价值在于可以解析不规则的json数据)
endode:将python对象编码成json字符串
decode:将已编码的json字符串解码成python对象
解析不规则的json数据如:
# javascript中的对象
js_json = "{x:1, y:2, z:3}"
# python打印出来的字典
py_json1 = "{'x':1, 'y':2, 'z':3}"
二、csv库
这里有一个小点:在写入表格文件时(如xlsx或csv),写入‘,’为换一列,写入‘\n’为换一行(不过这里的返回值是什么鬼,还没仔细翻python文档)
**reader(csvfile, dialect=‘excel’, fmtparams)
csvfile,必须是支持迭代(Iterator)的对象,可以是文件(file)对象或者列表(list)对象,如果是文件对象,打开时需要加"b"标志参数。
import csv
with open('test.csv','rb') as myFile:
lines=csv.reader(myFile)
for line in lines:
print line
如上所述,输出时同一行的,用逗号隔开。
**writer(csvfile, dialect=‘excel’, fmtparams)
writerow()方法是一行一行写入,writerows方法是一次写入多行。
writerow()逗号分隔每一列,writerows()每个列表分割一行(字典样式的读写里面似乎并不支持witerows方法)
字典样式的读写
csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect=‘excel’, *args, **kwds)
csv.DictWriter(csvfile, fieldnames, restval=’’, extrasaction=‘raise’, dialect=‘excel’, *args, **kwds)
实例:
# 读
>>> import csv
>>> with open('names.csv') as csvfile:
... reader = csv.DictReader(csvfile)
... for row in reader:
... print(row['first_name'], row['last_name'])
...
Baked Beans
Lovely Spam
Wonderful Spam
# 写
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
三、pandas库详细的这个库的解析这里挂上一个博客的网址:
link有一些其他的更详细的方法,用到的时候可以去参考一下
创建一个数据通常使用两种方法,pd.Series和创建表格型数据pd.DataFrame
下面有两个实例:
s=pd.Series([1,2,3,np.nan,5,6])
print(s)#索引在左边 值在右边
'''
0 1.0
1 2.0
2 3.0
3 NaN
4 5.0
5 6.0
dtype: float64
'''
dates=pd.date_range('20180310',periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=['A','B','C','D'])#生成6行4列位置
print(df)#输出6行4列的表格
'''
A B C D
2018-03-10 -0.092889 -0.503172 0.692763 -1.261313
2018-03-11 -0.895628 -2.300249 -1.098069 0.468986
2018-03-12 0.084732 -1.275078 1.638007 -0.291145
2018-03-13 -0.561528 0.431088 0.430414 1.065939
2018-03-14 1.485434 -0.341404 0.267613 -1.493366
2018-03-15 -1.671474 0.110933 1.688264 -0.910599
'''
在选择数据集的方式上面类似于二维数组
主要有两种方法:
按照标签进行选择:
print(df.loc['20180312', ['A','B']])#按照行标签进行选择 精确选择
'''
A 0.499960
B 1.576897
Name: 2018-03-12 00:00:00, dtype: float64
'''
按照iloc行号进行选择:
print(df.iloc[3, 1])#输出第三行第一列的数据
#0.427336827399
print(df.iloc[3:5,0:2])#进行切片选择
'''
A B
2018-03-13 0.540385 0.427337
2018-03-14 0.191962 1.237843
'''
print(df.iloc[[1,2,4],[0,2]])#进行不连续筛选
'''
A C
2018-03-11 0.332656 0.382384
2018-03-12 0.499960 2.128730
2018-03-14 0.191962 1.903370
'''
对数据集里面的标签,另可根据判断筛选数据集里面的元素:
print(df[df.A > 0])#筛选出df.A大于0的元素 布尔条件筛选
'''
A B C D
2018-03-11 0.332656 -0.094633 0.382384 -0.914339
2018-03-12 0.499960 1.576897 2.128730 2.197465
2018-03-13 0.540385 0.427337 -0.591381 0.126503
2018-03-14 0.191962 1.237843 1.903370 2.155366
'''
另外对数据进行选择之后,如上所述iloc与loc选择,可同时进行修改:
print(df)
'''
A B C D
2018-03-10 0 1 2 3
2018-03-11 4 5 6 7
2018-03-12 8 9 1111 11
2018-03-13 12 13 14 15
2018-03-14 16 17 18 19
2018-03-15 20 21 22 23
'''
df.iloc[2,2] = 999#单点设置
df.loc['2018-03-13', 'D'] = 999
print(df)
'''
A B C D
2018-03-10 0 1 2 3
2018-03-11 0 5 6 7
2018-03-12 0 9 999 11
2018-03-13 0 13 14 999
2018-03-14 0 17 18 19
2018-03-15 0 21 22 23
'''
链接里面另有更详细的方法与叙述,这里不再赘述。