1.headers字符串处理
2.控制台输出带颜色
3.包管理requirement.txt
4.文件读取read、readline、readlines
5.文件打开方式★★
6.py文件调用其它py文件的类和函数
7.python和anaconda常用指令

知识点回顾:python字典与js的对象
      兄弟萌,我懵了,最近有点迷糊,刚刚说起字典(值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。),这就可以联想到js的对象写法

1
2
# 字典
dicts = {'Alice': '2341', 9527: '9102', (2,3): '3258'}

js的对象提供多个内建对象,比如 Object、String、Date、Array,Number,Function 等等

1
2
3
4
5
6
7
let obj = {
name : "xiaoming",
age : 18,
show : function (girlfriend) {
console.log(this.name + "的女朋友是" + girlfriend);
}
};

1. headers字符串处理

      我们从chrome里面的截取到的headers往往是需要我们二次处理的,而我一般喜欢加双引号,构造成json格式,一劳永逸。
源代码:

1
2
3
4
5
6
7
8
9
10
11
12
import re

headers_str = """
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
"""
pattern = re.compile("^(.*?): (.*)$")
for line in headers_str.splitlines():
print(re.sub(pattern, "\"\\1\": \"\\2\",", line))

这里的headers_str存放我们的目标headers字符串,运行结果为:

1
2
3
4
5
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"

2.控制台输出带颜色

