Gamer's Show

你知道人生最要紧的事是快乐不停

0%

PythonBasic

基本语法

关键字global的用法

global是Python中全局变量的关键字,可以使得一个局部变量变为全局变量(既可以是某对象函数创建,也可以是在本程序任何地方创建,可以被本程序的所有对象或函数引用)
注意如果使的函数可以改变全局变量的值,该全局变量声明必须在函数内
示例:

1
2
3
4
5
6
7
8
9
10
11
12
x = 4

def my():
global x
x = 8
print("x = ",x)

print("x = ",x)
my()
print("x = ",x)

#输出顺序:4 8 8

字典添加元素

  1. 单个添加,并且是在新元素的基础上添加(对已有元素会覆盖
    book_dict["owner"] = "tyson"

异常

Python被称为异常的对象用于管理程序执行期间发生的错误,当程序发生错误时可以使用try-except语句来处理错误,保持程序运行。

  • 程序崩溃时让用户看到traceback并不是好事,不仅是不美观,并且可能会泄露你的程序的信息,比如你程序的文件名称和无法正确运行的部分代码,攻击者很有可能根据这些信息判断出可以对代码发起怎样的攻击。

处理traceback的错误

哪条语句导致错误就把哪条语句放在try后边

1
2
3
4
try:
"""可能导致程序错误运行的代码块"""
except [错误名(可以在traceback中看到)]:
"""处理错误的代码块"""

如果后面还有其他代码块,程序将继续运行。如果有一些代码仅在try在执行时运行,可以使用else语句

1
2
3
4
5
6
try:
"""可能导致程序错误运行的代码块"""
except [错误名(可以在traceback中看到)]:
"""处理错误的代码块,或者说使用pass不做任何反应"""
else:
"""在try-except语句中没有错误发生时运行的代码块"""

程序种的实用方法

判断

是否为数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def is_number(s):
try:
float(s)
return True
except ValueError:
pass

try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass

return False

Python对文件的操作

基本语法

  1. file = open('your_file.txt','r')操作方式参数’w’会改成写(创建)文件原有内容会被清空;’r’是只读;’a’是直接在尾部添加内容或者创建;
  2. f.close()关闭文件
  3. f.read()文件读取
  4. 常用的文件操作形式Img

with上下文打开(推荐)

操作完成后无需通过close()关闭文件,并且安全系数更高

1
2
3
import codecs
with codecs.open('your_file.txt','r','utf-8') as f:
f.write('WellDone!')

yaml文件进行操作

ymal文件操作的一个简单小教程

yaml语法

  • 支持的数据类型:
    字典、列表、字符串、布尔值、整数、浮点数、Null、时间等
  • 基本语法规则:
  1. 大小写敏感
  2. 使用缩进表示层级关系
  3. 相同层级的元素左侧对齐
  4. 键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
  5. 数组前加有 “-” 符号,符号与值之间需用空格分隔
  6. None值可用null 和 ~ 表示
  7. 多组数据之间使用3横杠—分割
  8. #表示注释,但不能在一段代码的行末尾加注释,否则会报错

第三方库PyYAML

读取/写入后各类型对应的格式

写入数据

  • 打开后首先加入 yaml.dump(data=mydata, stream=f,allow_unicode=True)防止写入的中文乱码
  • 多组数据写入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import yaml

    apiData1 = {
    "page": 1,
    "msg": "地址",
    "data": [{
    "id": 1,
    "name": "学校"
    }, {
    "id": 2,
    "name": "公寓"
    }, {
    "id": 3,
    "name": "流动人口社区"
    }],
    }

    apiData2 = {
    "page": 2,
    "msg": "地址",
    "data": [{
    "id": 1,
    "name": "酒店"
    }, {
    "id": 2,
    "name": "医院"
    }, {
    "id": 3,
    "name": "养老院"
    }],
    }

    with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:#注意这里文件名一定要用单引号,不然会出现奇怪的错误ing
    yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)#若希望写入单组数据,使用dump,document改data

Pandas

csv

读取

注意你如果要把其他文件的格式转换成csv再读取,一定要使用表格工具另存为csv,而不是直接修改他的后缀名,直接修改后缀会导致无法打开的错误发生。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd

csv_path='./result.csv'

# 使用pd.read_csv读取数据
contents=pd.read_csv(csv_path)

# 查看前几行数据
print(contents.head())

# 查看数据的形状,返回(行数、列数)
print(contents.shape)

# 查看列表列的名称
print(contents.columns)

# 查看索引行
print(contents.index)

# 查看每列的数据类型
print(contents.dtypes)

  1. 获取信息
    1
    2
    3
    4
    # 列名
    print(df.columns)
    # 索引
    print(df.index)
  2. 统计数据个数
    1
    2
    3
    4
    5
    import pandas as pd

    df = pd.read_csv("filename.csv")
    count = df.shape[0]
    print("数据个数:", count)

输出

  1. 打印函数
    1
    2
    3
    4
    5
    6
    print(type(df))  # pandas.core.frame.DataFrame 类
    print(df.shape) # DataFrame 大小
    print(df.head(5)) # 打印头部 5 行
    print(df.tail(5)) # 打印尾部 5 行
    print("1")
    print(type(df['Feature'])) # pandas.core.series.Series 类
    1
    2
    datacsv = pd.read_table('python.csv', ',')
    #将文件内的所有数据全部按照逗号进行分隔。

Python调用

cmd

和gpt老师的对话解决了我的问题

调用cmd来执行R语言脚本

最大的问题在于,实际上在python中敲入exit后并不会结束cmd的进程,这时候会陷入一直循环,在python中也无法读出是否有输入输出等等,所以此处通过输出间隔时间来判断程序是否结束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import subprocess
import time
import time

import select

# 启动一个交互式命令行
process = subprocess.Popen(["cmd"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
#process = subprocess.Popen(cmd_commands, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

FeaNum = '20' + '\n'
# 定义要执行的多个命令
commands = [
"cd Estimate\n",
"Rscript .\RadioML_features.R -p TIANTAN -t 5 -n 1000 -R prefix_1000_5_training.RData\n",
FeaNum
]

# 发送多个命令到命令行
for command in commands:
process.stdin.write(command)
process.stdin.flush() # 刷新缓冲区以确保命令被发送
# 读取命令的输出
if process.stdout.readline():
output_line = process.stdout.readline()
if not output_line: # 如果没有更多输出,则退出循环
#process.stdin.write("exit\n")
print("Finished")
break
print(output_line.strip())
time.sleep(1) # 等待一秒钟以确保命令有足够的时间执行
if command == FeaNum: # 如果没有更多输出,则退出循环
print("Finished")

output_line = process.stdout.readline()
start_time = time.time()
while output_line:

print(output_line.strip())

# 设置超时时间为1秒
#print(time.time() - start_time)
if time.time() - start_time >= 0.85:
break

output_line = process.stdout.readline()

下面是chat给的跳出循环方案,测试证明’Finished’根本不会输出

1
2
3
4
5
6
7
8
9
10
# 读取命令的输出
while True:
output_line = process.stdout.readline()
if not output_line: # 如果没有更多输出,则退出循环
process.stdin.write("exit\n")
print("Finished")
break
print(output_line.strip())
sys.exit(process)
#这个地方不要加wait,否则会一直退不出来

Pycharm救命小操作

  1. 查看文件历史