JSON字符串处理:
什么是JSON字符串:
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。更多解释请见:https://baike.baidu.com/item/JSON/2462549?fr=aladdin
JSON支持数据格式:
对象(字典):使用花括号。
数组(列表):使用方括号。
字符串类型:字符串必须要用双引号,不能用单引号)。
整形、浮点型、布尔类型还有null类型。
多个数据之间使用逗号分开。
注意:json本质上就是一个字符串。
将Python对象dump成JSON字符串:
- dumps:把Python对象转换成JSON格式的字符串。
- dump:把Python对象转换成JSON格式的字符串,并且还可以接收一个文件指针fp参数,可以写入到文件中。
这两个方法都有一个ensure_ascii
参数,默认情况下这个参数的值是True,也就是说转换后的JSON字符串是只能存储ascii格式的,不能存储中文,如果想要存储成中文,那么可以将他设置为False。
示例:
import json
books = [
{
'姓名':'张三',
'年龄':'24'
},
{
'姓名': '李四',
'年龄': '21'
}
]
#dumps函数:把Python对象转换成JSON格式的字符串。
result = json.dumps(books)
print(result) #打印出的内容为Unicode编码,怎么显示中文?添加参数:ensure_ascii=False即可,如下:
result = json.dumps(books,ensure_ascii=False)
print(result)
#dump函数:把Python对象转换成JSON格式的字符串,并且还可以接收一个文件指针fp参数,可以写入到文件中。
fp = open('存储文档.json','w',encoding='utf-8-sig') #先创建要存储数据的文档
json.dump(books,fp,ensure_ascii=False) #把python对象books转换为JSON字符串,并存储进fp文档中。
fp.close() #open后要close
将JSON字符串load成Python对象:
- loads:将JSON字符串转换成Python对象。
- load:将JSON字符串转换成Python对象,并且是直接从文件中获取JSON字符串。
示例:
import json
#将json字符串转换为python对象
json_str = '[{"姓名": "张三", "年龄": "24"}, {"姓名": "李四", "年龄": "21"}]'
result = json.loads(json_str,encoding='utf-8')
print(result)
#将json字符串的文件转换为python对象
with open('存储文档.json','r',encoding='utf-8') as fp:
result = json.load(fp)
print(result)
CSV文件处理:
CSV文件读取的两种方式:
示例:
- csv.reader(‘文件名’,‘r’)的方式读取到的是一组列表,通过下表的方式可以获取到某一列的内容。
- csv.DictReader(‘文件名’,‘r’)的方式读取到的是一组字典,通过字典中某一key值可以获取到该列的内容。
import csv
# 这种方式读取到的每一条数据是一个列表,所以需要通过下标的方式获取具体某一个值
# with open("stock.csv",'r',encoding='gbk') as fp:
# reader = csv.reader(fp)
# for x in reader:
# print(x[3])
# 这种方式读取到的每一条数据是一个字典,所以可以通过列名获取数据
with open("stock.csv",'r',encoding='gbk') as fp:
reader = csv.DictReader(fp)
for x in reader:
print(x['secShortName'])
CSV文件的写入的两种方式:
import csv
# header = ['姓名','年龄','班级']
# students = [
# ['张三','20','计科2001'],
# ['李四','21','体育1901'],
# ['王五','22','教育1801']
# ]
#
# with open('students.csv','w',encoding='utf-8',newline='') as fp:
# writer = csv.writer(fp)
# writer.writerow(header)
# writer.writerows(students)
header = ['姓名','年龄','班级']
students = [
{'姓名':'张三','年龄':'20','班级':'计科2001'},
{'姓名':'李四','年龄':'21','班级':'体育1901'},
{'姓名':'王五','年龄':'22','班级':'教育1801'}
]
with open('students.csv','w',encoding='utf-8',newline='') as fp:
writer = csv.DictWriter(fp,header)
# 虽然DictWriter创建的时候有一个headers,但是想要写入数据进去,还是需要调用writer.writeheader()方法,否则,表头数据写入不进去
writer.writeheader()
writer.writerows(students)
Excel文件处理:
Sheet相关的操作:
打开Excel文件:
xlrd.open_workbook(“abc.xls”)
获取Sheet:
一个Excel中可能有多个Sheet,那么可以通过以下方法来获取想要的Sheet信息:
- sheet_names:获取所有的sheet的名字。
- sheet_by_index:根据索引获取sheet对象。
- sheet_by_name:根据名字获取sheet对象。
- sheets:获取所有的sheet对象。
- sheet.nrows:这个sheet中的行数。
- sheet.ncols:这个sheet中的列数。
workbook = xlrd.open_workbook("成绩表.xlsx")
# 获取所有的sheet名字
# print(workbook.sheet_names())
# 根据索引获取指定的sheet对象
# sheet = workbook.sheet_by_index(1)
# print(sheet.name)
# 根据名称获取指定的sheet对象
# sheet = workbook.sheet_by_name("2班")
# print(sheet.name)
# 获取所有的sheet对象
# sheets = workbook.sheets()
# for sheet in sheets:
# print(sheet.name)
# 获取指定sheet的行数和列数
sheet = workbook.sheet_by_index(0)
print({"rows":sheet.nrows,"cols":sheet.ncols})
Cell相关的操作:
获取Cell及其属性:
每个Cell代表的是表格中的一格。以下方法可以方便获取想要的cell:
- sheet.cell(row,col):获取指定行和列的cell对象。
- sheet.row_slice(row,start_col,end_col):获取指定行的某几列的cell对象。
- sheet.col_slice(col,start_row,end_row):获取指定列的某几行的cell对象。
- sheet.cell_value(row,col):获取指定行和列的值。
- sheet.row_values(row,start_col,end_col):获取指定行的某几列的值。
- sheet.col_values(col,start_row,end_row):获取指定列的某几行的值。
import xlrd,xlwt
workbook = xlrd.open_workbook('成绩表.xlsx')
sheet = workbook.sheet_by_index(0)
cell = sheet.cell(1,1)
print(cell.value)
cells = sheet.row_slice(1,1,4)
for cell in cells:
print(cell.value)
cells = sheet.col_slice(0,1,sheet.nrows)
for cell in cells:
print(cell.value)
cell_value = sheet.cell_value(0,1)
print(cell_value)
cell_values = sheet.row_values(1,0,4)
print(cell_values)
cell_values = sheet.col_values(1,0,sheet.nrows)
print(cell_values)
cell中常用的数据类型:
- xlrd.XL_CELL_TEXT(Text):文本类型。
- xlrd.XL_CELL_NUMBER(Number):数值类型。
- xlrd.XL_CELL_DATE(Date):日期时间类型。
- xlrd.XL_CELL_BOOLEAN(Bool):布尔类型。
- xlrd.XL_CELL_EMPTY:空白数据类型。
写入Excel
写入Excel步骤如下:
- 导入xlwt模块。
- 创建一个Workbook对象。
- 创建一个Sheet对象。
- 把数据写入到Sheet下指定行和列中。如果想要在原来workbook对象上添加新的cell,那么需要调用put_cell来添加。
- 保存成Excel文件
在这里插入代码片
示例:
import xlrd,xlwt
workbook = xlwt.Workbook() #创建工作簿
sheet = workbook.add_sheet('sheet1') #创建工作表并命名
headers = ['姓名','语文','数学','英语'] #制定行表头
for index,header in enumerate(headers): #写入行表头
sheet.write(0,index,header)
names = ['王二麻子','张三','李四','赵大锤子'] #制定列表头
for index,name in enumerate(names): #写入列表头
sheet.write(index+1,0,name)
yuwen = ['21','31','41','51'] #制定内容
shuxue = ['22','32','42','52']
yingyu = ['23','33','43','53']
for index,yw in enumerate(yuwen): #写入内容。用index+enumerate()的方法,可以在遍历列表的同时,输出索引号。
sheet.write(index+1,1,yw) #因index的索引号从0开始,顾此处在B列写入语文成绩时,row=index+1。
for index,sx in enumerate(shuxue):
sheet.write(index+1,2,sx)
for index,yy in enumerate(yingyu):
sheet.write(index + 1, 3, yy)
workbook.save('自制成绩表.xls')
编辑Excel文件:
- 读取原来的Excel文件
- 在读取的Excel文件上面进行cell编辑,可以使用sheet.put_cell(row,col,ctype,value,None)方法进行编辑
- 新建一个新的Excel文件,并将编辑后的数据保存到新文件中。
注意:不能在原Excel中编辑后保存,故需要新建Excel文件。
示例:
import xlrd,xlwt
rwd= xlrd.open_workbook('成绩表.xlsx')
rsheet = rwd.sheet_by_index(0)
#求每个学生的总分
rsheet.put_cell(0,4,xlrd.XL_CELL_TEXT,'总分',None)
nrows = rsheet.nrows
for row in range(1,nrows):
grades = rsheet.row_values(row,1,4)
total = sum(grades)
rsheet.put_cell(row,4,xlrd.XL_CELL_NUMBER,total,None)
#求每门课的平均分
nrows = rsheet.nrows
ncols = rsheet.ncols
rsheet.put_cell(nrows,0,xlrd.XL_CELL_TEXT,'平均分',None)
for col in range(1,ncols):
grades = rsheet.col_values(col,1,nrows)
average = sum(grades)/len(grades)
rsheet.put_cell(nrows,col,xlrd.XL_CELL_NUMBER,average,None)
#将上述编辑好的内容保存在新的workbook中
wwb = xlwt.Workbook()
wsheet = wwb.add_sheet('sheet1')
nrows = rsheet.nrows
ncols = rsheet.ncols
for row in range(0,nrows):
for col in range(0,ncols):
wsheet.write(row,col,rsheet.cell_value(row,col))
wwb.save('abc.xls')