一、文件的概念

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+ 以二进制追加和读/写方式打开一个文件,如果文件存在则覆盖现有文件,如果文件不存在,则创建用于读/写的新文件
  1. ff = open('C:\Users\lh\Desktop\1.txt','w',1)
  2. ##报错
  3. File "e:/pythonstduy/time.py", line 317
  4. ff = open('C:\Users\lh\Desktop\1.txt','w',1)
  5. ^
  6. SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
  7. ##解决
  8. Python中 \ 是转义符,\u表示其后是UNICODE编码,因此\User在这里会报错,在字符串前面加个 r(rawstring 原生字符串),可以避免python与正则表达式语法的冲突!
  9. ff = open(r'C:\Users\lh\Desktop\1.txt','w',1)

image.png 原本没有1.txt 文件,创建出了新文件。

三、关闭文件

文件关闭就是使指向该文件对象的引用不再指向该对象,以后不能再通过该引用对原来与其相联系的文件进行读/写操作,除非再次打开,使得该文件引用变量重新指向新的文件。
使用close() 函数。
语法格式: <文件对象名>.close()
使用close() 函数关闭该文件,使得文件对象名不再指向文件。
当file对象被引用到操作另一个文件的时候,Python会自动关闭之前的file对象。

四、读取文件

4.1 read()

read() 方法用于从文件读取指定的字符数,如果没有指定或为负,则读取所有
语法格式:fileObject.read(size) size用于返回指定的字符数

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')
  2. print("文件的名字: ",ff.name)
  3. print(ff.read(8)) ##读取前8个字符
  4. print(ff.read(8)) ##继续读取8个字符
  5. ff.close()
  6. ##结果
  7. 文件的名字: C:\Users\lh\Desktop\1.txt
  8. 新年都未有芳华,
  9. 二月初惊见草芽。
  10. ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')
  11. print("文件的名字: ",ff.name)
  12. print(ff.read()) ##读取全部内容
  13. ff.close()
  14. ##结果
  15. 新年都未有芳华,二月初惊见草芽。
  16. 白雪却嫌春色晚,故穿庭树作飞花。
  17. ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')
  18. print("文件的名字: ",ff.name)
  19. print(ff.read(-1)) ##size为负数,也是读取全部内容
  20. ff.close()
  21. ##结果
  22. 新年都未有芳华,二月初惊见草芽。
  23. 白雪却嫌春色晚,故穿庭树作飞花。

4.2 readline()

readline() 方法用于从文件读取整行,包括“\n”字符。如果指定了非负数的参数,返回指定大小的字符数,包括“\n”字符。
语法格式:fileObject.readline(size)
size用于返回指定的字符数,表示当前位置指针指向的行的前几个字节的数据,如果为负值(系统默认值为-1),读取当前位置指针指向的行的所有内容。

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')
  2. fcontent = ff.readline() ##读取第一行的全部内容
  3. print(fcontent)
  4. fcon = ff.readline(2) ##继续读取下一行,也就是第二行的前两个字符
  5. print(fcon)
  6. ff.close()
  7. ##结果
  8. 新年都未有芳华,二月初惊见草芽\n ##输出内容并输出换行符
  9. 白雪

4.3 readlines()

readlines() 一次性读取当前位置指针指向处后面的所有内容,函数返回的是一个由每行数据组成的一个列表。
语法格式:<变量>=<文件对象>readlines()
没有变量,一般使用循环的方式读取文件中的内容。

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')
  2. fcontent = ff.readlines()
  3. print(type(fcontent))
  4. for i in fcontent:
  5. print(i)
  6. ff.close()
  7. ##结果
  8. <class 'list'>
  9. 新年都未有芳华,二月初惊见草芽\n
  10. 白雪却嫌春色晚,故穿庭树作飞花

4.4 tell()

tell() 返回文件的当前位置,即文件指针的当前位置。
语法格式:fileObject.tell()

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r',1,encoding='utf-8')
  2. line = ff.readline()
  3. print("读取数据为:%s"%(line))
  4. post = ff.tell() ##获取当前文件位置
  5. print("当前位置为:%s"%(post))
  6. ff.close()
  7. ##结果
  8. 读取数据为:新年都未有芳华,二月初惊见草芽\n
  9. 当前位置为:52

4.5 truncate()

truncate() 方法用于截断文件
语法格式: fileObject.truncate(size)
size是可选参数,若指定size,则表示截断文件为size个字符,如果没有指定size,则重置到当前位置

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r+',1,encoding='utf-8')
  2. line = ff.readline()
  3. print("读取数据为:%s"%(line))
  4. ff.truncate() ##从当前文件位置截断文件,文件需要有可写的权限
  5. line = ff.readlines()
  6. print("当前位置为:%s"%(line))
  7. ff.close()
  8. ##结果
  9. 读取数据为:新年都未有芳华,二月初惊见草芽\n
  10. 当前位置为:['白雪却嫌春色晚,故穿庭树作飞花。']

4.6 seek()

