zoukankan      html  css  js  c++  java
  • python 读取或写入文件

      文件是数据存储的单位,文件中的数据以字节为单位进行顺序存储,汉字在GBK中占2个字节,在UTF-8中占3个字节

      文件的操作流程

    1. 打开文件
    2. 读/写文件
    3. 关闭文件

    注意:任何操作系统,一个应用程序同时打开文件的数量有最大数限制的,所以要记得关闭文件

    读取文件

    f = open(file='mynote.txt', mode='r*', encoding=None)

    参数

    • file:文件名或(相对/绝对)文件路径
    • mode"r":以只读方式打开文件(默认)
      • "t":文本文件模式打开(默认)
      • "b":二进制模式打开
    • encoding:python默认是ASCII编码,显示中文时会做一个ASCII到系统默认编码的转换,到时候会出错,所以一定要规定编码格式

    返回:文件流对象

    注意:如果打开文件失败,则会触发OSError错误

    try:
        f = open("./abc.txt")
        print("文件打开成功!")
        f.close()  # 关闭文件
    except OSError:
        print("打开文件失败!")

    python   文件读写的类型有两种

      文本文件(text file)     操作模式:'t'

      二进制文件(binary file)  操作模式:“b”

    文本文件操作:

    把文件的字节码自动转换为字符串,换行符会自动转换成' ',默认文件中存储的都为字节数据,以行为单位进行分隔,在python内部统一用' '作为换行进行分隔

      对文本文件读写需要用字符串(str)进行数据读取和写入

    各种操作系统的换行

      Linux换行符 : ' '
      Window换行符 : ' '
      旧的Macintosh换行符: ' '
      新的Mac Os 换行符 : ' '

    f.read()  

    从文件读取指定的字节流数,如果未给定或者为负则读取所有

    # 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.read(10)
    print "读取的字符串: %s" % (line)
    
    fo.close()    # 关闭文件
    
    # 文件名为:  runoob.txt
    # 读取的字符串: 1:www.runo
    f.read()

    f.readline()  

    从光标开始位置返回一行内容  返回字符串格式

     1 try:
     2     f = open("abc.txt")
     3     print("文件打开成功!")
     4     s = f.readline()    # 读取一行数据
     5     if s != '':
     6         print("读取成功,文字是:", s)
     7     else:
     8         print("文件内已经没有数据可读了")
     9     
    10     s = f.readline()
    11     print("第二行数据是:", s)
    12     s = f.readline()
    13     print("第三行数据是:", s)
    14     s = f.readline()
    15     if s == '':
    16         print("文件内已经没有数据可读取!")
    17     else:
    18         print('第四行数据是', s)
    19 
    20     f.close()
    21 except OSError:
    22     print("文件打开失败")
    f.readline()
    1 文件打开成功!
    2 读取成功,文字是:hello
    3 
    4 第二行数据是:world
    5 
    6 文件内已经没有数据可读取!
    结果

    f.readlines()  

    列表形式返回所有行内容,换行符也会读到

    1 try:
    2     f = open('../exercise/info.txt')
    3     L = f.readlines()  # 返回所有行文字的列表
    4     print(L)
    5     f.close()
    6 except OSError:
    7     print("打开文件文件")
    f.readlines()
    1 ['张三 23 45
    ', '历史 23 54']
    结果

    关闭文件

      f.close()  关闭,释放系统资源

    f = open("haha.txt","w")

     f.write("hello")

    如果写入的文件有内容,会清空内容再写入如果没有.txt文件,会先创建再写入

    f = open('mynote.txt', 'w')
    f.write('hello')
    f.close()

     以'a'模式打开文件并写入文件  追加

    1 f = open('mynote.txt', 'a')
    2 f.write('world')
    3 f.close()
    'a'模式打开并写入

     F.writelines(lines)  将列表中的内容写入文件,内容要是字符串

    1 f = open('mynote.txt', 'w')
    2 L = ['我是第一行
    ', '我是第二行']
    3 f.writelines(L)
    4 f.close()
    f.writelines(L)

    文件流对象是可迭代对象,迭代过程中将以换行符' '作为分隔符,实例:

    1 f = open('num.txt')
    2 for line in f:
    3     print(line)  # 打印每一行的数据

    标准输入输出文件

      模块名 :sys     sys.stdin:标准输入文件

    sys.stdin.readline()  从键盘读入一行信息,回车结束

    1 import sys
    2 while True:
    3     s = sys.stdin.readline()
    4     if len(s) < 2:
    5         break
    6     print("刚刚读入",len(s),"字符")
    7     print("s",s)
    sys.stdin.readline()
    1 dasd
    2 刚刚读入 5 字符
    3 s dasd
    结果

    sys.stdin.read()    从键盘读入多行信息,ctrl + d 输入文件结束符

    1 import sys
    2 s = sys.stdin.read()
    3 print(s)
    4 print("程序结束")
    sys.stdin.read()
    1 dsda
    2 fds
    3 ^D
    4 dsda
    5 fds
    6 
    7 
    8 程序结束
    结果

    sys.stdout.wirte() (向屏幕终端打印信息) print就是默认sys.stdout.write

    1 import sys
    2 sys.stdout.write("hello")
    3 sys.stdout.write(" ")
    4 sys.stdout.write("world
    ")
    sys.stdout.write("****")
    1 hello world
    结果
    1 f = open("stdout.txt",'w')
    2 print(1,2,3,4,sep='#',file = f)
    print(1,2,3,4,sep='#',file = f)
    1 1#2#3#4
    结果

    sys.stderr.write() (向屏幕终端打印错误输出)

    1 import sys
    2 sys.stdout.write("我是标准输出
    ")
    3 sys.stderr.write("我是错误输出
    ")
    sys.stderr.write("*")
    我是错误输出
    我是标准输出
    结果

        标准文件不需要打开和关闭就可以使用

    二进制文件操作:

     二进制文件操作模式字符:'b'

    默认文件中存储的是以字节为单位的数据,二进制文件操作需要用字节串进行读写

    f.read() / f.readline() / f.readlines() 返回类型

      对于文本文件,f.read()等函数返回为字符串(str)

      对于二进制文件,f.read()等函数返回为字节串(bytes)

    以二进制方式读取文件内容

     1 try:
     2     f = open('abc.txt', 'rb')
     3     # 读取数据,常用f.read读取
     4     b = f.read(5)  # <<== 5 代表5个字节(bytes)
     5     print(b)    #b'hello'
     6     b = f.read(2)
     7     print(b)    #b'xcexd2'
     8     b = f.read()  # 不加实参读取全部字节,直至文件尾
     9     print(b)    #b'xcaxc7xb5xdaxd2xbbxd0xd0
    '
    10     f.close()
    11 except OSError:
    12     print("打开文件失败!")
    f = open('abc.txt', 'rb')

    以二进制方式读取文件内容,然后再将其转换为字符串

     1 try:
     2     f = open('infos.txt', 'rb')
     3     # 读取数据,常用f.read读取
     4     b = f.read(5)  # <<== 5 代表5个字节(bytes)
     5     print(b)    #b'hello'
     6     b += f.read(2)
     7     print(b)    #b'helloxe4xb8'
     8     b += f.read()  # 不加实参读取全部字节,直至文件尾
     9     print(b)    #b'helloxe4xb8xadxe6x96x87'
    10     print('读取的内容转为文字后为:', b.decode('utf-8'))
    11     f.close()   #读取的内容转为文字后为: hello中文
    12 except OSError:
    13     print("打开文件失败!")
    f = open('infos.txt', 'rb')

    F.write()对于二进制文件需要用字节串进行操作

     1 try:
     2     f = open("data.bin", 'wb')
     3     # 在此处需要以字节串为单位进行写操作
     4     f.write(b'xe4')  # '中'字的编码: e4 b8 ad
     5     f.write(b'xb8')
     6     f.write(b'xad')
     7     f.write(b'
    x41x42x43')
     8     f.close()
     9 except OSError:
    10     print("文件打开失败!")
    f = open("data.bin", 'wb')

    f.tell()方法获取文件当前的读写位置  字节单位

    1 f = open('data.txt', 'rb')
    2 print("当前的读写位置是:", f.tell())  # 0
    3 b = f.read(5)
    4 print("当前的读写位置是:", f.tell())  # 5
    5 b = f.read()  # 读取全部内容
    6 print("文件最后的位置是:", f.tell())  # 20
    7 f.close()
    f.tell()

    F.seek(offset[,whence])方法来移动文件的读写指针位置  字节单位

    • offset -- 开始的偏移量

        • 大于0的数表示向文件尾开始移动偏移的字节数

        • 小于0的数表示向文件头开始移动偏移的字节数
    • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;

          0代表从文件开头开始算起,

          1代表从当前位置开始算起,

          2代表从文件末尾算起。

     1 f = open('data.txt', 'rb')
     2 # 方法1
     3 # f.seek(5, 0)  # 相对于文件头向后移动5个字节
     4 # 方法2
     5 # f.seek(-15, 2)  # 相对于文件尾向前移动15个字节
     6 # 方法3
     7 b = f.read(2)  # 先读取2个字节
     8 f.seek(3, 1)  # 相对于当前位置向后移动3个字节
     9 
    10 b = f.read(5)
    11 print(b)  # b'abcde'
    12 
    13 f.close()
    F.seek(offset, whence=0)

    清空缓冲区

     1 import time
     2 
     3 f = open('infos.txt', 'w')
     4 f.write('hello')
     5 f.flush()  # 强制清空缓冲区
     6 
     7 # for i in range(10000):
     8 #     f.write('helloooooo')
     9 #     time.sleep(0.01)
    10 
    11 print("程序开始睡觉...zzz")
    12 time.sleep(15)
    13 print("程序睡醒了,继续执行")
    14 
    15 f.close()
    f.flush()

     汉字在UTF-8中占3个字节,在GBK中占两个字节

    编码注释:
      在python源文件的第一行或第二行写入如下内容:
        # -*- coding:gbk -*-
        # 设置源文件编码格式为gbk
      或
        # -*- coding:utf-8 -*-
        # 设置源文件编码格式为utf-8
      作用:
        告诉解释执行器,此前文件的编码是什么?

  • 相关阅读:
    Linux动态链接(4)ldd与ldconfig
    Linux动态链接(3)so文件映射地址
    Linux动态链接(2)so初始化执行
    Linux动态链接(1)惰性链接
    kill信号由谁接收处理
    gdb调试器之"测不准原则"
    gdb动态库延迟断点及线程/进程创建相关事件处理(下)
    gdb动态库延迟断点及线程/进程创建相关事件处理(上)
    Redis集群,备份,哨兵机制
    hyper-v虚拟机centos7网络配置
  • 原文地址:https://www.cnblogs.com/LXP-Never/p/9343866.html
Copyright © 2011-2022 走看看