3. excel常见的操作

填充

img

img

拆分

img

排序和筛选

img

img

下拉表

img

img

## 单元格

查找和替换

复制粘贴

表格转表

  • 列是基础的数据字段
  • 易于处理大量数据
  • 关联外部数据

2020/02/21 posted in  excel

2. python语法入门

注释

对代码的解释和说明, 可以提供代码的可读性。

注释分为单行注释和多行注释
单行注释是以 # 开始
多行注释,可以使用三个双引号或者三个单引号""" """ ''' '''

# 定义字符串变量name
'''
我是多行注释
我是多行注释
我是多行注释
'''
age=19
"""
我是多行注释
我是多行注释
我是多行注释
"""

sex='男'

注意: ctr + / -> 单⾏行注释快捷键

变量的定义

变量: 通俗理解就是存储程序数据的容器。

变量定义的格式:变量名 = 数据 (变量名尽量有含义,方便理解 )

score=100 #定义一个变量名字叫score,存储的数据是100
print(score)

name='张三'
print(name)

pi=3.14
print(pi)

is_ok =True
print(is_ok)

#提示:在python里面不需要指定数据的类型,会根据数据自动推导出数据类型

#通过type查看变量类型
score_type=type(score)
print(score_type)

name_type=type(name)
print(name_type)

pi_type=type(pi)
print(pi_type)

print(type(is_ok))

总结: 常用的数据类型 int,str, float, bool, list, tuple, dict,set

变量的命名规则

变量名:是由字母,数字,下划线组成的,注意只有这三种,但不能以数字开头

错误的使用:

3name='李四'
print(3name)
name!age=18

变量命名方式: 驼峰命名法 和 下划线命名法
驼峰命名法: 小驼峰和大驼峰 小驼峰: 第一个单词首字母要小写,其它单词首字母都大写 大驼峰: 每个单词首字母都大写
下划线命名: 单词都使用小写字母,单词之间使用下划线进行分割, 比如: my_name

my_name='李四' #下划线命名
myName='李四' #小驼峰
MyName='李四' #大驼峰

关键字

关键字: 在python里面具有特殊功能的标识符(理解成变量名、函数名), 关键字不能作为变量名使用。

['False', 'None', 'True', 'and', 'as',
 'assert', 'break', 'class', 'continue', 'def', 
'del', 'elif', 'else', 'except', 'finally',
 'for', 'from', 'global', 'if', 'import',
 'in', 'is', 'lambda', 'nonlocal', 'not', 
'or', 'pass', 'raise', 'return', 'try',
'while', 'with', 'yield']

常用的数据类型转换

函数 说明
int(x [,base ]) 将x转换为一个整数
float(x ) 将x转换为一个浮点数
complex(real [,imag ]) 创建一个复数,real为实部,imag为虚部
str(x ) 将对象 x 转换为字符串串
repr(x ) 将对象 x 转换为表达式字符串串
eval(str ) 用来计算在字符串串中的有效Python表达式,并返回一个对象
tuple(s ) 将序列列 s 转换为一个元组
list(s ) 将序列列 s 转换为一个列列表
chr(x ) 将一个整数转换为一个Unicode字符
ord(x ) 将一个字符转换为它的ASCII整数值
hex(x ) 将一个整数转换为一个十六进制字符串串
oct(x ) 将一个整数转换为一个八进制字符串串
bin(x ) 将一个整数转换为一个二进制字符串串

输入和输出

生活中无时无刻其实都存在输入和输出的例子,我们先举例看一下生活中有哪些输入输出的情况,在来对比Python中的输入输出和生活中的有什么相同和不同之处。

生活中的输出

我们经常会去电影院看电影,我们从电影院屏幕中获取影片的内容来观看影片,而影片的放映室经过投影仪""照射""到大屏幕,同样的也可以说是投影仪把影片输出到大荧幕上来供我们观看,这就是生活中最简单的输出方式。

Python中的输出

Python中的输出和生活中的输出是一样的原理理,只不不过Python中的输出,特指是在控制台中输出,或 者是将你准备要输出的内容相应的输出到你的设备上,如你在手机上看到的文字、图片、视频等数据,其 实本质上也是我们敲打代码输出到手机上的.那我们先来看一下第一种,如何将你想要输出文字输出到控制台.

