python 脚本编写

脚本编写

将学习:

  • Python 安装和环境设置
  • 运行和修改 Python 脚本
  • 与用户输入交互
  • 处理异常
  • 读写文件
  • 导入本地、标准和第三方模块
  • 在解释器中进行实验

方法 1:安装 Anaconda

 安装教程:https://www.zhihu.com/question/58033789

方法2:安装python

1.创建工作目录:多级

import os 

#创建多级目录  
os.makedirs('D:\\培训课程\\python\\ke')

#import os
#获取当前工作目录
>>>os.getcwd()
#更改当前工作目录
>>>os.chdir('D:\\培训课程\\python\\ke')
>>>os.getcwd()

改变或者获取工作目录

有时候执行文件需要在适当的目录下运行,这时候就需要改变或者获取工作目录了。

import os

os.chdir("/home/xx/projects/LSTM_Qi_v27/py")   #修改当前工作目录

os.getcwd()    #获取当前工作目录

写一个完成以下操作的脚本:

  1. 请求用户输入三次。一次是名字列表,一次是未交作业数量列表,一次是分数列表。使用该输入创建 namesassignments 和 grades 列表。
  2. 使用循环为每个学生输出一条信息并包含正确的值。潜在分数是 2 乘以未交作业数加上当前分数。

下面是在终端内成功运行该脚本的示例。

names = input("Enter names separated by commas: ").title().split(",")
assignments = input("Enter assignment counts separated by commas: ").split(",")
grades = input("Enter grades separated by commas: ").split(",")

message = "Hi {},\n\nThis is a reminder that you have {} assignments left to \
submit before you can graduate. You're current grade is {} and can increase \
to {} if you submit all assignments before the due date.\n\n"

for name, assignment, grade in zip(names, assignments, grades):
    print(message.format(name, assignment, grade, int(grade) + int(assignment)*2))

在脚本中接受原始输入

我们可以使用内置函数 input 获取用户的原始输入,该函数接受一个可选字符串参数,用于指定在要求用户输入时向用户显示的消息。

name = input("Enter your name: ")
print("Hello there, {}!".format(name.title()))

这段代码提示用户输入姓名,然后在问候语中使用该输入。input 函数获取用户输入的任何内容并将其存储为字符串。如果你想将输入解析为字符串之外的其他类型,例如整数(如以下示例所示),需要用新的类型封装结果并从字符串转换为该类型。

num = int(input("Enter an integer"))
print("hello" * num)

我们还可以使用内置函数 eval 将用户输入解析为 Python 表达式。该函数会将字符串评估为一行 Python 代码。

result = eval(input("Enter an expression: "))
print(result)

如果用户输入 2 * 3,输出为 6

错误、异常

python 脚本编写_第1张图片

Try 语句

我们可以使用 try 语句处理异常。你可以使用 4 个子句(除了视频中显示的子句之外还有一个子句)。

  • try:这是 try 语句中的唯一必需子句。该块中的代码是 Python 在 try 语句中首先运行的代码。
  • except:如果 Python 在运行 try 块时遇到异常,它将跳到处理该异常的 except 块。
  • else:如果 Python 在运行 try 块时没有遇到异常,它将在运行 try 块后运行该块中的代码。
  • finally:在 Python 离开此 try 语句之前,在任何情形下它都将运行此 finally 块中的代码,即使要结束程序,例如:如果 Python 在运行 except 或 else 块中的代码时遇到错误,在停止程序之前,依然会执行此finally 块。

为何在 Python 中需要 finally 子句?

指定异常

我们实际上可以指定要在 except 块中处理哪个错误,如下所示:

try:
    # some code
except ValueError:
    # some code

现在它会捕获 ValueError 异常,但是不会捕获其他异常。如果我们希望该处理程序处理多种异常,我们可以在 except 后面添加异常元组。

try:
    # some code
except (ValueError, KeyboardInterrupt):
    # some code

或者,如果我们希望根据异常执行不同的代码块,可以添加多个 except 块。

try:
    # some code
except ValueError:
    # some code
