python提高(list,json,xlsx处理和高级函数filter,sort和os,sys模块)

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]

其他方式可以参考https://blog.csdn.net/Yolandera/article/details/82847022
在这里插入图片描述

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)

数据库

  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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值