一、csv文件的操作
csv为纯文本表格存储中的一种
在txt文件中的写法为,以半角逗号为分隔符来分隔数据,写法如下:
id, name, sex(半角逗号为英文输入法的逗号)
1、csv文件的的读取
文件展示:
程序和运行结果:
import csv
csvfile = open('E:\Python\数据预处理\文件\csv_test1.csv', 'r') #以可读形式打开csv文件
eader = csv.reader(csvfile) #返回一个reader对象,它将迭代给定csvfile中的行
for row in eader: #遍历迭代器,输出值
print(row)
csvfile.close() #关闭文件
2、csv文件的写入
write、writerow、writerows的区别
- write():将一个字符串中的字符以逗号为分隔符写入,并且无法自动换行
import csv
"""使用write写入"""
csvfile = open('D:\程序\Python\数据预处理文件\csv_test.csv', 'w') #以可写形式打开
datalist = [['学号, 姓名, 性别, 年龄'], ['1, 小明, 男, 18']] #创建二维数组
count = 0 #计数器
for i in range(len(datalist)): #使用循环遍历来写入值
csvfile.write(datalist[i][count] + '\n')
csvfile.close()
- writerow():将一个列表全部写入csv的同一行
import csv
"""使用writerow写入"""
csvfile = open('D:\程序\Python\数据预处理文件\csv_test.csv', 'w', newline='') #以可写形式打开
datalist = [["学号", "姓名", "性别", "年龄"], ["1", "小明", "男", "18"]] #创建二维数组
csv_writer = csv.writer(csvfile)
for i in datalist: #使用循环遍历来写入值
csv_writer.writerow(i)
csvfile.close()
- writerows():将一个二维列表中的每一个列表写为一行
import csv
"""使用writerows写入"""
csvfile = open('D:\程序\Python\数据预处理文件\csv_test.csv', 'w', newline='') #以可写形式打开
datalist = [["学号", "姓名", "性别", "年龄"], ["1", "小明", "男", "18"]] #创建二维数组
csv_writer = csv.writer(csvfile)
csv_writer.writerows(datalist)
csvfile.close()
二、json文件的操作
在txt文件中以字典形式来存放,如:
{“姓名”:“小明”, “年龄”:18}
1、json文件的读取
load:对文件对象进行操作
loads:将已编码的 JSON 字符串解码为 Python 对象
文件展示:
程序与运行结果
- load单行读取
import json
"""load单行文件的读取"""
json_data = open('D:\程序\Python\数据预处理文件\json_data.json', 'r') #读取文件对象
print(json_data)
data = json.load(json_data) #load直接读取文件对象
print(data)
for key in data.keys(): #遍历键值对 keys()函数返回所有键
print("key:{key}, value:{value}".format(key=key, value=data.get(key))) #format初始化字符串 get()返回键对应的值
json_data.close() #关闭文件
- loads单行读取
import json
"""loads单行文件的读取"""
json_data = open('D:\程序\Python\数据预处理文件\json_data.json').read() #直接读取文件中的内容
print(json_data)
data = json.loads(json_data) #loads将已编码的JSON字符串解码为Python对象
print(data)
for key in data.keys(): #遍历键值对 keys()函数返回所有键
print("key:{key}, value:{value}".format(key=key, value=data.get(key))) #format初始化字符串 get()返回键对应的值
- 多行读取
import json
"""多行文件的读取"""
json_data = open('D:\程序\Python\数据预处理文件\json_data.json', 'r') #读取文件对象
print(json_data)
for line in json_data.readlines(): #按行读取文件
line = line.strip() #删除空白字符 避免读取空行
if len(line) != 0:
data = json.loads(line) #loads将已编码的JSON字符串解码为Python对象
for key in data.keys(): #遍历键值对 keys()函数返回所有键
print("key:{key} value:{value}".format(key=key, value=data.get(key))) #format初始化字符串 get()返回键对应的值
print("——"*10)
json_data.close() #关闭文件
2、json文件的写入
dump:将Python对象按照JSON格式序列化到文件中
dumps:将Python对象处理成JSON格式的字符串
- dump写入
import json
"""dump写入文件"""
with open('D:\程序\Python\数据预处理文件\json_test.json', 'w', encoding='utf-8') as f:
data = [{"姓名":"小明", "年龄":18}, {"姓名":"小红", "年龄":19}]
json.dump(data, f, indent=2, ensure_ascii=False) #dump序列化时对中文默认使用ASCII码值
f.close()
- dumps写入
import json
"""dumps写入文件"""
with open('D:\程序\Python\数据预处理文件\json_test.json', 'w', encoding='utf-8') as f:
data = [{"姓名":"小明", "年龄":18}, {"姓名":"小红", "年龄":19}]
json_data = json.dumps(data, indent=2, ensure_ascii=False)
print(json_data)
f.write(json_data)
f.close()
三、xml文件的操作
xml是一种可扩展的标记语言,与html有些相似, 格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人类 -->
<people>
<object>
<single mouth="5"/>
<name report="yes">libero</name>
<age year="1998">22</age>
<sex>男</sex>
</object>
<object>
<single mouth="5"/>
<name report="yes">rock</name>
<age year="1980">40</age>
<sex>男</sex>
</object>
</people>
<?xml version="1.0" encoding="UTF-8"?>是xml的头文件,与c语言中的头文件#include<stdio.h>,html头文件类似
是xml文件格式中的注释
则是一个根标签。 一个XML的文件是一种标签的树状结构,所以根标签只有一个,但是可以有很多子标签,当子标签没有孩子标签的时候就要给与值 写在标签的中间
注意标签一般都是成对出现的,当然也有不成对的 如 它加属性 写成
成对子标签的属性 就libero这种形式
文件展示:
<?xml version="1.0" encoding="utf-8"?>
<list>
<student id="stu1" name="stu">
<id>1001</id>
<name>小明</name>
<age>22</age>
<gender>男</gender>
</student>
<student id="stu2" name="stu">
<id>1002</id>
<name>小红</name>
<age>21</age>
<gender>女</gender>
</student>
</list>
1、xml文件的读取
import xml.etree.ElementTree as ET
tree = ET.parse(r"D:\程序\Python\数据预处理文件\xml_data.xml")
root = tree.getroot() #获取根节点
#标签名
print('root:', root) #输出根节点
print('root_tag:', root.tag) #输出数据种类
print("——"*10)
for stu in root:
#属性值
print(stu)
print("stu_name:", stu.attrib["name"]) #抓取该标签的数组
#标签中内容
print("id:", stu[0].text) #访问标签内容
print("name:", stu[1].text)
print("age:", stu[2].text)
print("gender:", stu[3].text)
print("——"*10)
2、xml文件的写入
import xml.etree.ElementTree as ET
"""按格式写入"""
def indent(elem, level=0):
i = "\n" + level*"\t"
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + "\t"
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
data = {"学号":"1", "姓名":"小明", "性别":"男"}
root = ET.Element('list') # 创建节点
tree = ET.ElementTree(root) # 创建文档
element = ET.Element('学生')
element.set('班级', "大数据一班")
for key in data.keys(): #遍历键值对 keys()函数返回所有键
element1 = ET.Element(key)
element1.text = data.get(key)
element.append(element1)
root.append(element)
indent(root)
tree.write(r"D:\程序\Python\数据预处理文件\xml_test.xml", encoding='UTF-8', xml_declaration=True)
四、excel文件的操作
xlrd: 对excel进行读相关操作
xlwt: 对excel进行写相关操作
xlutils: 对excel读写操作的整合
注意:这三个库只能对xls文件进行操作
1、excel文件读取
import xlrd
"""读取数据"""
data = xlrd.open_workbook(r'D:\程序\Python\数据预处理文件\xls_data.xls') # 打开xls文件
table = data.sheets()[0] # 打开第一张表
print(table.cell(2,1)) # 获取指定行列的数据类型和数据
nrows = table.nrows # 获取表的行数
for i in range (nrows): # 循环逐行打印
if i == 0 : # 跳过第一行
continue
print(table.row_values(i)[:10]) # 取前十列
2、excel文件的写入
import xlwt
"""写入数据"""
data = [["姓名", "性别", "年龄"], ["小明", "男", 18], ["小红", "女", 19]]
workbook = xlwt.Workbook(encoding='utf-8') #定义字符编码
worksheet = workbook.add_sheet('MyWorksheet') #定义表格名称
for i in range(0, len(data)): #使用for循环遍历二维数组来实现写入数据
for j in range(0, len(data[i])):
worksheet.write(i, j, data[i][j])
workbook.save(r'D:\程序\Python\数据预处理文件\xls_test.xls') #保存
3、xrld、xlwt、xlutils的区别
五、PDF文件的操作
六、文件操作
1、csv转json文件
文件展示:
程序和运行结果:
import csv
import json
"csv转json"
csvfile = open("D:\程序\Python\数据预处理文件\csv_data.csv")
data = csv.reader(csvfile)
list = []
for i in data:
list.append(i)
csvfile.close()
data = {}
jsonfile = open("D:\程序\Python\数据预处理文件\csv_json_test.json", "w", encoding="utf-8")
i, j = 0, 1
for i in range(len(list)):
if i == 0:
continue
for j in range(len(list[i])):
data[list[0][j]] = list[i][j]
json.dump(data, jsonfile, indent=2, ensure_ascii=False)
jsonfile.close()
2、将两个csv文件合并成一个
文件展示:
程序和运行结果:
import csv
import json
"""合并csv文件"""
csvfile1 = open('D:\程序\Python\数据预处理文件\csv_combine1.csv', 'r')
data1 = csv.reader(csvfile1) #将读取文件输出为一行一行列表
csvfile2 = open('D:\程序\Python\数据预处理文件\csv_combine2.csv', 'r')
data2 = csv.reader(csvfile2)
list1 = []
list2 = []
for i in data1:
list1.append(i)
for j in data2:
list2.append(j)
count = 0
f = open('D:\程序\Python\数据预处理文件\csv_combine.csv', 'w', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
while count < len(list1):
list1[count].extend(list2[count])
csv_writer.writerow(list1[count])
count += 1
f.close()
3、将一个csv文件拆分成多个csv文件
文件展示:
程序和运行结果:
import csv
import json
"""拆分csv文件"""
csvfile = open('D:\程序\Python\数据预处理文件\csv_split.csv', 'r')
data = csv.reader(csvfile) #将读取文件输出为一行一行列表
list = []
list1 = []
for i in data:
list.append(i)
csvfile.close()
num = 0
count = 1
count1 = 1
namecount = 1
while list:
if count > 7:
break
else:
if len(list1) == 0:
list1.append(list[num]) #写入每列的字段
elif 0 < len(list1) < 3: #判断文件是否达到要求行数
list1.append(list[count1])
count1 += 1 #数组下标
count += 1 #行数
elif len(list1) == 3:
"""生成文件名称"""
dataname = "D:\程序\Python\数据预处理文件\拆分文件"+ "/" + "csv_split" + str(namecount) + ".csv"
f = open(dataname, 'w', encoding='utf-8', newline='') #以写的形式打开文件
csv_writer = csv.writer(f)
for j in list1:
csv_writer.writerow(j) #按行写入
list1 = [] #清空列表
namecount += 1 #文件名
f.close() #关闭文件
七、算法
1、mad算法
import numpy as np
"""mad算法"""
def MAD(dataset, n):
rdataset = []
wdataset = []
median = np.median(dataset) #中位数
print(median)
deviations = abs(dataset-median) #原数据-中位数
print(deviations)
mad = np.median(deviations) #离群值的中位数
print(mad)
print(len(dataset))
for i in range(len(dataset)):
if dataset[i] > median + n*mad:
wdataset.append(dataset[i])
elif dataset[i] < median - n*mad:
wdataset.append(dataset[i])
elif median - n*mad <= dataset[i] <= median + n*mad:
rdataset.append(dataset[i])
return rdataset
print(MAD([1, 2, 3, 4, 5, 900, 80], 1))
2、3σ算法
import numpy as np
"""3σ算法"""
def three_sigma(dataset, n=3):
rdataset = []
wdataset = []
mean = np.mean(dataset) #均值
print(mean)
sigma = np.std(dataset) #标准差
print(sigma)
for i in range(len(dataset)):
if mean - n*sigma < dataset[i] < mean + n*sigma:
rdataset.append(dataset[i])
elif mean - n*sigma > dataset[i] or mean + n*sigma < dataset[i]:
wdataset.append(dataset[i])
return rdataset
print(three_sigma([1, 2, 3, 4, 5, 900, 80, 10.2131231]))
3、百分位算法
"""百分位法"""
def percent_range(dataset, min= 0.20, max= 0.80):
rdataset = []
wdataset = []
print(sorted(dataset, reverse=True))
range_max = np.percentile(dataset, max * 100)
print(range_max)
range_min = np.percentile(sorted(dataset, reverse=True), min * 100)
print(range_min)
# 剔除前20%和后80%的数据
for value in dataset:
if value < range_max and value > range_min:
rdataset.append(value)
return rdataset
print(percent_range([1, 2, 3, 4, 5, 6, 7, 8]))