import test
导入test文件的模块
__import__('test')
导入test文件的模块
Windows系统文件默认是gbk编码.
open(‘文件路径’,encoding = ‘utf-8’),打开文件,设置源文件的编码模式,以f.close()关闭文件
也可以用with…as :语句,可以打开多个文件:
同一行代码太长,换行不影响结果,用 \ :
with open('马林2', 'r', encoding='utf-8') as f,\
open('马林','w',encoding='utf-8') as g:
pass
f.read()读取文件内容
f = open('马林',encoding='utf-8') #打开
print(f.read())
f.close() #释放
输出:
这里是马林文件内容
打开的文件类型有’r’只读,'w’只写,'a’追加
newline=’'代表不将其他系统的换行符比如\r\n转换为\n,读取真正的换行符
f = open('马林','r',encoding='utf-8',newline='') #r代表只读
print(f.read())
f.close() #释放
输出:
11111
222
3333
444
5555
666
readable()文件是否可读
readline()一次读取一行
f = open('马林', 'r', encoding='utf-8') # 只读
print(f.readable())
print('第一行:',f.readline())
print('第二行:',f.readline())
print('第三行:',f.readline())
f.close() # 释放
输出:
True
第一行: 11111
第二行: 222
第三行: 3333
readlines(4)读到第4个字符所在的位置行,并保存为列表:
f = open('马林', 'r', encoding='utf-8') # 只读
print(f.readlines(4))
f.close() # 释放
输出:
[‘我爱你\n’, ‘好不好\n’]
'w’只写模式时,如果文件存在,则先清空再操作,如果文件不存在,则先新建文件再操作.
writable()是否可写
f = open(‘马林2’, ‘w’, encoding=‘utf-8’) # 只写
print(f.writable())
f.write(‘11111111\n’)
f.write(‘22222222\n’)
f.close() # 释放
结果:
输出:
True
新建文件’马林2’
内容:
11111111
22222222
writelines()以一个列表的形式写入多行,元素必须都是字符串
f = open('马林2', 'w', encoding='utf-8') # 只写
print(f.writable())
f.writelines(['我爱你\n','小不点'])
f.close() # 释放
结果:
输出:
True
新建文件’马林2’
内容:
我爱你
小不点
'a’追加模式,可以追加,不能读:
f = open('马林2', 'a', encoding='utf-8') # 追加
print(f.writable())
print(f.readable())
f.write('11111111')
f.close() # 释放
结果:
输出:
True
False
内容:
我爱你
小不点
11111111
先’r’再’w’就是修改模式
f = open('马林2', 'r', encoding='utf-8') # 只读
data = f.readlines()
data[1] = '在这里修改\n'
f.close() # 释放
f = open('马林2', 'w', encoding='utf-8') # 只写
f.writelines(data)
f.close()
原文:
这是第一行
这是第二行
这是第三行
现文:
这是第一行
在这里修改
这是第三行
'r+'读写模式,可读,可写:
代码中执行了读和写,则写为追加,
with open('马林2', 'r+', encoding='utf-8') as f:
data = '这是新内容/n'
f.write(data)
f.readline()
原文:
11111
22222
33333
44444
现文:
11111
22222
33333
44444这是新内容/n
代码中只执行了写,则从开头改写
with open('马林2', 'r+', encoding='utf-8') as f:
data = '这是新内容/n'
f.write(data)
原文:
11111
22222
33333
44444
现文:
这是新内容/n33
44444
‘rb’,‘wb’,‘ab’,字节模式,不能指定编码:
with open('马林','rb') as f:
data = f.read()
print(data)
输出:
b’1111\r\n2222\r\n\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0’
字节转换为源内容,需要方法解码decode():
with open('马林','rb') as f:
data = f.read()
print(data.decode('utf-8'))
输出:
1111
2222
我爱你
在’wb’模式下写内容,需要先把内容转换为字节
bytes(s,encoding=‘utf-8’),将字符串s以编码utf-8转换为字节
with open('马林','wb') as f:
s = '这是新内容'
s2 = bytes(s,encoding='utf-8')
f.write(s2)
结果:
内容更新为:
这是新内容
方法encode()也可以将字符串进行转换为字节
with open('马林','wb') as f:
s = '这是新内容2'
f.write(s.encode('utf-8'))
结果:
内容更新为:
这是新内容2
文件方法f.closed,判断是否关闭
f.encoding,取文件打开的编码
f.flush()刷新到到硬盘
f.name文件名
处理文件的方法,只有read是以字符为单位,其余都是以字节为单位
f.tell告诉光标的位置(字节为单位)
f.seek(12)从开头将光标移动12个位置(字节为单位),如果遇到中文中间的位置会报错
f.seek(12,y)有3种模式移动光标,默认0是一绝对位置移动:
y=1是以相对位置移动,必须在b模式下才能移动:
with open('马林','wb') as f:
f.seek(12,0)
print(f.tell())
f.seek(-4,1)
print(f.tell())
输出:
12
8
y=2是从文件末尾开始移动,必须在b模式下才能移动:
with open('马林','rb') as f:
f.seek(0,2)
print(f.tell())
f.seek(-10,2)
print(f.tell())
输出:
33
23
f.read(4)从头读到第4个字符
f.readline(4)从头读到第4个字符所在的行
f.truncate(10)在写模式’r+’'a+‘下(不能在’w’‘w+模式’),截取10个字节单位
循环文件的方式是i in f:
查找日志的最后一行:
with open('马林','rb') as f:
for i in f: #循环文件
offs = 0
while True:
f.seek(offs,2) #光标的初始位置在末尾
data = f.readlines()
if len(data) > 1: #读取的数据超过一行
print(data[-1].decode('utf-8'),end='') #打印最后一行
break
offs -= 10 #步长
日志文件:
2017/12/11 alex 干了一件事
2017/12/12 alex 干了一件事
2017/12/13 alex 干了一件事
2017/12/14 alex 干了一件事
2017/12/15 alex 干了一件事
2017/12/16 sb 干了一件sb事
输出:
2017/12/16 sb 干了一件sb事