note:
数据文件一般放在方法外加载,才不会每使用一次方法就加载一次数据文件
sys
导入自定义模块
1.import sys
2.sys.path.append(path) ,导入自定义模块所在的目录
3.导入自定义模块。
os
判断文件是否存在
os.path.exists('')
连接文件夹和文件
os.path.join('','')
判断文件夹下的文件名
os.listdir('')
判断环境变量
os.environ['']
list
二维列表展开为一维
list_test =[[1,2],[3]]
[i for item in list_test for i in item]
其他方式可以参考
list转dict
a = ['a1','a2','a3','a4']
b = ['b1','b2','b3']
d = zip(a,b)
print(dict(d)) # {'a1': 'b1', 'a2': 'b2', 'a3': 'b3'}
sort
排序,选择sorted或者 list.sort()进行排序
内置sorted返回一个新的列表,而list.sort是对列表进行操作
sorted(iterable, cmp=None, key=None, reverse=False)
iterable:是可迭代类型
cmp:用于比较的函数,比较什么由key决定;
key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。
用sorted()排序的关键在于实现一个映射函数。
sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
根据列表中列表排序
sorted(items_list, key=lambda item: item[1], reverse=True)
这样,我们给sorted传入key函数,即可实现忽略大小写的排序:
sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
[‘about’, ‘bob’, ‘Credit’, ‘Zoo’]
要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True
根据字符串长度排序
myList = ['青海省','内蒙古自治区','西藏自治区','新疆维吾尔自治区','广西壮族自治区']
myList1 = sorted(myList,key = lambda i:len(i),reverse=True)
返回列表和数组的最大最小值的索引
list1 = [1,2,3,2,1]
print(list1.index(max(a)))
#array
arr1 = np.array([1,2,3,4])
np.max(arr1)
np.argmax(arr1)
np.where(a==np.max(arr))
filter
python filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
语法:filter(function, iterable)
lambda表达式
func=lambda x:x+2
#以上lambda等同于以下函数
def func(x):
return(x+2)
作为一个表达式,定义了一个匿名函数。上例中代码x为函数入口参数,x+2为函数体。用lambda写法,简化了函数定义的书写形式,使代码更为简洁。
在Python中,还有几个定义好的全局函数:filter()、map()、reduce()。这些全局函数可以和lambda配合使用。
需求
需要将txt数据中的蒙文,短语,过滤掉,取出数据分为>510,和<=510(bert能处理的一段文本最长512,去掉开始和结束的表示符,就只剩下510长度)的字符,然后处理成json
问题:在文本编辑器蒙文看不见,一开始以为是空格,却发现无法替换掉,数据读入到python是\ue3ab这种样子,经过询问得知是蒙文。
开始的解决方案A:想用正则匹配这种样子的字符,满足匹配就删除
A失败原因:在python把它处理成格式而不是字符串。
解决方案B:判断第一个字符是否是中文,不是就过滤掉,用到了filter函数,它不会改变数据本身,只会过滤掉返回为false的列表的值,另外还需要将读入的列表中的一些字符替换为空格。方法如下:
1.列表替换成空格
#list = [line.strip('\n') for line in f.readlines()]#读入文本不要换行符
list=f.read().splitlines()
strs = '\n'.join(list)#将列表变成字符串
strs = strs.replace('\t','')
list = strs.split('\n')
或者
list=[line.strip('\n').replace('\t','') for line in f.readlines()]
#列表生产:list(x for x in [1,2,3,4,5,6,7,8,9,10] if x%2==1),比lambda的方式更容易理解
2.filter过滤第一个字符串不是中文
import re
def get_filter(s):
#re.match(pattern, string, flags=0)
if(len(s)<3):#去查较短的语句
s=''
if(re.match('[\u4e00-\u9fa5]+',s[0]):
pass
else:
s=''
return len(s)>0 #返回true or false 空字符串默认是false
list = filter(get_filter,list)
3.过滤分别处理字数《501,》510
list(filter(lambda s:len(s)>510,list)
替换特殊符号\n
replace(’\n’,’’).replace(’\t’,’’)
处理json
有s处理字符,无s处理文件
import json
#写入到json
f=open(path,'w',encoding='utf-8')
json.dump(data,f,encure_ascii=False)#encure_ascii=False文本显示为中文
#f.write(json.dumps(data,ensure_ascii=False,indent=3))#indent参数保持输出格式
#读取json
with open(path,'r',encodign='utf-8') as fp:
data=json.load(fp)
#result=json.loads(f.readline())
#pd.read_json(f.read()) pandas库读取json
处理xlsx文件
读:
1.如果报错可能是版本低了,则添加参数engine=‘openpyxl’
2.如果单元格为空,会返回NaN,如果不想返回NaN,添加参数keep_default_na=False
3.使用dataFrame某列可以用data.iloc[5,1]
将返回五行一列
也可以用xlrd包处理,
import pandas as pd
if __name__=='__main__':
path = r'G:\数据分析\excel技巧\表.xlsx'
data = pd.read_excel(path)#dataframe类型
a = xlrd.open_workbook(filename)
b=a.sheet_by_name('Sheet1')
写:
1.dataframe类型使用to_excel方法
2.如果2dataframe都要写入一个文件,使用data_df = pd.concat([df1,df2],axis=1)
,2个dataframe将在y轴上拼接
3.list转dataframe使用pd.DataFrame(data_list,columns=[列名])
4.也可使用xlwt包处理
data_df.to_excel(path,index=False)#一般列索引不写入到excel
字符串变成列表用split(),反之用join()
word_list.split(',')
','.join(str(i) for i in word
字典
1.获取字典的键,值 data_dict.keys(),data_dict.values()
2.循环字典
for key,val in data_dict.items():
pass
数据有多个键值对
data={'a':'b',1:2,False:True}
for x in data:
print(x,data[x])
3.两个列表转为字典,dict(zip(a,b)) , 列表a和b的长度应相同
条件分支
if
if(): elif(): else:
if 条件:
A
else:
B
可简写
条件 if A else B
循环
for i in range(10):
pass
for a,b in enumerate(items):
pass #a是当前循环次数
for item in enumerate(items):
pass
全局变量
需要使用import glob引入包
函数
利用apply可以去掉循环
data.apply(函数方法,axis=1) ,axis默认为0
def deal_data(data):
name=data.列名1
name2=data.列名2
print(name,name2)
data_df.apply(deal_data,axis=1)
数据库
- 注意捕获异常,
2.可以先查出表的列名
import pymysql
import random
#引入sys模块
import sys
col = 'article_id,article_title,article_createtime,article_content'
str_list = [('1','散文','2020','a'),
('2','小说','2018','b'),
('3','戏剧','2011','c'),
('4','戏剧','2011','d'),
('5','戏剧','2011','e'),
('6','冒险','2000','f')]
col_list = col.split(',')
# 打开数据库连接
db = pymysql.connect("localhost","root","root","blog")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
#单数据插入
for strs in str_list:
json_str="{"
col_len = len(col_list)
#print('col_len',col_len)
for i in range(col_len):
json_str+="'"+str(col_list[i])+"':'"+str(strs[i])+"',"
json_str=json_str[:-1]
json_str+="}"
json_str='"' + json_str + '"'
try:
# 执行sql语句
sql = "INSERT INTO article2\
(article_id, article_title, article_createtime, article_content, json_str)\
VALUES (%s,%s,%s,%s,%s)"\
% (1,"'测试数据'","'2020'","'test'",json_str)
print(sql)
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
#输出异常信息
info = sys.exc_info()
print( info[0], ":", info[1])
# 如果发生异常,则回滚
db.rollback()
# 关闭数据库连接
db.close()