Day07 - Python基本语法 Part 4,模组、档案处理与多执行绪

范例程序主要来自於W3Schools

模组

  • 建立模组:新增一个.py档,使用欲使用的模组名称命名(这边命名为mymodule.py),程序内包含以下函式。
def greeting(name):
  print("Hello, " + name)
  • 使用模组:在程序开头import该模组(名称同模组的档案名称),即可使用此模组中的函示。
# 使用mymodule模组并取名为mx
import mymodule as mx

mymodule.greeting("Jonathan")
  • 列出模组内所有可使用的函式与变数
import math
print(dir(math))
  • 只引用模组内的某一个函式
from math import sqrt
print(sqrt(64))

PIP

PIP是Python的套件管理器,让我们可以很简单的下载我们所需要的套件或模组。

  • 列出目前已安装的套件
pip list
  • 下载套件
pip install [套件名称]

https://ithelp.ithome.com.tw/upload/images/20210919/20141886hE2akXxuc6.png

  • 移除套件
pip uninstall [套件名称]

档案处理

  • 档案开启
myfile = open("档案名称","模式")
模式 说明
"r" 唯读,若档案不存在会回传错误
"a" 附加,开启档案并在档案最末尾写入资料,若档案不存在会自动建立档案
"w" 写入,开启档案以写入资料,并覆盖旧资料,若档案不存在会自动建立档案
"x" 建立,建立档案,若档案已存在会回传错误

除了以上四种模式外,另外有两种修饰词用来指定档案以何种格式开启:

修饰词 说明
"t" Text mode
"b" binary mode
  • 档案读取
  1. 读取完整档案:file.read()
  2. 读取n个字元:file.read(n)
  3. 一次读取一行:file.readline()

范例:建立一个文字档 filesample.txt,其中内容如下:

Line 1: Good morning.
Line 2: Good afternoon.
Line 3: Good night.

情境一:读取完整档案

myfile = open("f:\\filesample.txt","r")

print(myfile.read())

https://ithelp.ithome.com.tw/upload/images/20210919/20141886UxO90hbAY9.png

情境二:读取n个字元

myfile = open("f:\\filesample.txt","r")

# 读取从最前面的10个字元
print(myfile.read(10))

# 接续之前的位置,继续向後读取5个字元
print(myfile.read(5))

https://ithelp.ithome.com.tw/upload/images/20210919/20141886avzpNE2h3a.png

情境三:一次读取一行

myfile = open("f:\\filesample.txt","r")

# 读取一行,印出
print(myfile.readline())

# 读取一行,不印出
myfile.readline()

# 读取一行,印出
print(myfile.readline())

https://ithelp.ithome.com.tw/upload/images/20210919/20141886jbGEd5rQ9Y.png

情境四:使用回圈方式读取档案

myfile = open("f:\\filesample.txt","r")

# 使用回圈的方式读取档案,每一个回圈会一次读取一行
for i in myfile:
  print(i)
  • 档案写入
    根据open的模式决定写入方法。
    语法:file.write(内容)

  • 档案关闭
    语法:file.close()

多执行绪处理

需使用threading模组。

  • 建立执行绪
mythread = threading.Thread(target=[function], args=())
# target:该执行绪要执行的物件
# args:给target调用的引数,Tuple型态
# 注:还有许多引数可使用,未来有需要再研究

注意,args需使用Tuple型态,如果物件本身只有一个引数:

# 错误写法
args=(arg1)

# 正确写法
args=(arg1,)
  • 执行绪开始
mythread.start()
  • 等待该执行绪结束
mythread.join()

范例:

import threading
import time

def mytask(x):
   for i in range(3):
    msg = "Thread {} is running. Count: {}"
    print(msg.format(x, i))
    time.sleep(1)

# 使用list储存执行绪
threadlist = []

# 执行绪开始
for i in range(4):
  threadlist.append(threading.Thread(target=mytask, args =(i,)))
  threadlist[i].start()

# 等待执行绪结束
for i in range(4):
  threadlist[i].join()
  msg = "Thread {} is completed."
  print(msg.format(i))

print ("Total complete")

https://ithelp.ithome.com.tw/upload/images/20210919/201418863O1QBp9yL5.png

值得注意的一点是,建立执行绪时,物件需要的引数必须使用args导入,不可一起放在target。

错误范例:

import threading
import time

def mytask(x):
   for i in range(3):
    msg = "Thread {} is running. Count: {}"
    print(msg.format(x, i))
    time.sleep(1)

# 使用list储存执行绪
threadlist = []

# 执行绪开始
for i in range(4):
  threadlist.append(threading.Thread(target = mytask(i))) # *** 错误范例 ***
  threadlist[i].start()

# 等待执行绪结束
for i in range(4):
  threadlist[i].join()
  msg = "Thread {} is completed."
  print(msg.format(i))

print ("Total complete")

最後产出结果会跟单执行绪相同,但目前还不太知道该如何解释这个原因,只能先把此错误情境记录下来:
https://ithelp.ithome.com.tw/upload/images/20210919/20141886CEkcy4GrjZ.png


<<:  JavaScript入门 Day14_如何使用数字6

>>:  Day-5 :阿公阿嬷都看得懂的前後端分离架构?

Day 18: To DI ? Or not DI? 依赖注入的存在意义

Keyword: Dependency Injection 到Day20 使用Koin管理依赖注入显...

【day8】居家办公的早餐diy卷饼

对比现在忙碌的工作 开始怀念过去两个月居家办公的时光 在相对有余裕的时候下厨 挑选自己喜欢的食物 一...

善用 Linux man-pages

Linux man-pages 提供与 Linux kernel 以及 GNU C library ...

WUSON CISSP应考策略

参加WUSON CISSP的培训课程,请大家务必上课作好笔记、课後复习及课前预习喔! 笔记是通过考...

ITHOME IRONMAN体验 Day 30-完赛心得

完赛心得 第13届的铁人赛30天的挑战终於结束了,从参赛至完赛的准备期大约用了二个月。 初期花了大於...