except KeyboardInterrupt:
    # some code

 

练习:处理除以零的情形

现在运行下面的代码将在第二次调用 handle_zero 函数时导致错误,因为它遇到了 ZeroDivisionError 异常。

请修改下面的函数以处理该异常。如果在函数的第一行遇到该异常,应该输出警告消息并返回空列表。否则,应该运行函数的剩余代码。最后,该函数应该始终输出返回了多少组。

def create_groups(items, num_groups):
    size = len(items) // num_groups

    groups = []
    for i in range(0, len(items), size):
        groups.append(items[i:i + size])

    print("{} groups returned.".format(num_groups))
    return groups

print("Creating 6 groups...")
for group in create_groups(range(32), 6):
    print(list(group))

print("\nCreating 0 groups...")
for group in create_groups(range(32), 0):
    print(list(group))

修改上面的脚本以处理除以零错误。正确修改的话,应该会输出:

Creating 6 groups...
6 groups returned.
[0, 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]

Creating 0 groups...
WARNING: Returning empty list. Please use a nonzero number.
0 groups returned.

练习解决方案:处理除以零的情形

def create_groups(items, num_groups):
    try:
        size = len(items) // num_groups
    except ZeroDivisionError:
        print("WARNING: Returning empty list. Please use a nonzero number.")
        return []
    else:
        groups = []
        for i in range(0, len(items), size):
            groups.append(items[i:i + size])
        return groups
    finally:
        print("{} groups returned.".format(num_groups))

print("Creating 6 groups...")
for group in create_groups(range(32), 6):
    print(list(group))

print("\nCreating 0 groups...")
for group in create_groups(range(32), 0):
    print(list(group))

 

访问错误消息

在处理异常时,依然可以如下所示地访问其错误消息:

try:
    # some code
except ZeroDivisionError as e:
   # some code
   print("ZeroDivisionError occurred: {}".format(e))

应该会输出如下所示的结果:

ZeroDivisionError occurred: division by zero

因此依然可以访问错误消息,即使已经处理异常以防止程序崩溃!

如果没有要处理的具体错误,依然可以如下所示地访问消息:

try:
    # some code
except Exception as e:
   # some code
   print("Exception occurred: {}".format(e))

Exception 是所有内置异常的基础类。你可以在此处详细了解 

读写文件

以下是如何在 Python 中读写文件的方式。

读取文件

f = open('my_path/my_file.txt', 'r')
file_data = f.read()
f.close()
  1. 首先使用内置函数 open 打开文件。需要文件路径字符串。open 函数会返回文件对象,它是一个 Python 对象,Python 通过该对象与文件本身交互。在此示例中,我们将此对象赋值给变量 f
  2. 你可以在 open 函数中指定可选参数。参数之一是打开文件时采用的模式。在此示例中,我们使用 r,即只读模式。这实际上是模式参数的默认值。
  3. 使用 read 访问文件对象的内容。该 read 方法会接受文件中包含的文本并放入字符串中。在此示例中,我们将该方法返回的字符串赋值给变量 file_data
  4. 当我们处理完文件后,使用 close 方法释放该文件占用的系统资源。

写入文件

f = open('my_path/my_file.txt', 'w')
f.write("Hello there!")
f.close()
  1. 以写入 ('w') 模式打开文件。如果文件不存在,Python 将为你创建一个文件。如果以写入模式打开现有文件,该文件中之前包含的所有内容将被删除。如果你打算向现有文件添加内容,但是不删除其中的内容,可以使用附加 ('a') 模式,而不是写入模式。
  2. 使用 write 方法向文件中添加文本。
  3. 操作完毕后,关闭文件。

    

With

Python 提供了一个特殊的语法,该语法会在你使用完文件后自动关闭该文件。

with open('my_path/my_file.txt', 'r') as f:
    file_data = f.read()

该 with 关键字使你能够打开文件,对文件执行操作,并在缩进代码(在此示例中是读取文件)执行之后自动关闭文件。现在,我们不需要调用 f.close() 了!你只能在此缩进块中访问文件对象 f。

