推薦收藏!這幾段祖?zhèn)鞯?Python 代碼拿來就用
今天分享幾段工作生活中常用的代碼,都是最為基礎(chǔ)的功能和操作,而且大多還都是出現(xiàn)頻率比較高的,很多都是可以拿來直接使用或者簡單修改就可以放到自己的項目當中。喜歡的記得收藏、關(guān)注、點贊。
廢話不多說,我們開始吧
日期生成
很多時候我們需要批量生成日期,方法有很多,這里分享兩段代碼
獲取過去 N 天的日期
import?datetimedef?get_nday_list(n):????before_n_days?=?[]
????for?i?in?range(1,?n?+?1)[::-1]:
????????before_n_days.append(str(datetime.date.today()?-?datetime.timedelta(days=i)))
????return?before_n_days
a?=?get_nday_list(30)
print(a)
Output:
['2021-12-23', '2021-12-24', '2021-12-25', '2021-12-26', '2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30', '2021-12-31', '2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08', '2022-01-09', '2022-01-10', '2022-01-11', '2022-01-12', '2022-01-13', '2022-01-14', '2022-01-15', '2022-01-16', '2022-01-17', '2022-01-18', '2022-01-19', '2022-01-20', '2022-01-21']
生成一段時間內(nèi)的日期
import?datetimedef?create_assist_date(datestart?=?None,dateend?=?None):????#?創(chuàng)建日期輔助表????if?datestart?is?None:
????????datestart?=?'2016-01-01'????if?dateend?is?None:
????????dateend?=?datetime.datetime.now().strftime('%Y-%m-%d')
????#?轉(zhuǎn)為日期格式????datestart=datetime.datetime.strptime(datestart,'%Y-%m-%d')
????dateend=datetime.datetime.strptime(dateend,'%Y-%m-%d')
????date_list?=?[]
????date_list.append(datestart.strftime('%Y-%m-%d'))
????while?datestart<dateend:
????????#?日期疊加一天????????datestart+=datetime.timedelta(days=+1)
????????#?日期轉(zhuǎn)字符串存入列表????????date_list.append(datestart.strftime('%Y-%m-%d'))
????return?date_list
d_list?=?create_assist_date(datestart='2021-12-27',?dateend='2021-12-30')
d_list
Output:
['2021-12-27', '2021-12-28', '2021-12-29', '2021-12-30']
保存數(shù)據(jù)到CSV
保存數(shù)據(jù)到 CSV 是太常見的操作了,分享一段我個人比較喜歡的寫法
def?save_data(data,?date):
????if?not?os.path.exists(r'2021_data_%s.csv'?%?date):
????????with?open("2021_data_%s.csv"?%?date,?"a+",?encoding='utf-8')?as?f:
????????????f.write("標題,熱度,時間,url\n")
????????????for?i?in?data:
????????????????title?=?i["title"]
????????????????extra?=?i["extra"]
????????????????time?=?i['time']
????????????????url?=?i["url"]
????????????????row?=?'{},{},{},{}'.format(title,extra,time,url)
????????????????f.write(row)
????????????????f.write('\n')
????else:
????????with?open("2021_data_%s.csv"?%?date,?"a+",?encoding='utf-8')?as?f:
????????????for?i?in?data:
????????????????title?=?i["title"]
????????????????extra?=?i["extra"]
????????????????time?=?i['time']
????????????????url?=?i["url"]
????????????????row?=?'{},{},{},{}'.format(title,extra,time,url)
????????????????f.write(row)
????????????????f.write('\n')
帶背景顏色的 Pyecharts
Pyecharts 作為 Echarts 的優(yōu)秀 Python 實現(xiàn),受到眾多開發(fā)者的青睞,用 Pyecharts 作圖時,使用一個舒服的背景也會給我們的圖表增色不少
以餅圖為例,通過添加 JavaScript 代碼來改變背景顏色
def?pie_rosetype(data)?->?Pie:????background_color_js?=?(
????"new?echarts.graphic.LinearGradient(0,?0,?0,?1,?"????"[{offset:?0,?color:?'#c86589'},?{offset:?1,?color:?'#06a7ff'}],?false)")
????c?=?(
????????Pie(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
????????.add(
????????????"",
????????????data,
????????????radius=["30%",?"75%"],
????????????center=["45%",?"50%"],
????????????rosetype="radius",
????????????label_opts=opts.LabelOpts(formatter=":?{c}"),
????????)
????????.set_global_opts(title_opts=opts.TitleOpts(title=""),
????????????????????????)
????)
????return?c
requests 庫調(diào)用
據(jù)統(tǒng)計,requests 庫是 Python 家族里被引用得最多的第三方庫,足見其江湖地位之高大!
發(fā)送 GET 請求
import?requests
headers?=?{
????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/96.0.4664.110?Safari/537.36',
??'cookie':?'some_cookie'}
response?=?requests.request("GET",?url,?headers=headers)
發(fā)送 POST 請求
import?requests
payload={}
files=[]
headers?=?{
????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/96.0.4664.110?Safari/537.36',
??'cookie':?'some_cookie'}
response?=?requests.request("POST",?url,?headers=headers,?data=payload,?files=files)
根據(jù)某些條件循環(huán)請求,比如根據(jù)生成的日期
def?get_data(mydate):????date_list?=?create_assist_date(mydate)
????url?=?"https://test.test"????files=[]
????headers?=?{
????????'user-agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/96.0.4664.110?Safari/537.36',
????????'cookie':?''????????}
????for?d?in?date_list:
????????payload={'p':?'10',
????????'day':?d,
????????'nodeid':?'1',
????????'t':?'itemsbydate',
????????'c':?'node'}
????????for?i?in?range(1,?100):
????????????payload['p']?=?str(i)
????????????print("get?data?of?%s?in?page?%s"?%?(d,?str(i)))
????????????response?=?requests.request("POST",?url,?headers=headers,?data=payload,?files=files)
????????????items?=?response.json()['data']['items']
????????????if?items:
????????????????save_data(items,?d)
????????????else:
????????????????break
Python 操作各種數(shù)據(jù)庫
操作 Redis
連接 Redis
import?redisdef?redis_conn_pool():????pool?=?redis.ConnectionPool(host='localhost',?port=6379,?decode_responses=True)
????rd?=?redis.Redis(connection_pool=pool)
????return?rd
寫入 Redis
from?redis_conn?import?redis_conn_pool
rd?=?redis_conn_pool()
rd.set('test_data',?'mytest')
操作 MongoDB
連接 MongoDB
from?pymongo?import?MongoClient
conn?=?MongoClient("mongodb://%s:%s@ipaddress:49974/mydb"?%?('username',?'password'))
db?=?conn.mydb
mongo_collection?=?db.mydata
批量插入數(shù)據(jù)
res?=?requests.get(url,?params=query).json()
commentList?=?res['data']['commentList']
mongo_collection.insert_many(commentList)
操作 MySQL
連接 MySQL
import?MySQLdb#?打開數(shù)據(jù)庫連接db?=?MySQLdb.connect("localhost",?"testuser",?"test123",?"TESTDB",?charset='utf8'?)#?使用cursor()方法獲取操作游標?cursor?=?db.cursor()
執(zhí)行 SQL 語句
#?使用?execute?方法執(zhí)行?SQL?語句cursor.execute("SELECT?VERSION()")#?使用?fetchone()?方法獲取一條數(shù)據(jù)data?=?cursor.fetchone()print?"Database?version?:?%s?"?%?data#?關(guān)閉數(shù)據(jù)庫連接db.close()
Output:
Database version : 5.0.45
本地文件整理
整理文件涉及需求的比較多,這里分享的是將本地多個 CSV 文件整合成一個文件
import?pandas?as?pdimport?os
df_list?=?[]for?i?in?os.listdir():
????if?"csv"?in?i:
????????day?=?i.split('.')[0].split('_')[-1]
????????df?=?pd.read_csv(i)
????????df['day']?=?day
????????df_list.append(df)
df?=?pd.concat(df_list,?axis=0)
df.to_csv("total.txt",?index=0)
多線程代碼
多線程也有很多實現(xiàn)方式,我們選擇自己最為熟悉順手的方式即可
import?threading
import?time
exitFlag?=?0class?myThread?(threading.Thread):????def?__init__(self,?threadID,?name,?delay):
????????threading.Thread.__init__(self)
????????self.threadID?=?threadID
????????self.name?=?name
????????self.delay?=?delay
????def?run(self):
????????print?("開始線程:"?+?self.name)
????????print_time(self.name,?self.delay,?5)
????????print?("退出線程:"?+?self.name)def?print_time(threadName,?delay,?counter):
????while?counter:????????if?exitFlag:????????????threadName.exit()
????????time.sleep(delay)
????????print?("%s:?%s"?%?(threadName,?time.ctime(time.time())))
????????counter?-=?1#?創(chuàng)建新線程thread1?=?myThread(1,?"Thread-1",?1)
thread2?=?myThread(2,?"Thread-2",?2)#?開啟新線程thread1.start()
thread2.start()
thread1.join()
thread2.join()
print?("退出主線程")
異步編程代碼
異步爬取網(wǎng)站
import?asyncioimport?aiohttpimport?aiofilesasync?def?get_html(session,?url):????try:
????????async?with?session.get(url=url,?timeout=8)?as?resp:
????????????if?not?resp.status?//?100?==?2:
????????????????print(resp.status)
????????????????print("爬取",?url,?"出現(xiàn)錯誤")
????????????else:
????????????????resp.encoding?=?'utf-8'????????????????text?=?await?resp.text()
????????????????return?text
????except?Exception?as?e:
????????print("出現(xiàn)錯誤",?e)
????????await?get_html(session,?url)
使用異步請求之后,對應(yīng)的文件保存也需要使用異步,即是一處異步,處處異步
async?def?download(title_list,?content_list):????async?with?aiofiles.open('{}.txt'.format(title_list[0]),?'a',
?????????????????????????????encoding='utf-8')?as?f:
????????await?f.write('{}'.format(str(content_list)))
以上就是我平時用得最多的代碼片段,希望對你有所幫助
好了,這就是今天分享的全部內(nèi)容,喜歡就點個贊吧