文件操作

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事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值