open() 函数第二个参数是一个字符串,用于指定文件的打开方式,如果该字符串中出现 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) #将字节数据写到文件在使用之前先导入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秒后执行结束,再次将缓冲区中的数据写入文件中,最后结果如下:
白日依山尽 黄河入海流 欲穷千里目 更上一层楼
我们使用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