例如我们将一段文字"Hello World"输出到控制台,这里面利用的 print() 函数进行输出,以后我们会讲到函数的概念,先暂时知道print()可以帮助我们进行输出。

print('hello world')

右键点击选择 Run 和你对应的要运⾏行的⽂文件名字就可以运⾏行刚刚的输出代码

我们在图⽚片最下方看见的输出结果为hello world 输出的位置就是控制台

我们可以试试输出100+100会是什什么结果

print(100+100)

生活中的输入

生活中的输入无处不在,例如你需要在各种软件中输入的账号密码,去ATM机器取钱也同样需要输入密码。

Python中的输入

和输出同理理我们也可用到控制台来记录输入结果,同样用到一个函数 input() ,我们可以利用这段代码在控制台输入,然后在利用刚刚学的 print() 函数把你输入的结果在输出来。

name=input()
print(name)

当你运行完毕 name = input () 代码并将鼠标光标移动到控制台,Python交互式命令就在等你的输入了,你可以输入任意字符,然后按回车完成输入。

格式化输出

# 格式化符号:%s,%d,%f,%x
# %s:输出字符串
# %d:输出int类型数字
# %f:输出浮点数
# %x:输出16进制数据

score=100
print('python成绩为:%d'% sore)

if语句

计算机之所以能做很多⾃自动化的任务,因为它可以自己做条件判断。

比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用 if 语句实现:

age=20
if age >=18:
    print('your age is',age)
    print('adult')

根据Python的缩进规则,如果 if 语句判断是 True ,就把缩进的两行print语句执行了,否则,什么也不做。

也可以给 if 添加一个 else 语句,意思是,如果 if 判断是 False ,不要执行 if 的内容,去把 else 执行了:

age = 3
if age >= 18:
    print('your age is', age) 
    print('adult')
else:
    print('your age is', age) 
    print('teenager')

注意不不要少写了冒号: 。

当然上面的判断是很粗略的,完全可以用 elif 做更细致的判断:

age = 3
if age >= 18:
    print('adult') 
elif age >= 6:
    print('teenager') 
else:
    print('kid')

elif 是else if 的缩写,完全可以有多个 elif ,所以 if 语句的完整形式就是:

if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>

if 语句执行有个特点,它是从上往下判断,如果在某个判断上是 True ,把该判断对应的语句执行后, 就忽略掉剩下的elif 和 else ,所以,请测试并解释为什么下面的程序打印的是 teenager :

age = 20
if age >= 6:
    print('teenager') 
elif age >= 18:
    print('adult') 
else:
    print('kid')

运算符

算数运算符

Python支持以下几种运算符:

运算符 描述 实例
+ 两个对象相加 a + b 输出结果 30
- 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 两个数相乘或是返回一个被重复若⼲干次的字符串串 a * b 输出结果 200
/ b / a 输出结果 2
// 取整除 返回商的整数部分 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0
% 取余 返回除法的余数 b % a 输出结果 0
** 指数 a**b 为10的20次方, 输出结果 100000000000000000000