seek() 方法用于移动文件读取指针到指定位置。
语法格式: fileObject.seek(offset[, whence])
offset表示偏移量,即需要移动偏移的字节数
whence可选参数,表示从哪个位置开始偏移,默认值为0。如果指定为1,则表示从当前位置算起,如果指定为2,则表示从文件末尾算起。

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r+',1,encoding='utf-8')
  2. line = ff.readline()
  3. print("读取数据为:%s"%line)
  4. ff.seek(0,0) #重新设置文件读取指针到开头
  5. line = ff.readline()
  6. print("读取数据为:%s"%line)
  7. ff.close()
  8. ##结果
  9. 读取数据为:新年都未有芳华,二月初惊见草芽\n
  10. 读取数据为:新年都未有芳华,二月初惊见草芽\n

五、写入文件

5.1 write()

write() 函数用于将字符串写入文件,在使用该函数之前,打开文件函数open() 不能使用 ‘r’ 的方式。
在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,此时在文件中看不到写入的内容。
语法格式:<文件变量>.write(<变量>)
变量是要写入的内容,可以是一个字符串或指向字符串对象的变量,也可以是字符串表达式

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','w+',encoding='utf-8') ##w+模式打开文件,会覆盖之前的内容
  2. ff.write("梅雪争春未肯降,骚人阁笔费评章。")
  3. ff.write("\n") ##插入换行符,位置指针位于第二行开头
  4. ff.write("梅须逊雪三分白,雪却输梅一段香。") ##从第二行开头,插入下面的字符
  5. ff.seek(0)
  6. fc = ff.read()
  7. print(fc)
  8. ff.close()
  9. ##结果
  10. 梅雪争春未肯降,骚人阁笔费评章。
  11. 梅须逊雪三分白,雪却输梅一段香。

5.2 writelines()

writelines() 函数对文件进行写入操作,将一个列表的内容都写入到文件中,还可以用于修改文件内容
<文件对象>.writelines(<列表>)
参数列表为字符串列表

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','a+',encoding='utf-8')
  2. strlist = ["欲渡黄河冰塞川,将登太行雪满山","闲来垂钓碧溪上,忽复乘舟梦日边","行路难,行路难,多歧路,今安在?"]
  3. ff.writelines(strlist)
  4. ff.seek(0) ##将位置指针重新指向文件头
  5. fc = ff.read()
  6. print(fc)
  7. ff.close()
  8. ##结果
  9. 梅雪争春未肯降,骚人阁笔费评章。
  10. 梅须逊雪三分白,雪却输梅一段香。欲渡黄河冰塞川,将登太行雪满山闲来垂钓碧溪上,忽复乘舟梦日边行路难,行路难,多歧路,今安在?
  11. ff = open(r'C:\Users\lh\Desktop\1.txt','w+',encoding='utf-8')
  12. lines = ff.readlines()
  13. ff.close()
  14. print(len(lines))
  15. lines = 'lhuan'
  16. ff = open(r'C:\Users\lh\Desktop\1.txt','w+',encoding='utf-8')
  17. ff.writelines(lines) ##直接将所有内容替换为lhuan
  18. ff.seek(0)
  19. fc = ff.read()
  20. print(fc)
  21. ff.close()
  22. ##结果
  23. 0
  24. lhuan

5.3 附加到文件

可以将一个文件的全部内容附加到另外一个文件中。

  1. file1 = open(r'C:\Users\lh\Desktop\file1.txt','w',encoding='utf-8')
  2. file1.write("闲来垂钓碧溪上,忽复乘舟梦日边")
  3. file1.close()
  4. file2= open(r'C:\Users\lh\Desktop\file1.txt','r',encoding='utf-8')
  5. content = file2.read()
  6. file2.close()
  7. ff = open(r'C:\Users\lh\Desktop\1.txt','a',encoding='utf-8')
  8. ff.write(content)
  9. ff.close()
  10. ff = open(r'C:\Users\lh\Desktop\1.txt','r',encoding='utf-8')
  11. fc = ff.read()
  12. print(fc)
  13. ff.close()
  14. ##结果
  15. lhuan闲来垂钓碧溪上,忽复乘舟梦日边闲来垂钓碧溪上,忽复乘舟梦日边

六、刷新文件

flush() 方法用于刷新缓冲区的,也就是将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要被动地等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时需要在关闭前刷新它。
语法格式: fileObject.flush()

  1. ff = open(r'C:\Users\lh\Desktop\1.txt','r+',encoding='utf-8')
  2. ff.write("欲渡黄河冰塞川,将登太行雪满山")
  3. ff.flush()
  4. ff.close()

七、报错

SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3:

原因分析:在windows系统当中读取文件路径可以使用\,但是在python字符串中\有转义的含义,如\t可代表TAB,\n代表换行,所以我们需要采取一些方式使得\不被解读为转义字符。目前有3个解决方案

  1. 1、在路径前面加r,即保持字符原始值的意思。
  2. sys.path.append(r'c:\Users\mshacxiang\VScode_project\web_ddt')
  3. 2、替换为双反斜杠
  4. sys.path.append('c:\\Users\\mshacxiang\\VScode_project\\web_ddt')
  5. 3、替换为正斜杠
  6. sys.path.append('c:/Users/mshacxiang/VScode_project/web_ddt')