f.read() 调用没有传入参数。它自动变成从当前位置读取文件的所有剩余内容,即整个文件。如果向 .read() 传入整型参数,它将读取长度是这么多字符的内容,输出所有内容,并使 'window' 保持在该位置以准备继续读取

with open(camelot.txt) as song:
    print(song.read(2))
    print(song.read(8))
    print(song.read())

输出:

We
're the 
knights of the round table
We dance whenever we're able

这样的话,在打开的文件中到处移动会很困难,因为没有太多可以导航的标记。

文本块中的 \n 是换行符。换行符表示一行的结束,告诉程序(例如文本编辑器)转到下一行。但是,对于文件中的一系列字符来说,\n 只是另一个字符。 幸运的是,Python 知道这些是特殊字符,你可以要求 Python 每次读取一行。我们来试试!

很方便的是,Python 将使用语法 for line in file 循环访问文件中的各行内容。 我可以使用该语法创建列表中的行列表。因为每行依然包含换行符,因此我使用 .strip() 删掉换行符。

camelot_lines = []
with open("camelot.txt") as f:
    for line in f:
        camelot_lines.append(line.strip())

print(camelot_lines)

输出:

["We're the knights of the round table", "We dance whenever we're able"]

练习:《飞翔的马戏团》 演员名单

你将创建一个演员名单,列出参演电视剧《巨蟒剧团之飞翔的马戏团》的演员。

写一个叫做 create_cast_list 的函数,该函数会接受文件名作为输入,并返回演员姓名列表。 它将运行文件 flying_circus_cast.txt(信息收集自 imdb.com)。文件的每行包含演员姓名、逗号,以及关于节目角色的一些(凌乱)信息。你只需提取姓名,并添加到列表中。你可以使用 .split() 方法处理每行。

def create_cast_list(filename):
    cast_list() = []
    with open(filename) as f :
        for line in f:
            line_date = line.split(',')
            cast_list.append(line_date[0])
    return(cast_list)
cast_list = create_cast_list('flying_circus_cast.txt')
for actor in cast_list:
    print(actor)

            

    

导入本地脚本

我们实际上可以导入其他脚本中的 Python,如果你处理的是大型项目,需要将代码整理成多个文件并重复利用这些文件中的代码,则导入脚本很有用。如果你要导入的 Python 脚本与当前脚本位于同一个目录下,只需输入 import,然后是文件名,无需扩展名 .py。

import useful_functions

Import 语句写在 Python 脚本的顶部,每个导入语句各占一行。该 import 语句会创建一个模块对象,叫做 useful_functions。模块是包含定义和语句的 Python 文件。要访问导入模块中的对象,需要使用点记法。

import useful_functions
useful_functions.add_five([1, 2, 3, 4])

我们可以为导入模块添加别名,以使用不同的名称引用它。

import useful_functions as uf
uf.add_five([1, 2, 3, 4])

使用 if main 块

为了避免运行从其他脚本中作为模块导入的脚本中的可执行语句,将这些行包含在 if __name__ == "__main__" 块中。或者,将它们包含在函数 main() 中并在 if main 块中调用该函数。

每当我们运行此类脚本时,Python 实际上会为所有模块设置一个特殊的内置变量 __name__。当我们运行脚本时,Python 会将此模块识别为主程序,并将此模块的 __name__ 变量设为字符串 "__main__"。对于该脚本中导入的任何模块,这个内置 __name__ 变量会设为该模块的名称。因此,条件 if __name__ == "__main__"会检查该模块是否为主程序。

尝试一下!

下面是我在上述视频中使用的代码。请在同一目录下创建这些脚本,并在终端里运行这些脚本!实验 if main 块并访问导入模块中的对象!

# demo.py

import useful_functions as uf

scores = [88, 92, 79, 93, 85]

mean = uf.mean(scores)
curved = uf.add_five(scores)

mean_c = uf.mean(curved)

print("Scores:", scores)
print("Original Mean:", mean, " New Mean:", mean_c)

print(__name__)
print(uf.__name__)
# useful_functions.py

def mean(num_list):
    return sum(num_list) / len(num_list)

