zoukankan      html  css  js  c++  java
  • python-文件读写

    python对文件的操作
    对文件操作的步骤:
    1、打开文件
    2、读写文件
    3、关闭文件

    一、读取文件的方法有三种:read(),readline(),readlines()
    f.readline() #每次读出一行数据,返回的是一个list,读完指针下移,适合大文件
    f.readlines() #读取文件里所有数据,保存在一个list变量中,每行作为一个元素,换行会读到 ,读取大文件比较占内存
    f.read(size) #从当前位置起读取size字节文件,若无参数size,则读取至文件结束为止,文件不存在的时候会报错
    #输出为字符串对象,需要对字符串进行分割后才能使用(f.read().splitlines())
    A、read()方法:
    f = open('file.txt','r') #以只读的方式打开一个文件,获取文件句柄,如果只读的话,r可以不写,默认只读
    f.read()
    print(f)
    date = f.read().splitlines()
    print(date)
    f.close() #关闭文件

    B、readline()方法:
    f = open('file.txt')
    line = f.readline()
    while line:
    print(line)
    line = f.readline()
    f.close()

    C、readlines()方法:
    f = open('file.txt')
    lines = f.readlines()
    for line in lines:
    print(line)
    f.close()

    二、打开文件的模式
    r,只读模式(默认)。
    w,只写模式。【不可读;不存在则创建;存在则删除内容;】
    a,追加模式。【不可读; 不存在则创建;存在则只追加内容;】
    "+"表示可以同时读写文件
    r+,【可读、可写;可追加,如果打开的文件不存在的话,会报错】
    w+,【写读模式,使用w+的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】
    a+,【追加读写模式,不存在则创建;存在则只追加内容,读不到东西;】
    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)
    rU、r+U
    "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
    rb、wb、ab(断点续传)
    r+b、w+b、a+b
    三、文件操作
    f = open('file.txt','r+',encoding='utf-8') #打开文件,并赋值给f,encoding='utf-8'让中文可以正常显示不会报错
    f.readline() #读一行
    f.readable() #判断文件是否可读
    fr.writable() #判断文件是否可写
    fr.encoding #打印文件的编码
    f.read() #读取所有内容,大文件不要用
    f.readlines() #读取所有文件内容,大文件不要用
    f.tell() #返回光标所在位置
    f.seek(0) #移动指针到文件的哪个位置,0表示最前面
    f.seek(0,2) #移动指针到文件的末尾;两个参数,表示偏移量,从XX开始偏移,默认0:开头,1:当前位置,2:末尾
    f.write('XXX') #写入内容
    f.fulsh() #写入文件后,立即从内容把数据写到磁盘中
    f.truncate() #从文件指针的位置清空文件内容
    f.writelines(['XX','XX']) #将一个列表写入文件中
    f.close() #关闭文件

    #f.write()和f.writelines区别
    1、write()需要传入一个字符串做为参数,否则会报错
    2、writelines()既可以传入字符串又可以传入一个字符序列,并将该字符序列写入文件
    3、如果使用list写入txt文件,可以写入多行;如果使用str写入txt文件,则只能写入一行。
    4、在list中的每个元素末尾必须加上’ ’的换行符,否则list中的各元素将写入一行之中
    #例如:
    l = ['123 ','456 ','789 ']
    f.writeline(l) #传一个list,把list里面的每一个元素,写到文件里
    f = open('a.txt')
    f.close()


    ##循环文件对象,每次取一行,读完一行的话,就会释放一行的内容
    f = open('file.txt')
    for line in f:
    print(line)

    #with自动关闭文件
    在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,使用方式如下:
    with open('file.txt','r') as f: #打开一个文件,把这个文件的句柄赋给f,代码自己判断文件调用完,自动关闭
    for line in f:
    print(line)
    with open('file.txt') as fr,with open('file_bak','w') as fw: #这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件
    for line in fr #循环file.txt中每一行
    fw.write(line) #写到file_bak文件中

    四、修改文件
    方法一:(简单粗暴的)文件内容全部读取到内容,原有文件内容清空,重写新内容
    with open('account.txt','r+') as fr:
    l = []
    for line in f:
    line = line.strip().split(',')
    sum = int(line_list[0] + line_list[1] + line_list[2]
    avg = sum //3
    new_line = '%s,%s '%(line,avg)
    l.append(new_res)
    fr.seek(0)
    fr.truncate()
    fr.write(l)
    fr.close()
    方法二:(高效的方式重点)先打开原来文件,再打开一个空文件,循环处理原来文件每一行,处理后写入新文件,把原来文件删掉,把新文件改为原来名字
    with open('account.txt') as fr,with open('account_new','w') as fw: #这个是多文件的操作,打开两个文件,fr是读file.txt,fw是新建一个file_bak文件
    for line in fr:#循环file.txt中的每一行
    line = line.strip()
    line_list = line.split(',')
    sum = int(line_list[0] + line_list[1] + line_list[2]
    avg = sum //3
    new_line = '%s,%s '%(line,avg)
    fw.write(new_line)#写到文件中
    fw.flush() #立即写入文件
    import os #文件操作
    os.remove('account.txt') #删除源文件
    os.rename('account_new','account') #修改文件名
    五、练习
    # 找到超过20次的ip地址
    #1、打开文件
    #2、依次读取文件里面的每行
    #3、取到每行里面的ip地址 split
    #4、存到字典里面,ip做key,次数做value
    #5、循环字典,如果value大于20,那么就输出出来
    #6、每隔1分钟监控一次
    import time
    point = 0
    while True:
    with open('access.log',encoding='utf-8') as f:
    f.seek(point)
    ips = {}
    for line in f:
    ip = line.split()[0]
    if ip not in ips:
    ips[ip] = 1
    else:
    ips[ip] += 1
    point = f.tell()
    for k,v in ips.items():
    if v >=20:
    print('有问题的ip地址是%s'%k)
    time.sleep(60)





  • 相关阅读:
    centos7 hbase 搭建笔记
    【转】python 2.6.6升级到python 2.7.x版本的方法
    centos7 sqoop 1 搭建笔记
    centos7 hive + 远程mysql 搭建笔记
    docker 批量操作容器
    centos7 hdfs yarn spark 搭建笔记
    【转】mysql查看表空间占用情况
    【转】Centos 7 修改主机名hostname
    jQuery选择
    jQuery检查复选框是否被选
  • 原文地址:https://www.cnblogs.com/qx21007874/p/10725075.html
Copyright © 2011-2022 走看看