JSON和CSV文件操作

目录

一 、open打开文件方式的参数设置总结

二、json文件储存

2.1 对象和数组

2.2 读取JSON

2.3 输出JSON

三、CSV文件储存

3.1 CSV文件写入

3.2 CSV文件读取


一 、open打开文件方式的参数设置总结

r : 以只读方式打开一个文件,意思是只能读取文件内容,而不能写入。这也是默认的方式

rb:以二进制只读文件打开一个文件,通常用于打开二进制文件,例如音频,图片,视频等。

r+: 以读写方式打开一个文件,既可以读文件,也可以写文件。

rb+: 以二进制读写方式打开一个文件,同样既可以读取文件,又可以写文件,只不过读取和写入的都是二进制文件。

w : 以写入方式打开一个文件,如果该文件已经存在,则将其覆盖,如果该文件不存在,则创建新文件。

wb: 以写入二进制方式打开一个文件,如果该文件已经存在,则将其覆盖,如果该文件不存在,则创建新文件。

a: 以追加方式打开一个文件,如果该文件以存在,则文件指针会放在文件结尾,也就是说,新的内容会被写到已有内容之后。如果该文件不存在,会创建新文件来写入。

ab:以追加二进制方式打开一个文件,如果该文件以存在,则文件指针会放在文件结尾,也就是说,新的内容会被写到已有内容之后。如果该文件不存在,会创建新文件来写入。

a+: 以读写方式打开一个文件,如果该文件已经存在,则文件指针将会放在文件末尾,文件打开时会是追加模式,如果该文件不存在,则创建新文件用于读写。

ab+: 以追加二进制,读写方式打开一个文件,如果该文件已经存在,则文件指针将会放在文件末尾,文件打开时会是追加模式,如果该文件不存在,则创建新文件用于读写。

二、json文件储存

2.1 对象和数组

对象在javaScript中是指用花括号{}包围起来的内容,是一种类似字典的键值对结构。

json获取对象的值有两种方式:

一种与字典类似,既在[]加入键值,比如:print(data['age']).

另一种是利用get方法传入键名,比如: print(data.get('age')),get方法还可以传入默认值,如果不存在该键名,还可以返回默认值,比如:data.get('age',25)

数组在javaScript中是用方括号[]括起来的内容,类似与列表的索引结构。

2.2 读取JSON

json.loads(): 将JSON文本字符转为JSON对象。

json.load():将JSON文件转化为JSON对象——json.load(open())

json.dumps(): 将JSON对象转为文本字符。

json.dump():将JSON对象转化文本字符输出到文件中——json.dump(data,open(),indent,ensure_ascii)

2.3 输出JSON

将JSON数据输出到文件当中,可以使用dumps方法将数据转化为文本字符。

例如:

with open('data.json','w',encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2))  #将json数组转化为文本字符,indent代表缩进两个字符
    
结果:
[
  {
    "name": "long",
    "gender": "male",
    "birthday": "1990-04-07"
  }
]

如果JSON对象或者数组中包含中文字符,例如:

import json

data = [
    {
        'name': '井边松鼠',
        'gender': '火星人',
        'birthday': '1990-04-07'
    }
]

with open('data.json','w',encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2))  #将json数组转化为文本字符,indent代表缩进两个字符
    
 结果:
[
  {
    "name": "\u4e95\u8fb9\u677e\u9f20",
    "gender": "\u706b\u661f\u4eba",
    "birthday": "1990-04-07"
  }
]

可以看到,文本中的中文字符全部都转化为了Unicode字符。如果想要输出中文,则可以指定参数ensure_ascii = False。

例如:

import json
​
data = [
    {
        'name': '井边松鼠',
        'gender': '火星人',
        'birthday': '1990-04-07'
    }
]
​
with open('data.json','w',encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2,ensure_ascii=False))  #将json数组转化为文本字符,indent代表缩进两个字符,ensure_ascii规定编码
    
结果:
[
  {
    "name": "井边松鼠",
    "gender": "火星人",
    "birthday": "1990-04-07"
  }
]

三、CSV文件储存

