本文共 4098 字,大约阅读时间需要 13 分钟。
JSON建构于两种结构:
JSON在python中分别由list和dict组成。
json: 用于字符串和python数据类型间进行转换,提供了四个功能:dumps、dump、loads、load
json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型pickle:用于python特有的类型和python的数据类型间进行转换,提供了四个功能:dumps、dump、loads、load
pickle同理区别1:json是可以在不同语言之间交换数据的,而pickle只在python之间使用。
区别2: json只能序列化最基本的数据类型如(列表、字典、列表、字符串、数字、),但对于日期格式、类对象就不行了,而pickle可以序列化所有的数据类型,包括类,函数都可以序列化。
import jsontest_dict = { 'bigberg': [7600, { 1: [['iPhone', 6300], ['Bike', 800], ['shirt', 300]]}]}print(test_dict)print(type(test_dict))#dumps 将数据转换成字符串json_str = json.dumps(test_dict)print(json_str)print(type(json_str))#loads 将字符串转换成原有数据类型new_dict = json.loads(json_str)print(new_dict)print(type(new_dict))
data = [] #初始化#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常with open("arxiv-metadata-oai-snapshot.json", 'r') as f: for line in f: data.append(json.loads(line)) data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
使用python内置的open()函数,open(‘路径+文件名’, ‘打开模式’) ,第二个参数决定了打开文件的模式:只读r,写入w,追加a等。具体参数含义如下表所示:
模式 | 含义 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
(r/w/a)b | 以二进制的形式打开文件用于只读/写入/读写/追加/ |
(a/r/w/ab/wb/rb)+ | 不同指针位置的读写模式 |
with open('/path/to/file', 'r') as f: print(f.read())# 调用read()会一次性读取文件的全部内容,如果数据过大,内存会承受不了,可通过f.read(size)读取size个数据 for line in f.readlines():# 按行读取 print(line) #写入数据,注意写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。 #with语句会自动调用close方法with open('file', 'w') as f: f.write('Hello, world!')
unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])len(unique_categories)unique_categories
split() 返回列表,通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
str.split(str="", num=string.count(str)).
str = "Line1-abcdef \nLine2-abc \nLine4-abcd";print str.split( ); # 以空格为分隔符,包含 \nprint str.split(' ', 1 ); # 以空格为分隔符,分隔成两个
[‘Line1-abcdef’, ‘Line2-abc’, ‘Line4-abcd’]
[‘Line1-abcdef’, ‘\nLine2-abc \nLine4-abcd’]
#列表生成式:用来生成列表,在元列表的基础上生成一个新列表,可以让代码更简洁格式:[exp for var in iterable]exp:表达式var:变量iterable:可迭代对象执行过程:1,先遍历可迭代对象中的元素2,将此元素赋值给var3,将var的值作用到exp这个表达式上4,将表达式的结果生成一个新列表'''# range在python2中返回一个列表 python3中返回的是一个可迭代对象li=[i for i in range(1,11)] #两个变量i要一致print(li)l1=[1,2,3,4]l2=[i*i for i in l1]print(l1)print(l2) #[1, 2, 3, 4] #[1, 4, 9, 16]l1=[1,2,3,4]l2=[]for i in l1: l2.append(i*i)print(l1)print(l2)#生成一个2n+1的数字,n的取值范围是2-8# l4=[(2*i+1)for i in range(2,9)]l4=[2*i+1 for i in range(2,9)]print(l4)
格式二:[exp for var in iterable if 判断条件]1,遍历得到每一个元素2,将遍历得到的元素赋值给var3,将var的值作用到if语句上4,如果满足条件就将满足条件的值作用到exp表达式上5,将exp表达式的运算结果追加到新的列表#使用列表生成式l5=list(range(1,11))l6=[i for i in l5 if i%2==0]print(l6)
格式三:嵌套循环l10=["a",'b','c','d']l11=['f','j']l12=[]for i in l10: for j in l11: l12.append(i+j)print(l12)使用列表生成式:l10=["a",'b','c','d']l11=['f','j']l12=[i+j for i in l10 for j in l11]print(l12)
[‘af’, ‘aj’, ‘bf’, ‘bj’, ‘cf’, ‘cj’, ‘df’, ‘dj’]
格式四:有else语句时使用,注意这个判断条件都放for前面l14=['Abc','DEF',10]l15=[]for i in l14: if isinstance(i,str): l15.append(i.lower()) else: l15.append(i)print(l15)使用列表生成式,大写字母变小写,不是的不变l14=['Abc','DEF',10]l15=[i.lower() if isinstance(i,str) else i for i in l14 ]print(l15)
转载地址:http://yagwi.baihongyu.com/