一、文件的概念
1.1 概念
文件是指存储在外部介质上的数据的集合,一批数据是以文件的形式存放在外部介质上的(eg:硬盘、u盘),操作系统是以文件为单位对数据进行管理的。
1.2 分类
文本文件
文本文件也称为ASCII文件,由ASCII码组成且不带任何格式,通常使用文本处理软件编辑。
文件的读取必须从文件的头部开始,一次全部读出,不能只读取中间的一部分数据,不可以跳跃式访问,不可以同时进行读操作和写操作。
二进制文件
二进制文件是直接将二进制码存放在文件中,以字节为单位访问数据,不能使用文本处理软件编辑。
二进制文件按照字节等方式进行存取和访问。
根据存储数据的性质可以将文件分为程序文件和数据文件。
根据文件的流向分为输入和输出文件。
二、打开文件
使用open() 函数可以打开文件
语法格式:
<文件对象名>= open (name [,mode[,buffering]])
name是文件名及路径
mode 访问方式,可选参数,表示打开文件的方式,默认为’r’,只读方式
buffering 缓冲方式, 可选参数 ,控制文件是否缓冲,0表示不缓冲,1表示只缓冲一行数据,任何大于1的值表示使用指定的值作为缓冲区的大小,给定负值表示使用系统默认缓冲机制,默认值为-1。有缓冲的话,数据的读写操作通过内存来运行,只有使用flush() 或 close() 函数才会更新硬盘上的数据。无缓冲的话,所有的读写操作都直接更新硬盘上的数据。
f=open(…)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件
在windows下是gbk,在linux下是utf-8。
文件打开方式
| 模式 | 描述 |
|---|---|
| r | 以只读的方式打开文件,文件的指针放在文件的头部,默认方式 |
| w | 以只写的方式打开文件,如果文件存在则覆盖该文件,如果文件不存在,则创建写入新文件 |
| a | 以追加方式打开文件,如果文件存在,则文件指针指向该文件的结尾,如果该文件不存在,则创建一个用于写入的新文件 |
| rb | 以二进制只读方式打开一个文件,文件指针置于文件的开头 |
| wb | 以二进制只写方式打开一个文件,如果文件存在则覆盖该文件,如果文件不存在,则创建写入新文件 |
| ab | 以二进制追加方式打开一个文件,如果文件存在,则文件指针指向该文件的末尾,如果文件不存在,则创建一个用于写入的新文件 |
| r+ | 以读/写方式打开一个文件,文件指针置于头部 |
| w+ | 以读/写方式打开一个文件,如果文件存在则覆盖现有文件,如果文件不存在,则创建写入新文件 |
| a+ | 以追加和读/写方式打开一个文件,如果文件存在,则文件指针指向该文件的末尾,如果文件不存在,则创建一个用于写入的新文件 |
| rb+ | 以二进制读/写方式打开一个文件,文件指针置于文件的头部 |
| wb+ | 以二进制读/写方式打开一个文件,如果文件存在则覆盖现有文件,如果文件不存在,则创建用于读/写的新文件 |
| ab+ | 以二进制追加和读/写方式打开一个文件,如果文件存在则覆盖现有文件,如果文件不存在,则创建用于读/写的新文件 |
ff = open('C:\Users\lh\Desktop\1.txt','w',1)##报错File "e:/pythonstduy/time.py", line 317ff = open('C:\Users\lh\Desktop\1.txt','w',1)^SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape##解决Python中 \ 是转义符,\u表示其后是UNICODE编码,因此\User在这里会报错,在字符串前面加个 r(rawstring 原生字符串),可以避免python与正则表达式语法的冲突!ff = open(r'C:\Users\lh\Desktop\1.txt','w',1)
三、关闭文件
文件关闭就是使指向该文件对象的引用不再指向该对象,以后不能再通过该引用对原来与其相联系的文件进行读/写操作,除非再次打开,使得该文件引用变量重新指向新的文件。
使用close() 函数。
语法格式: <文件对象名>.close()
使用close() 函数关闭该文件,使得文件对象名不再指向文件。
当file对象被引用到操作另一个文件的时候,Python会自动关闭之前的file对象。
四、读取文件
4.1 read()
read() 方法用于从文件读取指定的字符数,如果没有指定或为负,则读取所有
语法格式:fileObject.read(size) size用于返回指定的字符数
ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')print("文件的名字: ",ff.name)print(ff.read(8)) ##读取前8个字符print(ff.read(8)) ##继续读取8个字符ff.close()##结果文件的名字: C:\Users\lh\Desktop\1.txt新年都未有芳华,二月初惊见草芽。ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')print("文件的名字: ",ff.name)print(ff.read()) ##读取全部内容ff.close()##结果新年都未有芳华,二月初惊见草芽。白雪却嫌春色晚,故穿庭树作飞花。ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')print("文件的名字: ",ff.name)print(ff.read(-1)) ##size为负数,也是读取全部内容ff.close()##结果新年都未有芳华,二月初惊见草芽。白雪却嫌春色晚,故穿庭树作飞花。
4.2 readline()
readline() 方法用于从文件读取整行,包括“\n”字符。如果指定了非负数的参数,返回指定大小的字符数,包括“\n”字符。
语法格式:fileObject.readline(size)
size用于返回指定的字符数,表示当前位置指针指向的行的前几个字节的数据,如果为负值(系统默认值为-1),读取当前位置指针指向的行的所有内容。
ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')fcontent = ff.readline() ##读取第一行的全部内容print(fcontent)fcon = ff.readline(2) ##继续读取下一行,也就是第二行的前两个字符print(fcon)ff.close()##结果新年都未有芳华,二月初惊见草芽\n。 ##输出内容并输出换行符白雪
4.3 readlines()
readlines() 一次性读取当前位置指针指向处后面的所有内容,函数返回的是一个由每行数据组成的一个列表。
语法格式:<变量>=<文件对象>readlines()
没有变量,一般使用循环的方式读取文件中的内容。
ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')fcontent = ff.readlines()print(type(fcontent))for i in fcontent:print(i)ff.close()##结果<class 'list'>新年都未有芳华,二月初惊见草芽\n。白雪却嫌春色晚,故穿庭树作飞花
4.4 tell()
tell() 返回文件的当前位置,即文件指针的当前位置。
语法格式:fileObject.tell()
ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')line = ff.readline()print("读取数据为:%s"%(line))post = ff.tell() ##获取当前文件位置print("当前位置为:%s"%(post))ff.close()##结果读取数据为:新年都未有芳华,二月初惊见草芽\n。当前位置为:52
4.5 truncate()
truncate() 方法用于截断文件
语法格式: fileObject.truncate(size)
size是可选参数,若指定size,则表示截断文件为size个字符,如果没有指定size,则重置到当前位置
ff = open(r'C:\Users\lh\Desktop\1.txt','r+',1,encoding='utf-8')line = ff.readline()print("读取数据为:%s"%(line))ff.truncate() ##从当前文件位置截断文件,文件需要有可写的权限line = ff.readlines()print("当前位置为:%s"%(line))ff.close()##结果读取数据为:新年都未有芳华,二月初惊见草芽\n。当前位置为:['白雪却嫌春色晚,故穿庭树作飞花。']
4.6 seek()
seek() 方法用于移动文件读取指针到指定位置。
语法格式: fileObject.seek(offset[, whence])
offset表示偏移量,即需要移动偏移的字节数
whence可选参数,表示从哪个位置开始偏移,默认值为0。如果指定为1,则表示从当前位置算起,如果指定为2,则表示从文件末尾算起。
ff = open(r'C:\Users\lh\Desktop\1.txt','r+',1,encoding='utf-8')line = ff.readline()print("读取数据为:%s"%line)ff.seek(0,0) #重新设置文件读取指针到开头line = ff.readline()print("读取数据为:%s"%line)ff.close()##结果读取数据为:新年都未有芳华,二月初惊见草芽\n。读取数据为:新年都未有芳华,二月初惊见草芽\n。
五、写入文件
5.1 write()
write() 函数用于将字符串写入文件,在使用该函数之前,打开文件函数open() 不能使用 ‘r’ 的方式。
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,此时在文件中看不到写入的内容。
语法格式:<文件变量>.write(<变量>)
变量是要写入的内容,可以是一个字符串或指向字符串对象的变量,也可以是字符串表达式
ff = open(r'C:\Users\lh\Desktop\1.txt','w+',encoding='utf-8') ##w+模式打开文件,会覆盖之前的内容ff.write("梅雪争春未肯降,骚人阁笔费评章。")ff.write("\n") ##插入换行符,位置指针位于第二行开头ff.write("梅须逊雪三分白,雪却输梅一段香。") ##从第二行开头,插入下面的字符ff.seek(0)fc = ff.read()print(fc)ff.close()##结果梅雪争春未肯降,骚人阁笔费评章。梅须逊雪三分白,雪却输梅一段香。
5.2 writelines()
writelines() 函数对文件进行写入操作,将一个列表的内容都写入到文件中,还可以用于修改文件内容
<文件对象>.writelines(<列表>)
参数列表为字符串列表
ff = open(r'C:\Users\lh\Desktop\1.txt','a+',encoding='utf-8')strlist = ["欲渡黄河冰塞川,将登太行雪满山","闲来垂钓碧溪上,忽复乘舟梦日边","行路难,行路难,多歧路,今安在?"]ff.writelines(strlist)ff.seek(0) ##将位置指针重新指向文件头fc = ff.read()print(fc)ff.close()##结果梅雪争春未肯降,骚人阁笔费评章。梅须逊雪三分白,雪却输梅一段香。欲渡黄河冰塞川,将登太行雪满山闲来垂钓碧溪上,忽复乘舟梦日边行路难,行路难,多歧路,今安在?ff = open(r'C:\Users\lh\Desktop\1.txt','w+',encoding='utf-8')lines = ff.readlines()ff.close()print(len(lines))lines = 'lhuan'ff = open(r'C:\Users\lh\Desktop\1.txt','w+',encoding='utf-8')ff.writelines(lines) ##直接将所有内容替换为lhuanff.seek(0)fc = ff.read()print(fc)ff.close()##结果0lhuan
5.3 附加到文件
可以将一个文件的全部内容附加到另外一个文件中。
file1 = open(r'C:\Users\lh\Desktop\file1.txt','w',encoding='utf-8')file1.write("闲来垂钓碧溪上,忽复乘舟梦日边")file1.close()file2= open(r'C:\Users\lh\Desktop\file1.txt','r',encoding='utf-8')content = file2.read()file2.close()ff = open(r'C:\Users\lh\Desktop\1.txt','a',encoding='utf-8')ff.write(content)ff.close()ff = open(r'C:\Users\lh\Desktop\1.txt','r',encoding='utf-8')fc = ff.read()print(fc)ff.close()##结果lhuan闲来垂钓碧溪上,忽复乘舟梦日边闲来垂钓碧溪上,忽复乘舟梦日边
六、刷新文件
flush() 方法用于刷新缓冲区的,也就是将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要被动地等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时需要在关闭前刷新它。
语法格式: fileObject.flush()
ff = open(r'C:\Users\lh\Desktop\1.txt','r+',encoding='utf-8')ff.write("欲渡黄河冰塞川,将登太行雪满山")ff.flush()ff.close()
七、报错
SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3:
原因分析:在windows系统当中读取文件路径可以使用\,但是在python字符串中\有转义的含义,如\t可代表TAB,\n代表换行,所以我们需要采取一些方式使得\不被解读为转义字符。目前有3个解决方案
1、在路径前面加r,即保持字符原始值的意思。sys.path.append(r'c:\Users\mshacxiang\VScode_project\web_ddt')2、替换为双反斜杠sys.path.append('c:\\Users\\mshacxiang\\VScode_project\\web_ddt')3、替换为正斜杠sys.path.append('c:/Users/mshacxiang/VScode_project/web_ddt')
原本没有1.txt 文件,创建出了新文件。
