zoukankan      html  css  js  c++  java
  • day3_文件操作

    对文件的操作:

    1、打开文件获取文件的句柄,句柄就理解为这个文件

    2、通过文件句柄操作文件

    3、关闭文件。

    一、open函数

    1、语法:

    file object = open(file_name [, access_mode][, buffering])

    各个参数的细节如下:

    • file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
    • access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
    • buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

    二、模式说明:

    r:以只读方式打开文件。文件指针会放在文件的开头。这是默认模式,打卡文件不存在的话,会报错

    w: 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

    a: 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    w+:打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

    r+:打开一个文件用于读写。文件指针将会放在文件的开头。

    a+:打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

    rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。

    rb+:以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。

    wb: 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

    wb+:以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

    ab:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

    ab+:以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    其他说明:

    1、w+模式,read()方法会清空文件

    f = open('users.txt','w+',encoding='utf-8')  #w+模式打开文件
    print(f.read())   #读不出来任何内容,反而会把文件中内容清空

    2、r+模式,先读后写,没有将前面内容清空,因为指针读完在最后

    f = open('users.txt','r+',encoding='utf-8')  #w+模式打开文件
    print(f.read())   #读完指针在最后
    f.write('AAA')    #前面内容么有清空,在文件后面填上了AAA

    三、常用方法汇总(牛牛杂货铺):

                f open('file.txt','r+',encoding='utf-8')#encoding参数可以指定文件的编码

                f.readline()#读一行
                f.readable()#判断文件是否可读
                fr.writable()#判断文件是否可写
                fr.encoding#打印文件的编码
                f.read()#读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
                f.readlines()#读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
                f.tell()#获取当前文件的指针指向
                f.seek(0)#把当前文件指针指向哪
                f.write('爱情证书')#写入内容
                f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中
                f.truncate()#清空文件内容
                f.writelines(['爱情证书','孙燕姿'])#将一个列表写入文件中
                f.close()关闭文件

    1、 flush() 方法

    是用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。

    一般情况下,文件关闭后会自动刷新到硬盘中,但有时你需要在关闭前刷新到硬盘中,这时就可以使用 flush() 方法。

    语法

    flush() 方法语法如下:

    fileObject.flush()
    参数:无

    返回值:没有

    2、close()方法

    新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。

    当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。

    3、write()方法

    用于向文件中写入指定字符串。

    在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。

    如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str'。

    write()方法不会在字符串的结尾添加换行符(' '):

    语法:fileObject.write( [ str ])

    参数:str -- 要写入文件的字符串。

    返回值:返回的是写入的字符长度。

    f = open('users.txt','w+',encoding='utf-8')  #打开文件
    print(f.write('加入'))  #返回写入的字符串长度
    f.seek(0)               #w+将原内容清楚,写入,指针在最末尾,所以移到最前面才能读出来
    print(f.read())

    结果:

    2
    加入

    4、writelines() 

    用于向文件中写入一序列的字符串。(元素必须是字符串)

    这一序列字符串可以是由迭代对象产生的,如一个字符串列表。

    换行需要制定换行符 。

    语法

    writelines() 方法语法如下:

    fileObject.writelines(iterable)
    参数:iterable -- 可迭代对象(字符串、列表、元祖、字典)。

    返回值:没有返回值

    f = open('users.txt','a+',encoding='utf-8')  #打开文件
    str1 = 'abc
    '
    list1 = ['a','b','c','
    ']
    tupl1 = ('a','b','c','
    ')
    dict1 = {'a':1,'b':2}
    res = f.writelines(str1)  #迭代写入字符串字符
    res = f.writelines(list1)  #迭代写入列表元素
    res = f.writelines(tupl1)  #迭代写入元组元素
    res = f.writelines(dict1)  #迭代写入字典的key
    f.seek(0)
    print(f.read())

    结果:

    abc
    abc
    abc
    ba

    如果序列中不是字符串

    f = open('users.txt','a+',encoding='utf-8')  #打开文件
    list2 = [1,2,3]
    tupl2 = (1,2,3)
    dict2 = {1:1,2:2}
    res = f.writelines(list2)
    res = f.writelines(tupl2)
    res = f.writelines(dict2)

    结果报错:TypeError: write() argument must be str, not int

    5、read()方法

    从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。

    语法:fileObject.read( size );

    参数:size -- 这是从文件中读取的字节数。

    返回值:此方法返回读取的字节数的字符串形式

    f = open('users.txt')  #打开相对目录下文件,默认模式r
    print(f.read())         #可以读出users.txt里的全部内容
    f = open('users.txt',encoding='utf-8')  #如果文件里有中文,写上encoding='utf-8
    print(f.read())
    f = open(r'E:
    hyusers.txt.txt',encoding='utf-8')  #打开文件如果写相对路径,在路径前面加个r(声明字符串不需要转义)
    print(f.read())

    6、readline()

     方法用于从文件读取整行,包括 " " 字符。如果指定了一个非负数的参数,则返回指定大小的字符数,包括 " " 字符。

    语法

    readline() 方法语法如下:

    fileObject.readline([size])
    参数:size -- 从文件中读取的字符数。

    f = open(r'E:
    hyusers.txt.txt',encoding='utf-8')  #打开文件如果写相对路径,在路径前面加个r(声明字符串不需要转义)
    print(f.readline())  #第一行被打印出来
    print(f.readline())  #第二行被打印出来

    输出结果:

    111
    
    22222222

    备注:源文件中111与22222222之间没有空行,但是为什么打印出空行来了呢?

    原因:python 中print()非常友好,会自动读取换行符打印换行,

    >>> f = open(r'E:
    hyusers.txt.txt',encoding='utf-8')
    >>> f.readline() #没有print,输的字符串中包含换行符
    '111
    '
    >>> f = open(r'E:
    hyusers.txt.txt',encoding='utf-8')
    >>> print(f.readline()) #print()会非常友好,将换行符自动当换行符使用了,所以111下面出了一行空行
    111

    7、readlines()

    用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。

    如果碰到结束符 EOF 则返回空字符串。

    语法:fileObject.readlines()

    参数:无

    返回值:返回列表,包含所有的行。

    f = open('users.txt',encoding='utf-8')  #打开文件
    print(f.readlines())  #返回列表

    输出结果:

    ['test1,123456
    ', 'test2,34545
    ', '联系,23424']

    8、seek() 方法

    用于移动文件读取指针到指定位置。

    语法:fileObject.seek(offset[,whence])

    参数说明:

    offset -- 偏移量,也就是代表需要移动偏移的字节数,注意是按照字节算的,字符编码存每个字符所占的字节长度不一样。

           如“路飞学城” 用gbk存是2个字节一个字,用utf-8就是3个字节,因此以gbk打开时,seek(4) 就把光标切换到了“飞”和“学”两个字中间。
           但如果是utf8,seek(4)会导致,拿到了飞这个字的一部分字节,打印的话会报错,因为处理剩下的文本时发现用utf8处理不了了,因为编码对不上了。少了一个字节。

    whence可选,默认值为 0。表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

     

    实例:

    f = open('user.txt','w+')
    f.write('alsdkjfklasdf')
    f.seek(0)                           #写完之后,指针在最末尾,需要把指针放到最前面才能读出来全部内容
    print(f.read())
    f.close()

    输出:

    alsdkjfklasdf

    9、replace() 方法

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

     语法:str.replace(old, new[, max])

    参数:

    • old -- 将被替换的子字符串。
    • new -- 新字符串,用于替换old子字符串。
    • max -- 可选字符串, 替换不超过 max 次

    返回值:返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。

    str1 = 'abc'
    res = str1.replace('abc','ABC')  #替换字符串中的abc为ABC,返回一个新字符串
    print(res) #打印新字符串

    结果:

    ABC

    四、with使用:

    在操作文件的时候,经常忘了关闭文件,这样的就可以使用with,它会在使用完这个文件句柄之后,自动关闭该文件,注意with下面的语句需要缩进,使用方式如下:

    举例1:

    1 with open('file_test','r',encoding='utf-8') as f:
    2     print(f.tell())           #获取file_test文件指针指向
    3     print(f.readline())
    4     print(f.tell())

    举例2:
    1 with open('file_test','r',encoding='utf-8') as f: #打开一个文件,把这个文件的句柄付给f
    2     for line in f:
    3         print(line)

    举例3:
    1 with open('file_test','r',encoding='utf-8') as fr,open('file_test_bat.txt','w',encoding='utf-8') as fw:#多个文件操作,读file_test文件,写入file_test_bat文件,file_test_bat没有自动创建
    2     for line in fr:#循环每一行
    3         fw.write(line)#写到file_test_bat文件中
    4 with open('file_test_bat.txt','r',encoding='utf-8') as fw:#读一下复制出来的文件
    5     print(fw.read())

     五、二进制模式文件  模式后面加上b

    f = open('Chrysanthemum.jpg','rb')
    print(f.read())
    
    

    使用strip()函数去掉每行结束的

    
    

    例如:

    
    

    1)

    
    

     for line in file.readlines():

    
    

          line=line.strip(' ')

    
    

    2)

    
    
    #读取 ip地址文件 写入 ip_address 列表
    ip_address = []
    with open('ip.txt', 'r') as f1:
    for ip in f1.readlines():
    if ip != None:
    # 从文件中读取行数据时,会带换行符,使用strip函数去掉 换行符后存入列表
    ip_address.append(ip.strip(" "))
    f1.close()
     



  • 相关阅读:
    用命令创建MySQL数据库
    Linux下安装mysql
    MySQL字符集及校对规则的理解
    Mybatis 高级结果映射 ResultMap Association Collection
    查看linux系统版本命令
    hdu 1217 Arbitrage (最小生成树)
    hdu 2544 最短路(两点间最短路径)
    hdu 3371 Connect the Cities(最小生成树)
    hdu 1301 Jungle Roads (最小生成树)
    hdu 1875 畅通工程再续(prim方法求得最小生成树)
  • 原文地址:https://www.cnblogs.com/once-again/p/9562594.html
Copyright © 2011-2022 走看看