您的位置:首页 > 编程语言 > Python开发

5. Python开发--文件操作

2017-05-18 12:50 260 查看
# 以读r的方式打开文件
f=open('a.txt',encoding='utf-8',mode='r')
print(f)    # f是一个文件句柄对象
data1=f.read()  # 读文件
print(data1)
print('=====================================')
data2=f.read()      # 读不到内容,因上面读过一次文件,读取文件的光标指针已经移动到文件末尾
print('data2====>',data2) #读不到内容
f.close()

# ############## File seek() 方法#######################
# seek() 方法用于移动文件读取指针到指定位置。
# 语法
# seek() 方法语法如下:
# fileObject.seek(offset[, whence])
# 参数
# offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
# whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
# 返回值
# 该函数没有返回值。
# 实例
# 以下实例演示了 readline() 方法的使用:
# 文件 runoob.txt 的内容如下:
# 1:www.runoob.com
# 2:www.runoob.com
# 3:www.runoob.com
# 4:www.runoob.com
# 5:www.runoob.com
# 循环读取文件的内容:
# 打开文件
fo = open("runoob.txt", "rw+")
print("文件名为: ", fo.name)

line = fo.readline()
print("读取的数据为: %s" % line)

# 重新设置文件读取指针到开头
fo.seek(0, 0)
line = fo.readline()
print("读取的数据为: %s" % line)

# 关闭文件
fo.close()
# 以上实例输出结果为:
# 文件名为:  runoob.txt
# 读取的数据为: 1:www.runoob.com
# 读取的数据为: 1:www.runoob.com
########################################

f = open('a.txt', encoding='utf-8', mode='r')
print(f.closed)  # 判断文件是否是关闭状态
print(f.encoding)  # 获取文件的字符编码
print(f.name)  # 获取文件名
print(f.readable()) # 判断文件是否是r模式打开的
f.close()

f = open('a.txt', encoding='utf-8', mode='r')
print(f.readline(),end='') # 一次读一行,print打印一行末尾默认有一个换行符,end=''将换行符去掉
print(f.readline())
print(f.readline(),end='')
f.close()

f = open('a.txt', encoding='utf-8', mode='r')
print(f.readlines())    # 一次读取所有行的内容,存成列表的形式
f.close()

f1=open('b.txt','w',encoding='utf-8') # 以写w的方式打开文件:文件存在则清空,不存在则创建
f2=open('a.txt','r',encoding='utf-8') # 以读的方式打开文件,文件不存在则报错
print(f1.writable())    # 判断文件是否以写的方式打开(是否可写)

f1.write('111111\n22222222')
f1.seek(0)  # 将写文件的光标指针移动到文件开始位置
f1.write('\n333333\n444444')    # 再次写入将覆盖f1.write('111111\n22222222')的写入
f1.writelines(['\n55555\n','6666\n','77777\n']) # 将列表写入文件,每个列表元素一行
f1.close()

# ###文件的修改操作###
import os
read_f=open('b.txt','r',encoding='utf-8')
write_f=open('.b.txt.swap','w',encoding='utf-8') # 创建一个写临时文件句柄对象
for line in read_f.readlines(): # 循环读取的文件每一行(列表)
    if line.startswith('333333'):
        line='2222222222\n' # 替换一行的内容
    write_f.write(line)
read_f.close()
write_f.close()
os.remove('b.txt')  # 删除原文件
os.rename('.b.txt.swap','b.txt')    # 将临时文件重命名为原文件名
#################################
# 其他文件操作模式
# f=open('a.txt','r+') #读写
# f=open('a.txt','w+') #写读
# f=open('a.txt','a+') #追加并且读

# 文件上下文管理,通过with关键字打开的文件当程序退出缩进之后自动关闭文件句柄,不需要再f.close()
with open('a.txt', 'r', encoding='utf-8') as f_a, open('b.txt') as f_b:
    print(f_a.read())
    print('====>')

# 补充for或者while循环和else字句结合使用,当for或者while循环不被break打断,就会执行else的代码
# 用法:循环如果正常执行完成的话就打印日志,标识循环完成。
for i in range(3):
    print(i)
    # continue
    if i == 1:
        break  # 循环被break之后,就不会执行else代码
else:
    print('=============>') #当for循环不被break打断,就会执行else的代码

# 如下例,文件正常写完之后,打印日志写入完成
with open('a.txt','r',encoding='utf-8') as read_f,\
        open('aa.txt','w',encoding='utf-8') as write_f:

    for line in read_f:
        write_f.write(line)
    else:
        print('write successfull')  #如果写入失败则不会打印该行。

###以字节方式读取文件,需要解码后才可正常显示字符
with open('a.txt','rb') as f:
    print(f.read().decode('utf-8'))

###以字节方式写文件,并指定文件编码格式是utf-8
with open('c.txt','wb') as f:
    f.write('哈哈哈'.encode('utf-8'))

# 文本的方式读不了二进制文件(例如图片),如下方式读取图片报错
f=open('sb.jpg','r',encoding='utf-8')
print(f.read())

# 二进制文件需要以字节码的方式读取和写入,如下代码是将一张图片复制了一份:
with open('sb.jpg','rb') as read_f,\
        open('sb_alex.jpg','wb') as write_f:
    data=read_f.read()
    write_f.write(data)

with open('a.txt','r',encoding='utf-8') as f:
    print(f.read(3))  # 数字指的是读3个字符

with open('a.txt','rb') as f:
    print(f.read(2))  # 数字指的是读取2个字节(bytes)

with open('a.txt','r',encoding='utf-8') as f:
    f.seek(3)  # seek内指定的数字代表光标移动的字节数
    print(f.tell())    # 当前光标所在的位置
    print(f.read())

with open('aa.txt','r+',encoding='utf-8') as f:
    f.seek(3)  # seek内指定的数字代表光标移动的字节数
    print(f.read())
    f.truncate(1)

with open('b.txt','rb') as f:
    f.read()
    f.seek(3) # 默认情况,是以文件起始位置作为开始,往后移动3个bytes
    print(f.read(1))    #开始读取第4个字节
    print(f.tell())    # 当前光标位置应该是第4个字节处
    f.seek(2,1)  # 第二个参数1代表以当前光标所在的位置为开始,往后移动(第一个参数)2个 bytes
    print(f.tell())    # 此时光标应该在第6个字节处

    f.seek(-1,2)  # 第2个参数 2 表以文件末尾位置为开始,第1个参数 -1 标识往前移动1个 bytes
    print(f.tell())
    f.seek(0,2) #光标移动到文件末尾
    print(f.tell())

with open('c.txt','r',encoding='utf-8') as f:
    f.seek(0,2)    #光标移动到文件的末尾开始,往后移动 0 个字节。
    print('====>',f.read())

## tail -f access.log tail -f 命令应用
import time
with open('access.log','r',encoding='utf-8') as f:
    f.seek(0,2)
    while True:
        line=f.readline().strip()
        if line:
            print('新增一行日志',line)
        time.sleep(0.5)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: