Python 文件操作

    f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
    若要保证不乱码,文件以什么方式存的,就要以什么方式打开。

    f=open('a.txt','r',encoding='utf-8')

文件内光标移动
1: read(3):

  (1. 文件打开方式为文本模式时,代表读取3个字符

  (2. 文件打开方式为b模式时,代表读取3个字节

2: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

import time
with open('test.txt','rb') as f:
    f.seek(0,2)
    while True:
        line=f.readline()
        if line:
            print(line.decode('utf-8'))
        else:
            time.sleep(0.2)


            练习:基于seek实现tail -f功能

文件的修改
     文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        data=read_f.read() #全部读入内存,如果文件很大,会很卡
        data=data.replace('alex','SB') #在内存中完成修改

        write_f.write(data) #一次性写入新文件

    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')

   
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

    import os

    with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
        for line in read_f:
            line=line.replace('alex','SB')
            write_f.write(line)

    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt')



file对象常用的函数
    .....................................
    
    
Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。

Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串


学习内容
    1.读文件(处理)
    
    打开文件:
        fp = open(文件名,文件的打开方式)
        文件的打开方式。默认是r+。主要参数有r–只读,w–新建写,a–追加,(+)–可写,b–二进制方式。
        常用的有r+ – 读写模式打开,rb+ – 二进制读写模式,wb+ – 二进制格式打开,用于读写,若文件已存在则覆盖,不存在则新建,a+ – 追加写。
    读取文件
        read(size): 读取size的字节数。size为空时,读取文件所有字节。
        readlines(size):把读取到的值放在列表里存储并返回列表值。size并不是单纯的字节数,匹配到的是只要是大于某一行起始值的都会读出整行。
        readline(size):若当前行的值大于size,则读当size值。若小于,则返回当前行。为空则返回整行。
        迭代器:文件本身可以看做一个迭代器,循环操作。像下面这样循环遍历就可以全部读出了。
            f = open("foo.txt")
            for i in f:
                print (i)
        在文件内容比较大时,使用迭代器可以在不消耗大量内存的情况下,对文件进行操作。
    文件写入
        1.write(str):将字符串写入文件,一般情况下写入可以直接:            
            write("lily")
        
        
例子1:
    readlines是按照行读文件

    file=open('D:\\test.txt','r')
    for i in file.readlines():
    #     print(i)
        i=i.strip('\n')
        b=i.split(' ')
        if b[-1]=='18888888888':
            print('OMG')
        else:
            print(b)
    #     for a in b:
    #         print(a)
    #     print(type(i))
    file.close()


例子2:
    追加内容,open里面操作所用到参数为a,注意换行符

    file=open('D:\\test.txt','a')
    file.write('\nanihasaiyo1')
    file.close()


例子3:
    删除内容:
    1.把文件中所有内容放到一个变量里面
    2.把满足条件的数据重新写到文件里面

    with open('D:\\test.txt','r') as f:
        lines=f.readlines()
    with open('D:\\test.txt','w') as f1:
        for line in lines:
            if 'a' in line:
                continue
            f1.write(line)

 

posted @ 2018-12-21 18:24  SilentKiller  阅读(227)  评论(0)    收藏  举报