def add_five(num_list):
    return [n + 5 for n in num_list]

def main():
    print("Testing mean function")
    n_list = [34, 44, 23, 46, 12, 24]
    correct_mean = 30.5
    assert(mean(n_list) == correct_mean)

    print("Testing add_five function")
    correct_list = [39, 49, 28, 51, 17, 29]
    assert(add_five(n_list) == correct_list)

    print("All tests passed!")

if __name__ == '__main__':
    main()

练习:密码生成器

写一个叫做 generate_password 的函数,该函数会从提供的单词文件中随机选择三个单词,并将它们连接成一个字符串。我们已经在起始代码中提供了从文件中读取数据的代码,你需要利用这些部分构建一个密码

word_file = 'words.txt'
word_list = []
with open(word_file,'r') as words:
	     for line in words:
	         word = line.strip().lower()
	         if 3 < len(word) < 8:
	             word_list.append(word)

import random
def generate_password():
    return(random.choice(word_list)+random.choice(word_list)+random.choice(word_list))
def generate():
    return(''.join(random.sample(word_list,3)))

print(generate_password())
print(generate())

你可以在此处浏览库文档:https://docs.python.org/3/library/

(1) datetime #哪个模块可以告诉你当前时间和日期?
(2) os #哪个模块具有更改当前工作目录的方法?
(3) csv #哪个模块可以将逗号分隔 (.csv) 文件中的每行数据读取到 Python 中?
(4) zipfile #哪个模块可以帮助我们从 zip 文件中提取所有文件?
(5) time #哪个模块可以显示代码的运行时间?

 

我们的推荐模块

Python 标准库包含大量模块!为了帮助你熟悉那些实用的模块,我们在下面筛选了一些我们推荐的 Python 标准库模块并解释为何我们喜欢使用它们!

  • csv:对于读取 csv 文件来说非常便利
  • collections:常见数据类型的实用扩展,包括 OrderedDictdefaultdict 和 namedtuple
  • random:生成假随机数字,随机打乱序列并选择随机项
  • string:关于字符串的更多函数。此模块还包括实用的字母集合,例如 string.digits(包含所有字符都是有效数字的字符串)。
  • re:通过正则表达式在字符串中进行模式匹配
  • math:一些标准数学函数
  • os:与操作系统交互
  • os.pathos 的子模块,用于操纵路径名称
  • sys:直接使用 Python 解释器
  • json:适用于读写 json 文件(面向网络开发)

    导入模块技巧

    还有一些在不同情形下很有用的其他形式的 import 语句。

  • 要从模块中导入单个函数或类:
    from module_name import object_name
    
  • 要从模块中导入多个单个对象:
    from module_name import first_object, second_object
    
  • 要重命名模块:
    import module_name as new_name
    
  • 要从模块中导入对象并重命名:
    from module_name import object_name as new_name
    
  • 要从模块中单个地导入所有对象(请勿这么做):
    from module_name import *
    
  • 如果你真的想使用模块中的所有对象,请使用标准导入 module_name 语句并使用点记法访问每个对象。
    import module_name

模块、软件包和名称

为了更好地管理代码,Standard 标准库中的模块被拆分成了子模块并包含在软件包中。软件包是一个包含子模块的模块。子模块使用普通的点记法指定。

子模块的指定方式是软件包名称、点,然后是子模块名称。你可以如下所示地导入子模块。

import package_name.submodule_name

 

第三方库

独立开发者编写了成千上万的第三方库!你可以使用 pip 安装这些库。pip 是在 Python 3 中包含的软件包管理器,它是标准 Python 软件包管理器,但并不是唯一的管理器。另一个热门的管理器是 Anaconda,该管理器专门针对数据科学。

要使用 pip 安装软件包,在命令行中输入“pip install”,然后是软件包名称,如下所示:pip install package_name。该命令会下载并安装该软件包,以便导入你的程序中。安装完毕后,你可以使用从标准库中导入模块时用到的相同语法导入第三方软件包。

使用 requirements.txt 文件