混合运算时,优先级顺序为:(*)高于()(/)(%)(//)高于(+)(-) 为了避免歧义,建议使用 () 来处理运算符优先级。并且,不同类型的数字在进行混合运算时,整数将会转换成浮点数进行运算。

赋值运算符

运算符 描述 实例
= 赋值运算符 把 = 号右边的结果 赋给 左边的变量,如 num = 1 + 2 * 3,结果num的值为7
# 单个变量赋值
num = 10

# 多个变量赋值
num1, num2, f1, str1 = 100, 200, 3.14, "hello"

复合赋值运算符

运算符 描述 实例例
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c** = a 等效于 c = c a
//= 取整除赋值运算符 c //= a 等效于 c = c // a

循环

我们来试想这样一种情况,现在让你们在控制台输出100条hello world ,本质上,我们写一百条 print 函数输出就可以了,但是如果一千条一万条呢.这就要用到循环语句了.

while循环

while循环语句语法

while 条件:
    条件满足时,做的事情1 
    条件满足时,做的事情2 
    条件满足时,做的事情3

例例如输出100条 hello world

i = 100
whiel i <=100:
    print('hello world')
    i + 1

相对应,在while循环语句里面,每执行一次循环语句, i 就会加1,直到i 等于101时不满足 i<=100 的条件,循环就结束了

for循环

for循环和while一样同样可以进行循环,并且是运用最多的循环方式,而且它有一项非常厉害的功能——遍历 ,在Python中 for 循环可以遍历任何序列项目,如字符串,或者今后会学到的列表,例如我们遍历字符串,就特指将字符串的所有字符全部访问一遍

names = ['Michael', 'Bob', 'Tracy'] 
for name in names:
    print(name)

执行这段代码,会依次打印 names 的每一个元素:

Michael 
Bob 
Tracy

所以for x in ... 循环就是把每个元素代入变量x ,然后执行缩进块的语句。再比如我们想计算1-10的整数之和,可以用一个 sum 变量做累加:

sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    sum = sum + x 
    print(sum)

Python还提供了一个range()函数,可以配合我们的for循环使用,例如:

for i in range(5): 
    print(i)

#效果等同于 while 循环的:

i = 0
while i < 5:
    print(i) 
    i += 1

我们在来学习两个关键字 breake continue ,这两个关键字是我们循环语句的好帮手

break

在循环中, break 语句可以提前退出循环。例如,本来要循环打印1~100的数字:

n = 1
while n <= 100: 
    print(n)
    n = n + 1 
print('END')

上面的代码可以打印出1~100。

如果要提前结束循环,可以用 break 语句:

n = 1
while n <= 100:
    if n > 10: # 当n = 11时,条件满足,执行break语句
        break # break语句会结束当前循环
    print(n) 
    n = n + 1
print('END')

执行上面的代码可以看到,打印出1~10后,紧接着打印 END ,程序结束。可见 break 的作用是提前结束循环。

continue

在循环过程中,也可以通过 continue 语句,跳过当前的这次循环,直接开始下一次循环。

n = 0
while n < 10:
    n = n + 1 
    print(n)

上面的程序可以打印出1~10。但是,如果我们想只打印奇数,可以用 continue 语句跳过某些循环:

n = 0
while n < 10:
    n = n + 1
    if n % 2 == 0: # 如果n是偶数,执行continue语句
        continue # continue语句会直接继续下⼀一轮循环,后续的print()语句不不会执行
    print(n)

执行上面的代码可以看到,打印的不再是1~10,而是1,3,5,7,9。 可见 continue 的作用是提前结束本轮循环,并直接开始下一轮循环。

2020/02/21 posted in  基础

6. python包的使用及读写

捕获异常

一旦出错,还要一级一级上报,直到某个函数可以处理该错误(比如,给用户输出一个错误信息)。所以高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外。 让我们用一个例子来看看try的机制:

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e: 
    print('except:', e)
finally:
    print('finally...') 
print('END')
try...
except: division by zero
finally...
END

当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是 直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

上面的代码在计算10 / 0时会产生一个除法运算错误:

try...
except: division by zero finally...
END

从输出可以看到,当错误发生时,后续语句print('result:', r)不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。

如果把除数0改成2,则执行结果如下:

try...
result: 5 
finally... 
END

由于没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句)。

你还可以猜测,错误应该有很多种类,如果发生了不同类型的错误,应该由不同的except语句块处理。没错,可以 有多个except来捕获不同类型的错误:

try:
    print('try...') 
    r = 10 / int('a')
    print('result:', r) 
except ValueError as e:
    print('ValueError:', e) 
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e) 
finally:
    print('finally...') 
print('END')

int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError。

此外,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:

try:
    print('try...') 
    r = 10 / int('2')
    print('result:', r) 
except ValueError as e:
    print('ValueError:', e) 
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e) 
else:
    print('no error!') 
finally:
    print('finally...') 
print('END')

Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是, 它不但捕获该类型的错误,还把其子类也“一网打尽”。比如:

try:
    foo()
except ValueError as e: 
    print('ValueError')
except UnicodeError as e: 
    print('UnicodeError')

第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了。

Python所有的错误都是从BaseException类派生的,常见的错误类型和继承关系

使用try...except捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo(),foo() 调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e: 
        print('Error:', e)
    finally:
        print('finally...')

也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。

python所有的标准异常类:

