zoukankan      html  css  js  c++  java
  • Python—文件读写操作

    初识文件操作

    • 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异。
    • 打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使用的是r(只读)模式。
    • 只读操作(r, rb)、只写模式(w, wb)、追加(a, ab)、读写模式(r+, r+b)、写读模式(w+, w+b)、追加读(a+)。
    • 当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
    模式 描述
     r  以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
     rb  以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
     r+  打开一个文件用于读写。文件指针将会放在文件的开头。
     r+b  以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
     w  打开一个文件只用于写入。若该文件已存在则将其覆盖。若该文件不存在,创建新文件。
     wb  以二进制格式打开一个文件用于只写。若该文件已存在则将其覆盖。若该文件不存在,创建新文件。
     w+  打开一个文件用于读写。若该文件已存在则将其覆盖。若该文件不存在,创建新文件。
     w+b  以二进制格式打开一个文件用于读写。若该文件已存在则将其覆盖。若该文件不存在,创建新文件。
     a  打开一个文件用于追加。若该文件已存在,文件指针将会放在文件的结尾。
     ab  以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
     a+  打开一个文件用于读写。若该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。
     a+b  以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。

    文件内容:poem.txt

    沧海月明珠有泪,
    蓝田日暖玉生烟。
    此情可待成追忆,
    只是当时已惘然。

    基本读取文件

    # 读取文件,文件不存在会报错
    file = open("poem.txt", "rt")
     
    content1 = file.read()           # 把整个文件当做一个字符串返回,会加上每行末尾的换行符。打印输出的时候,遇到
    会自动换行。
    print content1, type(content1)   # 结果:沧海月明珠有泪,...只是当时已惘然。 <type 'str'>  附加:输出有换行格式的,这里不方便展示。
     
    content2 = file.read(15)         # 读取n个字符。如果再次读取,会在当前位置继续去读而不是从头读。如果使用的是rb模式. 则读取出来的是n个字节。
    print content2, type(content2)   # 结果:沧海月明珠  <type 'str'>
     
    content3 = file.readline()       # 一次读取一行数据,每次读取出来的数据都会有一个
    ,即换行符。可以使用strip()方法来去掉
    或者空格。
    print content3, type(content3)   # 结果:沧海月明珠有泪,  <type 'str'>  附加:输出有换行格式的,这里不方便展示。
     
    content4 = file.readlines()      # 返回一个列表,每一行作为一个元素.每一个元素都包括"
    "。
    print content4, type(content4)   # 结果:["沧海月明珠有泪,
    ", "蓝田日暖玉生烟
    ",...]。 <type 'list'>  附加:列表长度为4
    for line in content4:
    	print line.strip()
    
    for line in file:                # 循环读取.每次读取一行内容.不会产生内存溢出的问题.推荐使用.
        print line.strip()
     
    file.close()

    基本写入文件

    # 写入文件,文件不存在会创建新文件
    file = open("poem.txt", "wt")
     
    file.write("沧海月明珠有泪,
    蓝田日暖玉生烟。")              # 写入两行诗
    file.write("此情可待成追忆,".decode("utf-8").encode("utf-8"))
        
    file.writelines(["沧海月明珠有泪,
    ", "蓝田日暖玉生烟。"])   # 读取列表,写入两行诗
     
    file.flush()    # 刷新. 把缓冲区的内容写入到磁盘上.
    file.close()
    

    file对象相关的所有属性的列表

    属性 描述
    file.closed 如果文件已被关闭返回true,否则返回false。
    file.mode 返回被打开文件的访问模式。
    file.name 返回文件的名称。
    file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。

    高级文件读写

    # with语句来自动帮我们调用close()方法,推荐以后用这种方式读写文件。
    with open("poem.txt", "rb") as fr:
        fr.read()
        
    with open("poem.txt", "wb") as fw:
        fw.write('Hello, world!')
    

    字符编码

    # 要写入特定编码的文本文件,需要给open()函数传入encoding参数,将字符串自动转换成指定编码    
    with open("poem.txt", "wb", encoding='gbk') as fw:
        fw.write('Hello, world!')
        
    # 要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
    with open("poem.txt", "rb", encoding='gbk') as fr:
        fr.read()
        
    # 在文本文件中可能夹杂了一些非法编码的字符,可能会遇到UnicodeDecodeError。open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略。  
    with open("poem.txt", "rb", encoding='gbk', errors='ignore') as fr:
        fr.read()
    

    多个文件的读写,可以写成以下两种方式

    # 方式1:
    with open('poem1.txt','r') as f1:
        with open('poem2.txt','r') as f2:
            with open('poem3.txt','r') as f3:
            	........
            	
    # 方式2
    with open('poem1.txt','r') as f1:
    ........
    with open('poem2.txt','r') as f2:
    ........
    with open('poem3.txt','r') as f3:
    

     

  • 相关阅读:
    246.Strobogrammatic Number
    245.Shortest Word Distance III
    244.Shortest Word Distance II
    243.Shortest Word Distance
    242. Valid Anagram
    241. Different Ways to Add Parentheses
    240.Search in a 2D Matrix II
    239. Sliding Window Maximum
    238. Product of Array Except Self
    postgres 行列转换
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/11727026.html
Copyright © 2011-2022 走看看