python文件IO中的二进制格式与文本格式

    技术2022-07-12  74

    方式

    open() 函数第二个参数是一个字符串,用于指定文件的打开方式,如果该字符串中出现 b,则表示以二进制格式打开文件;反之,则以普通的文本格式打开文件。

    对于 Windows平台最好用 b 打开二进制文件

    在 Windows 系统中,文件中用 “\r\n” 作为行末标识符(即换行符),当以文本格式读取文件时,会将 “\r\n” 转换成 “\n”;反之,以文本格式将数据写入文件时,会将 “\n” 转换成 “\r\n”。这种隐式转换换行符的行为,对用文本格式打开文本文件是没有问题的,但如果用文本格式打开二进制文件,就有可能改变文本中的数据(将 \r\n 隐式转换为 \n)。

    而在 Unix/Linux 系统中,默认的文件换行符就是 \n,因此在 Unix/Linux 系统中文本格式和二进制格式并无本质的区别。

    总的来说,为了保险起见,对于 Windows平台最好用 b 打开二进制文件;对于 Unix/Linux 平台,打开二进制文件,可以用 b,也可以不用。

    本文字来源于:http://c.biancheng.net/view/4723.html

    读写文本

    打开

    file = open('filename.ext', openmod) #打开文件 % openmod :r r+ w w+ a a+ file.close() #关闭文件

    file.write('string') file.write('string\n') # 换行 file.write('s=.2f\n' % ('val', 12.3455)) # 格式化字符串

    1、 write函数只能输出字符串,不能像C语言那样定义输出格式。

    2、 如果像这么做,需要先对要输出的内容转换为字符串。

    file.write('s=.2f\n' % ('val', 12.3455)) # 格式化字符串

    多行写入

    content = ['I have a dream.\n', 'One day, \n', 'former slaves and slave owners will join together,\n', 'as brotherhood.\n'] file.writelines(content)

    1、writelines()函数不会为你添加换行符,需要自己添加。

    读入文件内容

    file.read() # 读取文件所有内容 file.read(n) # 读取前n个字符

    需要注意的是read(n)。如果文件中有中文,一个中文字表示一个字符,不管其中内部编码是几个字节。读取完之后,光标移动n个字符。

    utf-8进行的编码 1、要读的文本文件的编码与打开文件时设置的编码一致。 2、假如我们的文本文件a.txt用的utf-8进行的编码。就可以进行下面设置。 3、如果两者没有设置成一致的,在读取时就会出错。 4、在Windows中, open方法打开的文件默认为GBK编码

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

    readline方式

    line1 = file.readline() str2 = file.readline(n) #读取本行的n个字符

    注意line1中包含回车符,读取完line1后,读取位置移动到下一行 读取完str2后,读取位置移动n个字符,可能还在本行。 如果n >= 本行的字符数(包含换行符), 最终读取的内容就是本行的字符,读取位置移到下一行; 如果n <本行的字符数(包含换行符), 最终读取的内容长度为n, 读取位置移动n个字符,读取位置还在本行。

    读写二进制文件

    二进制文件中都是一个一个的字节数据。因此读和写,都是针对字节数据的。

    def readStrFromFile(filePath): """ 从文件中读取字符串str param filePath: 文件路径 return string : 文本字符串 """ with open(filePath, "rb") as f: string = f.read() return string b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes_all = file.read() #读取文件所有的字节数据 bytes_read = file.read(n) #读取n个字节数据 file.write(bytes_read) #将字节数据写到文件

    1. 返回指定编码的字符串表示二进制数据

    bytes.decode(encoding="utf-8", errors="strict") bytearray.decode(encoding="utf-8", errors="strict") str = "教程"; str_utf8 = str.encode("UTF-8") str_gbk = str.encode("GBK") print(str) print("UTF-8 编码:", str_utf8) print("GBK 编码:", str_gbk) print("UTF-8 解码:", str_utf8.decode('UTF-8','strict')) print("GBK 解码:", str_gbk.decode('GBK','strict')) len=f.write('长风破浪会有时\r\n直挂云帆济沧海'.encode('utf-8'))

    2. 其他的格式的文件的转换

    在使用之前先导入struct库

    import struct struct.pack(fmt, v1, v2, ...) #将原始数据v1, v2, ...根据fmt格式转换为字节串 val_arr = struct.unpack(fmt, bytes_arr) #将字节数据byts_arr根据fmt格式转换为原始数据元组 val_arr

    例子

    b1 = struct.pack('>hif', 65, 123, 3.14) print([hex(i) for i in b1])

    这里的fmt为’>hif’ 表示数据为大端顺序,h表示一个short类型,也就是2个字节的整数,i表示一个int类型也就是4个字节表示的整数, f表示单精度浮点类型,也是4个字节。 因此这个fmt表示的10个字节的数据。

    注意:hif 对应于65,123,3.14 如果是hiff则可以是65,123,3.14,3.15

    更多:https://blog.csdn.net/WhoisPo/article/details/88608654

    异常处理

    异常处理同读取文件操作,try…finally…和with语句都适用

    换行符

    用 二进制 模式写入文本文件时,我们要自己写换行符的原始码,在UNIX、linux中的换行符是\n,在windows中换行符是\r\n

    通过 os模块 获取系统换行符,见下面链接: http://www.malaoshi.top/show_1EF2Q155hwJ9.html

    改造上面的程序,动态获取换行符,如下:

    import os with open('c:/users/mym/desktop/6.txt','wb') as f: s='长风破浪会有时'+os.linesep+'直挂云帆济沧海' len=f.write(s.encode('GBK')) print(len)

    刷新缓冲区,

    将 缓冲区中 的数据立刻 写入 文件中

    f.flush()

    例子

    import time with open('c:/users/mym/desktop/2.txt','wb') as f: f.write('白日依山尽\n黄河入海流\n') f.flush() f.write('欲穷千里目\n更上一层楼\n') time.sleep(10)

    休眠10秒,在10秒内,打开文件,可以看到下面内容:

    白日依山尽 黄河入海流 因为执行了flush()方法刷新缓冲区,写入文件。10秒后执行结束,再次将缓冲区中的数据写入文件中,最后结果如下:

    白日依山尽 黄河入海流 欲穷千里目 更上一层楼

    python3 跨目录模块调用

    我们使用print(sys.path)将path打印出来

    import sys import os sys.path.append(os.path.abspath("../model1")) # os.path.abspath(path) # 返回path规范化的绝对路径。

    参考

    https://www.malaoshi.top/show_1EF2PbRmHWiJ.html https://blog.csdn.net/WhoisPo/article/details/88608654 https://blog.csdn.net/WhoisPo/article/details/88608654 https://www.jianshu.com/p/61ed747680e2

    Processed: 0.016, SQL: 9