大型 Python 程序可能依赖于十几个第三方软件包。为了更轻松地分享这些程序,程序员经常会在叫做 requirements.txt 的文件中列出项目的依赖项。下面是一个 requirements.txt 文件示例。

beautifulsoup4==4.5.1
bs4==0.0.1
pytz==2016.7
requests==2.11.1

该文件的每行包含软件包名称和版本号。版本号是可选项,但是通常都会包含。不同版本的库之间可能变化不大,可能截然不同,因此有必要使用程序作者在写程序时用到的库版本。

你可以使用 pip 一次性安装项目的所有依赖项,方法是在命令行中输入 pip install -r requirements.txt

实用的第三方软件包

能够安装并导入第三方库很有用,但是要成为优秀的程序员,还需要知道有哪些库可以使用。大家通常通过在线推荐或同事介绍了解实用的新库。如果你是一名 Python 编程新手,可能没有很多同事,因此为了帮助你了解入门信息,下面是优达学城工程师很喜欢使用的软件包列表。(可能部分网站在国内网络中无法打开)

  • IPython - 更好的交互式 Python 解释器
  • requests - 提供易于使用的方法来发出网络请求。适用于访问网络 API。
  • Flask - 一个小型框架,用于构建网络应用和 API。
  • Django - 一个功能更丰富的网络应用构建框架。Django 尤其适合设计复杂、内容丰富的网络应用。
  • Beautiful Soup - 用于解析 HTML 并从中提取信息。适合网页数据抽取。
  • pytest - 扩展了 Python 的内置断言,并且是最具单元性的模块。
  • PyYAML - 用于读写 YAML 文件。
  • NumPy - 用于使用 Python 进行科学计算的最基本软件包。它包含一个强大的 N 维数组对象和实用的线性代数功能等。
  • pandas - 包含高性能、数据结构和数据分析工具的库。尤其是,pandas 提供 dataframe!
  • matplotlib - 二维绘制库,会生成达到发布标准的高品质图片,并且采用各种硬拷贝格式和交互式环境。
  • ggplot - 另一种二维绘制库,基于 R's ggplot2 库。
  • Pillow - Python 图片库可以向你的 Python 解释器添加图片处理功能。
  • pyglet - 专门面向游戏开发的跨平台应用框架。
  • Pygame - 用于编写游戏的一系列 Python 模块。
  • pytz - Python 的世界时区定义。

在解释器中进行实验

通过在终端里输入 python 启动 python 交互式解释器。你可以接着输入内容,直接与 Python 交互。这是每次实验和尝试一段 Python 代码的很棒工具。只需输入 Python 代码,输出将出现在下一行。

>>> type(5.23)

在解释器中,提示符窗口中最后一行的值将自动输出。如果有多行代码需要输出值,依然需要使用 print。

如果你开始定义函数,你将在提示符窗口中看到变化,表示这是可以继续的行。在定义函数时,你需要自己添加缩进。

>>> def cylinder_volume(height, radius):
...         pi = 3.14159
...         return height * pi * radius ** 2

解释器的不足之处是修改代码比较麻烦。如果你在输入该函数时出现了拼写错误,或者忘记缩进函数的主体部分,无法使用鼠标将光标点到要点击的位置。需要使用箭头键在代码行中来回移动。有必要了解一些实用的快捷方式,例如移到一行的开头或结尾。

注意,我可以引用我在解释器中之前定义的任何对象!

>>> cylinder_volume(10, 3)
282.7431

一个实用技巧是在交互式提示符窗口中使用上下箭头键循环浏览最近的命令。这样可以重新运行或修改已经尝试的代码。

要退出 Python 交互式解释器,使用命令 exit() 或在 mac/linux 上按下 ctrl+D,在 windows 上按下 ctrl+Z,然后按下 Enter 键。

IPython

实际上有一个代替默认 python 交互式解释器的强大解释器 IPython,它具有很多其他功能。

  • Tab 键补充完整
  • ?:关于对象的详细信息
  • !:执行系统 shell 命令
  • 语法突出显示

 

你可能感兴趣的:(python 脚本编写)