CSV,全称为Comma-Separated Values,中文叫做逗号分隔值或者字符分隔值,其文件以纯文本形式储存表格数据。CSV文件是一个字符序列,可以由任意数目的记录组成,各条记录以某种换行符分隔开。每条记录都由若干字段组成,字段间的分隔符是其他字符或字符串,最常用的是逗号或制表符。不过所有记录都由完全相同的字段序列,相当于一个结构化表的纯文本形式。它比Excel文件更加简洁,XLS文本是电子表格,包含文本、数值、公式和格式等内容,CSV中则不包含这些,就是以特定字符作为分隔符的纯文本,结构简单清晰。所以,有时候使用CSV来储存数字居是比较方便的。

3.1 CSV文件写入

import csv
​
with open('data.csv','w',) as csvfile:
    writer = csv.writer(csvfile,delimiter = ' ')
    writer.writerows([['id','name','age'],['10001','Mike',20],['10002','Bob',22],['10003','Jordan',21]])
    writer.writerow(['10004','Long',25])

CSV文件有两种方法,一个是写入单行,writerow(),传入一个列表;另一种是writerows(),写入多行,传入一个二维数组。

在调用写入文件之前,需要调用csv库的writer方法初始化写入对象,传入该句柄。参数有文件名,delimiter参数时每一列之间的间隔。

在爬虫过程中,爬取的都是结构化数据,一般会用字典表示这种数据。csv库也提供了字典的写入方式。

例如:

with open('data.csv','w',) as csvfile:
    fieldnames = ['id','name','age']
    writer = csv.DictWriter(csvfile,fieldnames=fieldnames,delimiter='\t')
    writer.writeheader()
    writer.writerow({'id':'10001','name':'Mike','age':21})
    writer.writerow({'id':'10002','name':'Bob','age':22})
    writer.writerow({'id':'10003','name':'Jordan','age':25})

使用fieldnames定义字段,然后传给DictWriter方法初始化一个字典,写入对象,并将对象赋给writer变量。

如果要写入中文内容,可能会遇到字符编码问题,此时需要给open方法添加字符编码方式,否则会出现unicode编码问题。

with open('data.csv','a',encoding='utf-8') as csvfile:
    fieldnames = ['id','name','age']
    writer = csv.DictWriter(csvfile,fieldnames=fieldnames,delimiter='\t')
    writer.writeheader()
    writer.writerow({'id':'10010','name':'小子','age':30})

除了给open添加字符编码方式,还可以使用pandas库将数据保存为CSV文件内,例如:

import pandas as pd
​
data = [
    {'id':'10001','name':'Mike','age':21},
    {'id':'10002','name':'Bob','age':22},
    {'id':'10003','name':'Jordan','age':25},
    {'id':'10010','name':'小子','age':30}
]
df = pd.DataFrame(data)
df.to_csv('data.csv',index=False)

将字典整合到一个列表内,然后使用pandas的DataFrame类新建一个DataFrame对象,参数传入data,然后调用df的to_csv方法也可以将数据保存为CSV文件。

3.2 CSV文件读取

使用reader方法读取CSV文件内容,例如:

import csv
​
with open('data.csv','r',encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)
结果:
['id', 'name', 'age']
['10001', 'Mike', '21']
['10002', 'Bob', '22']
['10003', 'Jordan', '25']
['10010', '小子', '30']

这样的方式将会以一个列表的形式打印CSV文件内容。

除了reader读取问价内容,还可以使用pandas库的read_csv方法将数据从CSV文中读取出来。

import pandas as pd
​
df = pd.read_csv('data.csv')
print(df)
​
结果:
      id    name  age
0  10001    Mike   21
1  10002     Bob   22
2  10003  Jordan   25
3  10010      小子   30

除此之外,也可以把数据转化为列表或者元组:

df = pd.read_csv('data.csv')
data = df.values.tolist()
print(data)

也可以逐行遍历:

df = pd.read_csv('data.csv')
for index, row in df.iterrows():
    print(row.tolist())

猜你喜欢

转载自blog.csdn.net/longhaierwd/article/details/131818472