一、相对路径
import os
from pathlib import Path
# 当前文件所在路径的上级路径
base_dir = Path(__file__).resolve().parent.parent
print(base_dir) # D:\coding\spider\lutou
# 获取当前文件所在的路径
print(os.getcwd()) # D:\coding\spider\lutou\utils
# 获取当前文件的绝对路径
print(os.path.abspath(__file__)) # D:\coding\spider\lutou\utils\save.py
二、正则表达式去除特殊字符()
s = '*\/:?"<>|' # 这9个字符在Windows系统下是不可以出现在文件名中的
str = '路透社:科普: “以身试毒”检验新冠疫苗效果可行吗'
aa = re.findall(r'[^\*"/:?\\|<>]', str, re.S) # re.S 使 . 匹配包括换行在内的所有字符
aa = "".join(aa)
print(aa) # 路透社:科普 “以身试毒”检验新冠疫苗效果可行吗
三、 获取到单个字典的键(Key)和值(Value)
# 方法一
d = {'name': '张三'}
(key, value), = d.items()
print(key) # name
print(value) # 张三
# 方法二
d = {'name': '李四'}
key = list(d)[0]
value = list(d.values())[0]
print(key, value) # name 李四
# 方法三
d = {'name': '王五'}
key, = d
value, = d.values()
print(key, value) # name 王五
四、windows文件命名
正则去除不可作为文件命名的特殊字符,并写入csv文件
import re
import os
import csv
from pathlib import Path
str1 = 'asdfgh_*???<>'
# 正则去除不可作为文件名的特殊字符
title = re.findall(r'[^\*"/:?\\|<>]', str1, re.S)
title = "".join(title)
print(title) # asdfgh_
# 当前文件所在路径
base_dir = Path(__file__).resolve().parent
print(base_dir, type(base_dir)) # D:\coding\test_project <class 'pathlib.WindowsPath'>
filename = os.path.join(str(base_dir), '%s.csv' % title)
print(filename) # D:\coding\test_project\asdfgh_.csv
content = [1,2,3]
# 写入csv
with open(filename, 'a',) as f:
fcsv = csv.writer(f)
fcsv.writerow(content)
五、写入CSV文件,标题只写一遍,内容追加写入
import csv
import os
from pathlib import Path
from spider_django import settings
base_dir = Path(__file__).resolve().parent
filename = os.path.join(str(base_dir), 'task.csv')
class SaveTask(object):
"""存储任务"""
def __init__(self, task_name, task_create_time, keyword, url, start_date, end_date, creator, status):
self.task_name = task_name
self.task_create_time = task_create_time
self.keyword = keyword
self.url = url
self.start_date = start_date
self.end_date = end_date
self.creator = creator
self.status = status
def save_task(self):
"""保存数据"""
headers = ['task_name', 'task_create_time',
'keyword', 'url', 'start_date',
'end_date', 'creator', 'status'
]
content = [self.task_name, self.task_create_time,
self.keyword, self.url, self.start_date,
self.end_date, self.creator, self.status
]
# 写入CSV
with open(filename, 'a', newline='') as file:
f_csv = csv.writer(file)
with open(filename, 'r') as f:
# csv.reader(),返回csv阅读器(本质是一个迭代器,具有__next__()、__iter__()方法),可通过迭代读取csv文件内容
reader = csv.reader(f)
if not [row for row in reader]:
f_csv.writerow(headers)
f_csv.writerow(content)
else:
f_csv.writerow(content)
六、Markdown输入上下标
上标:<sup>符号</sup>
下标:<sub></sub>
七、常用照片尺寸
八、sys.exit()
方法退出程序
官网网址:https://docs.python.org/2/library/sys.html
sys.exit(arg)
参数:
- arg:可选,默认为0。
功能: 退出 Python。这是通过引发SystemExit 异常来实现的,因此执行try 语句的 finally 子句指定的清理操作,并且可以在外部级别拦截退出尝试。 可选参数arg可以是给出退出状态的整数(默认为零)或其他类型的对象。 如果它是一个整数,零被认为是“成功终止”,任何非零值都被壳等认为是“异常终止”。大多数系统要求它在 0-127 的范围内,否则会产生未定义的结果。一些系统有为特定退出代码分配特定含义的约定,但这些通常不完善;Unix 程序通常使用 2 表示命令行语法错误,使用 1 表示所有其他类型的错误。 如果传递了另一种类型的对象,None 则等效于传递零,并且任何其他对象都被打印到stderr并导致退出代码为 1。 特别是,sys.exit(“some error message”) 是发生错误时退出程序的快捷方式。
由于exit()最终“only”引发异常,因此只有在主线程调用时才会退出进程,不会拦截异常。
示例代码:
import sys
try:
from osgeo import ogr
except:
import ogr
inshp = r'D:\Zhb\03_work\RS\abc.xxx'
driver = ogr.GetDriverByName('ESRI Shapefile')
datasource = driver.Open(inshp, 0)
if datasource is None:
print('could not open')
sys.exit(1)
print('done!')
# 结果:
"""
没有 sys.exit(1),假如路径错误会打印:
could not open
done!
有了它:
会直接退出python
打印:
could not open
"""
九、python自省函数
dir()、help()、type()、id()、hasattr()、
getattr()、callable()、isinstance()
dir()
dir() 函数可能是 Python 自省机制中最著名的部分了。它返回传递给它的任何对象的属性名称经过排序的列表。如果不指定对象,则 dir() 返回当前作用域中的名称。
help()
用来查看很多Python自带的帮助文档信息。
type()
返回对象的类型。
id()
返回对象的“唯一序号”。对于引用对象来说,返回的是被引用对象的id()
hasattr()
和 getattr()
分别判断对象是否有某个属性及获得某个属性值。
callable()
判断对象是否可以被调用。
isinstance()
可以确认某个变量是否有某种类型。
十、python 递归
原文链接:https://blog.csdn.net/ruanxingzi123/article/details/82658669
递归函数:
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数特性:
- 必须有一个明确的结束条件;
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
示例:
计算1到100之间相加之和;通过循环和递归两种方式实现。
# 循环方式
def sum_cycle(n):
sum = 0
for i in range(1,n+1) :
sum += i print(sum)
# 递归方式
def sum_recu(n):
if n>0:
return n +sum_recu(n-1)
else:
return 0
sum_cycle(100)
sum = sum_recu(100) print(sum)
# 结果:
5050
5050
十一、python字典value排序
给定一个字典,用其中的value进行排序。
可以使用:
dict.items()
获取字典的元素, 返回一个 view 对象。这个视图对象包含字典的键值对,形式为列表中的元组。lambda匿名函数
sorted()
: sorted函数比sort函数要强大许多了,sort只能对列表进行排序,sorted可以对所有可迭代类型进行排序,并且返回新的已排序的列表。sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
参数: 1.iterable:可迭代类型,例如字典、列表、
2.cmp:比较函数
3.key:可迭代类型中某个属性,对给定元素的每一项进行排序
4.reverse:降序或升序
dict1 = {'a': 1, 'b': 4, 'c': 2, 'f': 12, 'd': 3}
a = sorted(dict1.items(), key=lambda x: x[1])
print(a)
b = sorted(dict1.items(), key=lambda x: x[1], reverse=True)
print(b)
# 结果:
# [('a', 1), ('c', 2), ('d', 3), ('b', 4), ('f', 12)]
# [('f', 12), ('b', 4), ('d', 3), ('c', 2), ('a', 1)]