设置颜色开始 :\033[显示方式;前景色;背景色m 文本内容 \033[0m(此处为结束语)

1
2
3
4
5
print('\033[1;31m我以我血荐轩辕\033[0m')
print('\033[4;35m我以我血荐轩辕\033[0m')
print('\033[5;37;40m我以我血荐轩辕\033[0m')
print('\033[0;32m我以我血荐轩辕\033[0m')
print('\033[1;32m我以我血荐轩辕\033[0m')

3.包管理requirement.txt

正如 PHP 中使用 Composer 维护依赖一样,Python 也需要维护项目相关的依赖包。通常我们会在项目的根目录下放置一个 requirement.txt 文件,用于记录所有依赖包和它的确切版本号。

1.Python的依赖
requirement.txt 的内容长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
alembic==1.0.10
appnope==0.1.0
astroid==2.2.5
attrs==19.1.0
backcall==0.1.0
bcrypt==3.1.6
bleach==3.1.0
cffi==1.12.3
Click==7.0
decorator==4.4.0
defusedxml==0.6.0
entrypoints==0.3
...

2.如何使用:
那么 requirement.txt 究竟如何使用呢?
当我们拿到一个项目时,首先要在项目运行环境安装 requirement.txt 所包含的依赖:

script
1
pip install -r requirement.txt

当我们要把环境中的依赖写入 requirement.txt 中时,可以借助 freeze 命令:

script
1
pip freeze >requirements.txt

3.环境混用怎么办?
在导出依赖到 requirement.txt 文件时会有一种尴尬的情况。
你的本地环境不仅包含项目 A 所需要的依赖,也包含着项目 B 所需要的依赖。此时我们要如何做到只把项目 A 的依赖导出呢?

pipreqs 可以通过扫描项目目录,帮助我们仅生成当前项目的依赖清单。

通过以下命令安装:

script
1
pip install pipreqs

运行:

script
1
pipreqs ./

4.文件读取read、readline、readlines

  • read():读取整个文件,将文件内容放到一个字符串变量中
  • readline():每次读取一整行,包括换行符,并将其作为字符串返回
  • readlines():读取所有行然后把它们作为一个字符串型列表返回(即把每一行数据包括换行符作为一个列表元素)

readline()示例

假设需求是读取一个多行的all_term.txt文件,并列出每一个单词

1
2
3
4
new fallout chernobyl social impact chernobyl disast
david r marpl st martin press cloth
rnobyl social impact chernobyl disast
david r marpl st martin piano

程序源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def main():
obj = []
with open('all_term.txt', 'r', encoding='utf-8',errors="ignore") as f:
while True:
myStr = f.readline() # 表示一次读取一行

if not myStr:
# 读到数据最后跳出,结束循环。数据的最后也就是读不到数据了,mystr为空的时候
break
# 指定字符串来分割目标字符串,以列表形式返回
new_list = myStr.split()
# 表示将拆分好的每一行重新拼接成一个完整的数组
obj += new_list
print(obj)


if __name__ == '__main__':
main()

readline()表示读取一整行,那如果一个文件有多行数据,使用readline()函数是不是一直重复读取第一行?
其实不然,使用with open()打开文件后,第一个readline()读取第一行(也包括换行符),第二个读取第二行,…,第n个读取第n行数据,这是由系统机制判定的。
下面我列举一个实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
"""all_term.txt:
new fallout chernobyl social impact chernobyl disast
david r marpl st martin press cloth

new fallout chernobyl social impact chernobyl disast
david r marpl st martin press cloth
"""

# -*- coding:utf-8 -*-
with open('all_term.txt', 'r', encoding='utf-8', errors='ignore') as f:
a = f.readline().replace("\n", "")
b = f.readline().replace("\n", "")
print("a:", a)
print("b:", b)
"""
结果为:
a: new fallout chernobyl social impact chernobyl disast
b: david r marpl st martin press cloth
"""

根据结果可以得出结论:

1.第一个readline()读取第一行(也包括换行符),第二个读取第二行,……

2.上面是我们经常看到的按行遍历一个文件方法,你可能已经注意到我在代码中写的if not myStr:部分。当readline读取到为空的时候,意味着读到了文件的结束。这个时候,问题就在这里,很多人会想,是不是遇到一个空行,也会被认为是文件的结束呢?
事实上,文件的空白行并不会返回一个空行。因为在每一行的末尾还有一个或者多个分隔符,因此“空白行”至少会有一个换行符或者系统使用的其他符号。所以,即使文件中真的包含一个“空白行”,读入的行也不是空的,这就意味着在真实遍历读取到文件结束之前,程序实际上是不会停止的

5.文件打开方式

打开方式 详解
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

6.py文件调用其它py文件的类和函数

python文件如何调用另一个.py文件中的类和函数?首先我们要区分是在同一文件夹下还是在不同文件夹

同一文件夹

  1. 调用函数

A.py文件:

1
2
def add(x,y):
print('和为:%d'%(x+y))

B.py文件:

1
2
3
4
5
6
import A
A.add(985, 211)

# 法二
from A import add
add(985, 211)
  1. 调用类

A.py文件

1
2
3
4
5
6
class A:
def __init__(self,xx,yy):
self.x=xx
self.y=yy
def add(self):
print("x和y的和为:%d"%(self.x+self.y))

B.py文件

1
2
3
4
5
6
7
8
9
from A import A
# 对象的实例化
a=A(2,3)
a.add()

# 法二
import A
a=A.A(2,3)
a.add()

不同文件夹

A.py文件的文件路径:E:\PythonProject\winycg
B.py文件:

1
2
3
4
5
6
7
8
9
10
11
import sys
sys.path.append(r'E:\PythonProject\winycg')
'''
python import模块时, 是在sys.path里按顺序查找的。
sys.path是一个列表,里面以字符串的形式存储了许多路径。
使用A.py文件中的函数需要先将他的文件路径放到sys.path中
'''
import A

a=A.A(2,3)
a.add()

7.python和anaconda常用指令

  1. Python
script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# pip版本
pip --version

# 列出已安装的包
pip list

# 安装包(不指定版本,默认最新)
pip install pymssql
pip install pymssql==2.2.1

# 卸载包
pip uninstall pymssql

# 查看包详细消息
pip show package-name

# 更新指定包版本
pip install [—U | --upgrade] package-name

# 更新pip
python -m pip install --upgrade pip
  1. anaconda
script
1
2
3
4
5
6
7
8
# 查看anaconda版本
conda -V

# 列出conda管理的所有环境
conda env list

# 激活目标环境
conda activate environment

参考文章


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议