异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
SystemExit Python 解释器请求退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError 系统调用失败
ImportError 导入模块/对象失败
KeyboardInterrupt 用户中断执行(通常是输入C)
LookupError 无效数据查询的基类
IndexError 序列中没有没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalError 访问未初始化的本地变量
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告

模块

模块:通俗理解一个.py文件就是一个模块,模块是管理功能代码的。

内置模块:就是python自己内部自带的不需要我们去下载的模块, 比如:time, random等。

自定义模块的使用

注意:自定义模块名字和变量名的定义很类似,都是由字母、数字、下划线组成,但是不能以数字开头,否则无法导入该模块。

创建名为first_module的自定义模块

__all__= ["g_num", "show"]
# 指定 all 表示 from 模块名 import * 只能使用指定的功能代码,而不是所有的功能代码
# 定义全局变量
g_num = 10
# 定义函数 
def show():
    print("我是一个函数")
# 定义类
class Student(object):
    def init (self, name, age): 
        self.name = name
        self.age = age 
    
    def show_msg(self):
        print(self.name, self.age)
# 解决导入的模块中方法没有调用就会执行
if __name__== '__main__': 
    show()
我是一个函数

使用自定义的模块

# 导入模块
import first_module
# 使用模块中的功能代码
print(first_module.g_num) first_module.show()
stu = first_module.Student("李四", 20)
stu.show_msg()

注意:使用 name 查看模块名,执行哪个文件,哪个文件中的__name__输出__main__ , 其他导入模块中的__name__结果就是模块名字。

模块导入的注意点:

  1. 自定义的模块名不要和系统的模块名重名,
  2. 导入的功能代码不要在当前模块定义否则使用不了导入模块的功能代码

包的介绍

包:通俗理解包就是一个文件夹,只不过文件夹里面有一个init.py文件,包是管理模块的, 模块是管理功能代码的。

# -----import导入包里面的模块----
import first_package.first

#-----import导入包里面的模块设置别名----
import first_package.first as one

#----from导入包名 import 模块名----
from first_package import second

#--- from 包名.模块名 import 功能代码----
from first_package.first import show    # 需要保证当前模块没有导入模块的功能代码
# --- from 包名 import *, 默认不会导入包里面的所有模块,需要在init文件里面使用   all  去指定导入的模块
from first_package import *

__init__文件写法
# 如果外界使用from 包名 import * 不会导入包里面的所有模块,需要使用 all 指定
     all    = ["first", "second"]
# 从当前包导入对应的模块
from . import first from . import second

文件基础操作

文件简介

文件包括文本文件和二进制文件(声音,图像,视频) 从存储方式来说,文件在磁盘上的存储方式都是二进制形式, 所以,文本文件其实也应该算二进制文件。先从他们的区别来说,虽然都是二进制文件,但是二进制代表的意思不一 样。打个比方,一个人,我们可以叫他的大名,以叫他的小名,但其实都是代表这个人。二进制读写是将内存里面的数据直接读写入文本中,而文本呢,则是将数据先转换成了字符串,再写入到文本中。

读文件

要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:

f = open('/Users/michael/test.txt', 'r')

标示符'r'表示读,这样,我们就成功地打开了一个文件。

如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:

f=open('/Users/michael/notfound.txt', 'r')
---------------------------------------------------------------------------

FileNotFoundError                         Traceback (most recent call last)

<ipython-input-115-56fe20145a26> in <module>()
----> 1 f=open('/Users/michael/notfound.txt', 'r')


FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'

如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str 对象表示:

f.read() 'Hello, world!'

最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操 作系统同一时间能打开的文件数量也是有限的:

f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:
    f = open('/path/to/file', 'r') 
    print(f.read())
finally:
    if f:
        f.close()

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

with open('/path/to/file', 'r') as f:
    print(f.read())

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便

for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

文件的打开方式

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

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
 f.read()
'测试'

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的 字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件:

f = open('/Users/michael/test.txt', 'w')
f.write('Hello, world!')
f.close()

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不 会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

所以,还是用with语句来得保险:

with open('/Users/michael/test.txt', 'w') as f: f.write('Hello, world!')

要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。

注意:以'w'模式写入文件时,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。如果我们希望追加到文件末尾怎么办?可以传入'a'以追加(append)模式写入。

2020/02/21 posted in  基础