2018-04-12周4课程笔记
Python的文件操作
读取、覆写、追加
读文件的常用方法(取等于取走)
f.mode r读 w写 a追加 binary
f.open(file, mode, buffering)
read() 把文件的所有内容都读取出来,返回一个字符串
fr.readline() 每次调用,依序读取fr文件的每一行,返回一个每行的字符串数据
readlines() 读取文件内容,返回一个list,文件的每一行,依序算作一个元素
# 也可以导入os,使用mkdir等操作文件
# 读文件,有读就有关,不存在就会报错
fr = open("untitled.txt", "r", encoding="utf-8")
text1 =fr.read() # fr.*只能用一次,除非再次赋值
print(text1)
print("#1#")
# 测试文件 2.txt 这里不加编码提示gbk错误
fr = open("2.txt", "r", encoding="utf-8")
text1 =fr.read() # fr.*只能用一次,除非再次赋值
print(text1)
print("#22#")
text1 =fr.readline() # fr.*只能用一次,除非再次赋值
print(text1) # 可以看到有一个回车被取出来,这是因为已经全取出来了,只剩空行
print("#333#")
fr = open("untitled.txt", "r", encoding="utf-8")# fr再次赋值
text2 =fr.readline() #按序取用
print(text2) # 单取一行的时候会反映出换行
print("#4444#")
text2 =fr.readline() #按序取用
print(text2) # 这里也看到换行
print("#555555#")
# 这里不去再次赋值,可以发现打印出来了剩余内容
text3 =fr.readlines() # 读取文件内容
print(text3)
print("#6666666#")
# 重来一遍
fr = open("untitled.txt", "r", encoding="utf-8")# fr再次赋值
text2 =fr.readline() #按序取用
print(text2) # 单取一行的时候会反映出换行
print("#4444#")
text2 =fr.readline() #按序取用
text2 =fr.readline() #按序取用
print(text2) # 这里取了两次,下文可以看到我们只有四行
print("#555555#")
# 这里不去再次赋值,可以发现打印出来了剩余内容
text3 =fr.readline() # 读取第四行
print(text3)# 发现没有换行了
print("#6666666#")
# 这里再次赋值,可以发现打印出来了全部内容
fr = open("untitled.txt", "r", encoding="utf-8")# fr再次赋值
text3 =fr.readlines() # 读取文件内容
print(text3)#
print("#77777777#")
fr.close()
line 1
line2
line33
lin e4
#1#
hello world
中 文
no 作 no diehello world
中 文
no 作 no diehello world
中 文
no 作 no die
#22#
#333#
line 1
#4444#
line2
#555555#
['line33 \n', 'lin e4']
#6666666#
line 1
#4444#
line33
#555555#
lin e4
#6666666#
['line 1\n', 'line2\n', 'line33 \n', 'lin e4']
#77777777#
f1 = open("1.txt", "r", encoding="utf-8")
for line1 in f1.readlines():
print(line1)
f1.close()
print("#2#")
f2 = open("1.txt", "r", encoding="utf-8")
for line2 in f2.readline():# 出错
print(line2)
f2.close()
print("#3#")
f3 = open("1.txt", "r", encoding="utf-8")
for line3 in f3.read():
print(line3)
f3.close()
print("#1#")
hello world
中文
no 作 no diehello world
中 文
no 作 no die
#2#
h
e
l
l
o
w
o
r
l
d
#3#
h
e
l
l
o
w
o
r
l
d
中
文
n
o
作
n
o
d
i
e
h
e
l
l
o
w
o
r
l
d
中
文
n
o
作
n
o
d
i
e
#1#
# 可以打印行号
f1 = open("1.txt", "r", encoding="utf-8")
for i,line in enumerate(f1.readlines()):
print("第{0}行:{1}".format(i,line))
f1.close()
第0行:hello world
第1行:中文
第2行:no 作 no diehello world
第3行:中 文
第4行:no 作 no die
写文件的常用方法
write(data) 把字符串data写入到文件中,只接受字符串参数
writelines() 参数是序列,比如列表,它会迭代帮你写入文件
ENCODING="utf-8"# 规范要求,全局申明,所有字母都大写
# 写文件
fw = open("1.txt", "w", encoding=ENCODING)# w覆写 python3一定要指定编码参数
fw.write("hello world\n中文\nno 作 no die")
print("w")
fw.close()
fr = open("1.txt", "r", encoding=ENCODING)
text1 =fr.read()
print(text1)
fr.close()
# 避免编码维护麻烦,可以把编码使用全局申明
fw = open("1.txt", "a", encoding=ENCODING)# a追加 python3一定要指定编码参数
fw.write("hello world\n中 文\nno 作 no die")
print("ww")
fw.close()
fr = open("1.txt", "r", encoding=ENCODING)
text2 =fr.read()
print(text2)
fr.close()
w
hello world
中文
no 作 no die
ww
hello world
中文
no 作 no diehello world
中 文
no 作 no die
文件属性:
f.mode r读 w写 a追加 binary
f.open(file, mode, buffering)
f.name 文件名
f.encoding 查看文件编码
f.fileno 文件描述符(用于内核操作)
help(f.fileno) 用于文件描述符,以后用
f.close 关闭
f.closed 返回bool判断是否已关闭
不常用:
f.seek(self, offset, whence)
按照偏移量移动光标,带正反方向参数,0开始位,1当前位,2结束位;"r"模式打开,仅支持0参数;"rb" 需要用b模式打开,二进制模式,才支持0和1和2;正数向后偏移,负数向前偏移。
f.tell()
返回文件光标位置,1开头(文件每一行存储的时候回车换行占两个字符,就是\n)
f.truncate(self, size)
保留多少位,(0)就是清空,只有写文件后才可以用
With方法
为了节省每次都需要f.close()的环节,文件用完以后自动关闭,with我个人还是很喜欢用的。
with open("untitled.txt", "r") as f:
print(f.read())
line 1
line2
line33
lin e4
ENCODING="utf-8"
import codecs# python2上对文件编码的影响特别明显
with codecs.open("untitled.txt", "r" ,encoding=ENCODING) as f:#加codecs加encoding最保险
print(f.read())
line 1
line2
line33
lin e4
函数的定义
如果从上到下,仅仅是一个逻辑(过程),会很恶心,一般一个函数里面的逻辑,不要超过30行。通过不同的函数封装不同的逻辑。
只有调用了之后,才会运行函数。函数名直接传入参数就可以。存在形参,形参收到的值就是实参
约定好函数,相互协作,快速开发(实际多是划分不同的模块,不是单个的函数)
函数代码块以def关键字开头 + 函数名 + (参数):
然后第一行内容应该缩进,然后写我们自己的代码逻辑
return 关键字 代表函数执行完返回的值
pass 关键字 代表什么都不干
exit(num) 强行退出
# 第一个例子,这里不调用执行,就不会有输出
def add(x, y):
print("x = {0}".format(x))
print("y = {0}".format(y))
print("x + y = {0}".format(x+y))
return x+y
add(1,2)
print(add(3,4))
x = 1
y = 2
x + y = 3
x = 3
y = 4
x + y = 7
7
#实现阶乘
def jiechen(n):
if n == 0:
return 1
else:
result = 1
for i in range(1, n+1):
result *= i
return result# 很重要的返回,否则类型就难处理
def main():
n=10
count = 0
i = 0
for i in range(0, n+1):
count += jiechen(i)# 这里使用的是返回值,一定要检查函数的返回设定
print("count = {0}".format(count))
# main() 不规范
#"__main__"别人按照这个规范来找程序的入口,等于是封装了
if __name__ == '__main__':
main()
count = 4037914
练习:输入年月日,计算当天是该年的第几天
分析:公历记法,简单的判断闰年,计算天。
参数类型:
我们经常在看别人的代码中,经常出现def(*args, **kwargs)这样的表现形式:
*args list 没有对照的一一对过来 tuple (4,5,6)
**kwargs dict 符合条件的一一对过来 {"k": "v"}
#注意定义形参加上的*和**
def fun(a,b,c, *args, **kwargs):# 形参实参一一对照
print(a)# a取用之后,占掉了1
print(b)# b取用之后,占掉了2
print(c)# c取用之后,占掉了3
print(args)# 所以这里没有1,2,3
print(kwargs)
pass
# *args # 将用户输入参数的以列表的形式输入
# **kwargs # keywords
a=0
b=0
fun(1,2,3,4,5,6,d=1,e=2,f=3)
1
2
3
(4, 5, 6)
{'d': 1, 'e': 2, 'f': 3}
匿名函数lambda
很简单的函数可以这样写
add= lambda x,y:x+y # 存在可能逻辑不清晰,不建议用
等价于
def add(x,y):
return x+y
匿名函数的定义:
顾名思义就是没有名字的函数,那为什么要设立匿名函数,他有什么作用呢?
lambda 函数是一种快速定义,单行的最小函数,可以用在任何需要函数的地方
def fun(x,y)
return x*y
lambda版本:
r = lambda x,y:x*y