2018-04-12周4课程笔记

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

练习ss求绝对值(abs)

















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值