文件读写
打开文件
1 2 3 4 |
# 打开文件 f = open("test.txt", "r", encoding="utf-8") # 第一个参数为打开的文件路径,第二个参数为打开模式 # 关闭文件 f.close() |
打开模式说明
模式 | 作用 |
---|---|
b | 二进制模式 |
r | 只读方式 |
w | 只写方式(指针在开头,重写文件) |
a | 追加模式(指针在结尾,追加内容) |
r+ | 读写模式 |
w+ | 写读模式 |
a+ | 追加读写模式 |
读取文件
读取并打印文件内容
1 2 3 4 5 |
f = open("test.txt", "r", encoding="utf-8") print(f.read()) #一次性读取文件所有内容 print(f.read(10)) #读取到指定位置 print(f.readline()) #一次读取一行 print(f.readlines()) #按行读取所有内容,返回由每行组成的列表 |
使用迭代器读取
1 2 3 4 |
f = open("test.txt", "r", encoding="utf-8") # f作为迭代器,一次读取一行,下一行覆盖内存中的前一行 for line in f: print(line) |
写入文件
覆写
1 2 3 |
f = open("test.txt", "w", encoding="utf-8") f.write("Hello world\n") f.write("===========\n") |
追加
1 2 |
f = open("test.txt", "a", encoding="utf-8") f.write("Hello world\n") |
读写
1 2 3 4 |
# 可以读取文件,写入文件到结尾(只读+追加) f = open("test.txt", "r+", encoding="utf-8") f.readline() f.write("Hello world\n") |
二进制写入
1 2 |
f = open("test.txt", "wb") f.write("Hello world\n".encode()) # 使用encode函数转换为二进制数据 |
指针操作
获取当前指针位置
1 2 3 |
f = open("test.txt", "r", encoding="utf-8") f.read(5) # 读取5个字符 print(f.tell()) # 获取当前指针位置 |
移动指针到指定位置
1 2 3 4 |
f = open("test.txt", "r", encoding="utf-8") f.read() f.seek(0) # 移动指针到位置0(即文件开头) print(f.tell()) |
flush
不等待缓冲区,直接写入硬盘
1 2 3 4 |
f = open("test.txt", "a", encoding="utf-8") f.write("Hello world\n") f.flush() f.write("Hello world\n") |
truncate
从指定位置开始清除内容
1 2 |
f = open("test.txt", "a", encoding="utf-8") f.truncate(10) #不指定位置默认从开头开始清除 |
文件字符集
unicode
万国码,包含所有字符的编码,每个字符占三个字节,各种类型的字符集之间转换都必须先转为unicode编码(python3默认使用unicode编码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# -*- coding:utf-8-*- s = "你好" print("coding:", s) # s_unicode =s.decode("utf-8") # python2中需要先转为unicode s_unicode = s print("unicode:", s_unicode) s_gbk = s_unicode.encode("gbk") print("gbk:", s_gbk) s_utf8 = s_gbk.decode("gbk").encode("utf-8") print("utf-8:", s_utf8) s_gb2312 = s_utf8.decode("utf-8").encode("gb2312") print("gb2312:", s_gb2312) |
utf-8
unicode的扩展集,英文和特殊符号使用1个字节,其他语言占三个字节
gbk
中文的字符集,占两个字节,兼容gb2312和gb18030
函数与过程
定义
函数:定义一组操作及其执行结果
1 2 3 |
def func1(): print("Hello") return 0 |
过程:定义一组不返回执行结果的操作(默认会返回NONE)
1 2 |
def func2(): print("Hello") |
调用
1 |
func1() |
参数
函数和过程以参数的形式接受外部传入值
1 2 3 4 |
def func(x) print(x) func("Hello") |
位置参数
传入的参数位置与函数定义的参数一一对应
1 2 3 4 5 |
def func(x,y) print(x) print(y) func("Hello", "world") |
关键字参数
以键值对(Key-Value)的方式传递参数,参数位置无需与函数定义的保持一致
1 2 3 4 5 6 |
def func(x,y) print(x) print(y) func(y="world", x="Hello") |
关键字参数与位置参数混合使用,关键字参数只能在位置参数后面
1 2 3 4 5 6 |
def func(x,y) print(x) print(y) func("Hello", y="world") |
默认参数
为函数某些参数指定默认值,如果不传入该参数,则使用默认值,否则使用传入值
1 2 3 4 5 6 7 |
def func(name,city="Beijing") print(name) print(city) func("Bob") #name为Bob,city为Beijing func("Bob", "Guangzhou") #name为Bob,city为Guangzhou |
非固定参数
*args:接收不固定个数的位置参数,并保存到一个元组里(args为约定俗成的元组名)
1 2 3 4 5 6 |
def func(x,*args) print(x) print(args) func("Hello", "world", "Nice", "to", "meet", "you") |
**kwargs:接收不固定个数的关键字参数,并保存到一个字典里(kwargs为约定俗成的字典名)
1 2 3 4 5 6 |
def func(name,**kwargs) print(name) print(kwargs) func(name="Bob", age="30", city="Beijing", score="90") |
局部变量
函数内部定义的变量只在函数内部有效
1 2 3 4 5 6 7 8 |
def func(_name) name = _name print(name) name = "Bob" func("Winner") print(name) |
全局变量
在代码顶层定义的变量为全局变量,可以在函数内部调用,但无法直接修改(如需修改,需要使用global关键字声明)
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 |
# 定义全局变量 name = "Bob" city = "Beijing" def func1(_name): # 在函数内尝试重新定义全局变量 name = _name # 函数内部访问全局变量city print("Welcome %s from %s" % (name, city)) # 调用 func1("Winner") print("name after func1 in global:", name) print("".center(20, "#")) def func2(_name): # 声明全局变量city global city # 修改已声明全局变量city city = "Guangzhou" # 修改未声明全局变量name name = _name print("Welcome %s from %s" % (name, city)) func2("Winner") print("name after func2 in global:", name) print("city after func2 in global:", city) |
列表、字典、集合、类可以直接在函数内修改
1 2 3 4 5 6 7 8 9 10 |
list1 = ["Bob", "Winner", "Victor"] def func3(_name): list1[0] = _name print(list1) func3("Alex") print("list1 after func3 in global:", list1) |
递归函数
递归函数必须明确指明终止的条件
1 2 3 4 5 6 7 8 9 |
def calc(n): print(n) # 只有当n/2结构大于1时才递归调用自身 if int(n/2) > 0: return calc(int(n/2)) return n calc(12) |
高阶函数
将其他函数以参数的形式传递到函数内部使用
1 2 3 4 |
def calc(x, y, f): return f(x)+f(y) calc(3, -2, abs) # abs 函数,取绝对值 |
原文链接:Python 从入门到放弃 - Lesson 3 函数、字符编码、文件读写,转载请注明来源!