Python 程序设计入门(024)—— Python 的文件操作

Python 程序设计入门(024)—— Python 的文件操作

目录

  • Python 程序设计入门(024)—— Python 的文件操作
    • 一、文件对象
    • 二、读取文件内容的方法
        • 1、read() 方法
        • 2、readline() 方法
        • 3、readlines() 方法
        • 4、使用 for 循环读取文件内容
    • 三、文件指针的操作
        • 1、tell() 方法
        • 2、seek() 方法
    • 四、文件的写入操作
    • 五、使用 with 语句处理文件
    • 六、打开文件之前先判断文件是否存在
    • 七、文件的编码问题
        • 1、打开文件时指定文件的编码格式
        • 2、以二进制方式打开文件,然后对读取的内容进行编码
        • 3、强制以某种模式读取文件,忽略编码错误

为了能够长期保存程序中的数据,需要将其保存到磁盘文件中。Python 提供了内置的文件对象和对文件、目录进行操作的内置模块。

一、文件对象

Python 中内置了文件(file)对象,使用文件对象时,需要先通过内置的 open() 函数创建一个文件对象,然后通过该对象提供的方法进行操作。

使用 open() 函数一定要保证关闭文件对象,即调用 close() 函数。open() 函数的语法格式如下:

file = open(filename, mode = "r", buffering = -1, encoding = None)

说明:

(1)filename:要创建或打开的文件名(必须),使用单引号或双引号括起来。如果要打开的文件和当前文件在同一目录下,可以不带路径,否则需要指定完整路径。

(2)mode:指定文件的打开模式(可选),默认的打开模式为只读(r),mode 的取值如下表所示:

取值含义说明
t文本模式(默认)
r以只读模式打开文件。文件的指针将会放在文件的开头。文件必须存在
rb以二进制格式打开文件,并且采用只读模式。文件的指针将会放在文件的开头。文件必须存在
r+打开文件后,可以读取文件内容,也可以写入新的内容覆盖原有内容(不清空原文件,从第一个字符开始逐步替换)。
比如文件中原有内容为:123456789,写入abc,则文件内容为:abc456789
文件必须存在
rb+以二进制格式打开文件,并且采用读写模式,文件的指针将会放在文件的开头。文件必须存在
w以只写模式打开文件如果文件已存在,则将其覆盖,否则创建新文件
wb以二进制格式打开文件,并且采用只写模式。一般用于非文本文件,如图片、声音等。如果文件已存在,则将其覆盖,否则创建新文件
w+打开文件后,先清空原有内容,使其变为一个空文件,对这个空文件有读写权限。如果文件已存在,则将其覆盖,否则创建新文件
wb+以二进制格式打开文件,并且采用读写模式。一般用于非文本文件,如图片、声音等。如果文件已存在,则将其覆盖,否则创建新文件
a以追加模式打开文件。如果该文件已存在,文件指针放在文件的末尾(新内容会被写到已有内容之后)。否则,创建新文件用于写入。如果文件已存在,则将新内容追加到原文件结尾,否则创建新文件并写入新内容
ab以二进制格式打开文件,并且采用追加模式。如果该文件已存在,文件指针将放在文件末尾(新内容会被写到已有内容之后)。否则,创建新文件用于写入。如果文件已存在,则将新内容追加到原文件结尾,否则创建新文件并写入新内容
a+以读写模式打开文件。如果该文件已存在,文件指针将放到文件的末尾(新内容会被写到已有内容之后)。否则,创建新文件用于读写。如果文件已存在,则将新内容追加到原文件结尾,否则创建新文件并写入新内容
ab+以二进制格式打开文件,并且采用追加模式。如果该文件已存在,文件指针将放到文件末尾(新内容会被写到已有内容之后)。否则,创建新文件用于读写。如果文件已存在,则将新内容追加到原文件结尾,否则创建新文件并写入新内容

mode 参数的用法如下:

常用的 mode 取值组合如下:
(1)r 或 rt:默认模式,文本模式、只读模式
(2)rb:二进制模式
(3)w 或 wt:文本模式、只写模式,打开之前文件被清空
(4)wb:二进制模式、写模式,打开之前文件被清空
(5)a:追加模式,只能写在文件末尾
(6)a+:可读写模式,写操作只能写在文件末尾
(7)w+:可读写模式,与 a+ 的区别就是写之前先清空文件内容
(8)r+:可读写模式,写之前先清空文件内容说明:
(1)r(只读模式)、w(只写模式)、a(追加模式)为打开文件的基本模式。
(2)b(二进制模式)、t(文本模式)、+(读写模式) 与以上三个模式可以混合使用。
(3)r、rb、r+,rb+ 模式要求文件必须存在。r 与 rb 表示只读模式。r+ 与 rb+ 表示可读写,写入的新内容会替换文件中的原有内容。
(4)w、wb、w+、wb+ 模式下,如果文件已创建,则覆盖原文件,如果文件不存在,则创建新文件。w 与 wb 表示只能写入,不能读取。w+ 与 wb+ 表示可读写,但写入的内容会替换文件中的原有内容。
(5)a、ab、a+、ab+ 模式下,如果文件已创建,则将新内容追加到原文件的结尾,如果文件不存在,则创建新文件并写入新内容。a 和 ab 表示以追加模式打开文件,无法读取文件内容。a+ 和 ab+ 表示以读写方式打开文件。

(3)buffering:用于指定读写文件的缓冲模式(可选),取值为 0 时表示不缓存;取值为 1 时表示缓存;如果取值大于 1,则表示缓冲区的大小。如果取负值,缓冲区的大小则为系统默认。默认值为 -1。

(4)encoding:编码方式。Windows 系统默认是 gbk 编码,所以桌面生成的 TXT 之类的文件都是gbk 编码的。

例如:

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.read())
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

二、读取文件内容的方法

读取文件内容通常使用 file 对象的 3 个方法:(1)使用 read() 方法读取全部或部分内容;(2)使用 readline() 方法逐行读取文件内容;(3)使用 readlines() 方法读取所有内容。

也可以使用 for 循环读取文件内容。

1、read() 方法

read() 方法用于读取文件的全部或部分内容。read() 方法的语法格式如下:

file.read([size]) 

说明:

(1)size 为可选参数,用于指定要读取文件内容的字符数(所有字符 size 均为 1,包括汉字)。如果省略,则返回文件的所有内容。

(2)使用 read() 方法读取文件内容时,如果文件大于可用内存,则不能实现对文件的读取,返回空字符串。

例如:

(1)读取文件的全部内容

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.read())
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

(2)读取 25 个字符

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.read(25))
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,

2、readline() 方法

readline() 方法用于每次读取一行数据。readline() 方法的语法格式如下:

file.readline() 

例如:

(1)读取一行数据

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
print(file1.readline())
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号

(2)读取 5 行数据

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
for i in range(5):print(file1.readline(),end="")
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654

(3)读取全部数据

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
while True:line = file1.readline()if line == "":breakprint(line,end="")
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

3、readlines() 方法

readlines() 方法返回一个列表,列表中每个元素为文件中的行数据。readlines() 方法的语法格式如下:

file.readlines()

例如:

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
list1 = file1.readlines()
print("类型",type(list1))
print("列表长度:",len(list1))
print("列表内容如下:")
print(list1)
print("遍历列表内容:")
for item in list1:print(item,end="")
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
类型 <class 'list'>
列表长度: 13
列表内容如下:
['姓名,性别,出生日期,院系,班级,手机号\n', '张平,女,2002-12-5,经济与管理学院,信管201班,13603735216\n', '刘涛,男,2002-10-15,经济与管理学院,信管201班,13603733334\n', '张静静,女,2003-8-6,经济与管理学院,信管212班,13603734243\n', '王强,男,2003-6-25,经济与管理学院,信管212班,13603736654\n', '张海洋,男,2002-7-9,机电学院,机制211班,13603737778\n', '刘思雨,女,2001-8-30,机电学院,机制211班,13603736538\n', '王彦强,男,2002-7-31,机电学院,机制212班,13603736528\n', '刘朝辉,男,2001-7-6,机电学院,机制201班,13603736235\n', '王鹏,男,2002-9-27,机电学院,机制201班,13603734215\n', '刘燕燕,女,2001-8-22,文法学院,法学201班,13603733685\n', '王芸,女,2002-6-30,文法学院,法学201班,13603733322\n', '刘云飞,男,2002-9-21,文法学院,法学201班,13603733415']
遍历列表内容:
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

4、使用 for 循环读取文件内容

使用 for 循环读取文件内容格式如下:

file1 = open(filename, mode)
for line in file:print(line)或:
file1 = open(filename, mode)
for line in file.readlines():print(line)

例如:

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r", encoding = 'utf-8') as file1:for line in file1:print(line,end="")
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

或者:

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r", encoding = 'utf-8') as file1:for line in file1.readlines():print(line,end="")
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

三、文件指针的操作

除了文件读取操作,有时还需要进行获取或移动指针位置的操作。

1、tell() 方法

tell() 方法返回一个整数,表示文件指针的当前位置,即在二进制模式下距离文件头的字节数。tell() 方法的语法格式如下:

file.tell()
说明:使用 tell() 方法返回的位置与 read() 中 size 参数不同。read() 方法中的 size 参数为字符数,tell() 方法返回的是字节数。汉字所占的字节数和字符编码有关,如果采用 GBK 编码,一个汉字占 2 个字节,如果采用 UTF-8 编码,一个汉字占 3 个字节。

修改放表称为单链表。

file1 = open("d:\stu.txt",mode = "r",encoding='utf-8')
file1.readlines()
print("readlines()方法把指针移动到文件结尾:",file1.tell())
file1.seek(0)  # 把指针移动到文件头
file1.readline()
print("readline()方法把指针移动到下一行的开头:",file1.tell())
file1.seek(0)  # 把指针移动到文件头
file1.read(25)
print("read(25)方法把指针移动到第25个字符:",file1.tell())
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
readlines()方法把指针移动到文件结尾: 825
readline()方法把指针移动到下一行的开头: 52
read(25)方法把指针移动到第25个字符: 62

2、seek() 方法

seek() 方法用于将文件的指针移动到新的位置,位置通过字节数指定。这里的数值与 tell() 方法返回的数值计算方法一致。seek() 方法的语法格式如下:

file.seek(offset [,whence])
说明:
(1)offset:用于指定移动的字节数。具体位置与 whence 参数有关。
(2)whence:指定从什么位置开始计算。值为 0 表示从文件头开始计算(默认),为 1 表示从当前位置开始计算,为 2 表示从文件尾开始计算。默认值为 0

例如:

file1 = open("d:\stu.txt",mode = "rb")
file1.seek(0)  # 把指针移动到文件头
print(file1.tell())file1.seek(10)  # 把指针移动到离文件头10个字节的位置
print(file1.tell())file1.seek(20,1)  # 再向后移动20个自节
print(file1.tell())file1.seek(0,2)  # 把指针移动到文件尾
print(file1.tell())file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
0
10
30
825

四、文件的写入操作

利用文件对象的 write() 方法,可以向文件中写入内容。write() 方法的语法格式如下:

file.write(string)

对于一个文件来说,能不能写入数据、数据的写入方式与打开文件的模式有关。

(1)如果一个文件以只读方式(r)打开,则无法写入

代码如下:

file1 = open("d:\stu.txt",mode = "r")
file1.write("新增一条记录:")
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 2, in <module>file1.write("新增一条记录:")
io.UnsupportedOperation: not writable

(2)如果一个文件以只写方式打开,则无法读取内容

代码如下:

file1 = open("d:\stu.txt",mode = "w")
file1.readlines()
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 2, in <module>file1.readlines()
io.UnsupportedOperation: not readable

(3)文件以只写方式打开,写入内容

代码如下:

file1 = open("d:\\test123.txt", mode = "w")
file1.write("Hello Python!")
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
>>> 

(4)文件以可读写(r+)方式打开,写入内容

代码如下:

file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r+")
file1.write("New!")
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Hello Python!
13
4
New!o Python!    # r+ 模式在写入时,并不清空文件,而是从第一个字符开始替换原有的内容
13

(5)文件以可读写(w+)方式打开,写入内容

代码如下:

file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "w+")
file1.write("New!")
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Hello Python!
13
4
New!    # w+ 模式在写入时,先清空原有文件,再写入新内容
4

(6)文件以追加方式打开,写入内容

代码如下:

file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "a")
file1.write("New!")
print(file1.tell())
file1.close()file1 = open("d:\\test123.txt", mode = "r")
print(file1.read())
print(file1.tell())
file1.close()程序运行结果如下:
>>> 
===================== RESTART: C:\Python\Python38\First.py =====================
Hello Python!
13
17
Hello Python!New!
17

五、使用 with 语句处理文件

文件使用完要及时关闭。如果忘记关闭文件,可能出现一些意想不到的结果。另外,如果在打开文件时出现了异常,将导致文件不能被及时关闭。为了避免这些问题的产生,可以使用 with 语句实现在处理文件时,无论是否抛出异常,都能保证 with 语句执行完后关闭已经打开的文件。

with 语句的语法格式如下:

with expression as target:with-body

说明:

(1)expression:指定一个表达式,可以是打开文件的 open() 函数。

(2)with-body:指定 with 语句体,其中可以是执行 with 语句后相关的一些操作。如果不想执行任何操作,可以用 pass 语句代替。

例如:

with open("d:\\stu.txt", mode = "r" ,encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

六、打开文件之前先判断文件是否存在

使用 open() 函数打开文件时,如果要打开的文件不存在,则会出现异常。可以使用 os.path 模块提供的 exists() 函数判断文件是否存在。

例如:

(1)以只读(r)方式打开一个不存在的文件时出现异常

代码如下:

with open("d:\\stu001.txt", mode = "r" ,encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 1, in <module>with open("d:\\stu001.txt", mode = "r" ,encoding = "utf-8") as file1:
FileNotFoundError: [Errno 2] No such file or directory: 'd:\\stu001.txt'

(2)打开之前先判断文件是否存在

代码如下:

import os
if os.path.exists("d:\\stu001.txt"):with open("d:\\stu001.txt", mode = "r" ,encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
要打开的文件不存在!

七、文件的编码问题

由于文件保存格式不同,在读取文件时如果格式不正确,将会出现乱码或抛出异常。

例如:

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
Traceback (most recent call last):File "C:\Python\Python38\First.py", line 5, in <module>line = file1.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 36: illegal multibyte sequence

可以使用如下三种方法解决文件的编码格式问题:

1、打开文件时指定文件的编码格式

例如,在打开文件时,指定编码格式为 【utf-8】,代码如下:

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "r", encoding = "utf-8") as file1:while True:line = file1.readline()if line == "":breakprint(line,end="")
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

2、以二进制方式打开文件,然后对读取的内容进行编码

读取文件时如果出现字符编码错误,用二进制方式打开文件就不会出现错误了,但需要在读取文件时进行编码。先使用 isinstance() 函数判断读取的内容是否为 str 类型,如果是,则直接读取文件内容。如果不是,则使用异常处理程序尝试使用 utf-8 方式解码,否则使用 GBK 解码。

代码如下:

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "rb") as file1:for line in file1.readlines():if isinstance(line,str):print(new,end="")else:try:new = line.decode("utf-8")print(new,end="")except:try:new = line.decode("GBK")print(new,end="")except:pass
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

3、强制以某种模式读取文件,忽略编码错误

例如:以二进制方式读取文件的内容,然后用 GBK 编码强制读取该文件。

代码如下:

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "rb") as file1:text = file1.read()new = text.decode("GBK",errors = "ignore")print(new)
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
濮撳悕,鎬у埆,鍑虹敓鏃ユ湡,闄㈢郴,鐝绾,鎵嬫満鍙
寮犲钩,,2002-12-5,缁忔祹涓庣$悊瀛﹂櫌,淇$201,13603735216
鍒樻稕,,2002-10-15,缁忔祹涓庣$悊瀛﹂櫌,淇$201,13603733334
寮犻潤闈,,2003-8-6,缁忔祹涓庣$悊瀛﹂櫌,淇$212,13603734243
鐜嬪己,,2003-6-25,缁忔祹涓庣$悊瀛﹂櫌,淇$212,13603736654
寮犳捣娲,,2002-7-9,鏈虹數瀛﹂櫌,鏈哄埗211,13603737778
鍒樻濋洦,,2001-8-30,鏈虹數瀛﹂櫌,鏈哄埗211,13603736538
鐜嬪溅寮,,2002-7-31,鏈虹數瀛﹂櫌,鏈哄埗212,13603736528
鍒樻湞杈,,2001-7-6,鏈虹數瀛﹂櫌,鏈哄埗201,13603736235
鐜嬮箯,,2002-9-27,鏈虹數瀛﹂櫌,鏈哄埗201,13603734215
鍒樼嚂鐕,,2001-8-22,鏂囨硶瀛﹂櫌,娉曞201,13603733685
鐜嬭姼,,2002-6-30,鏂囨硶瀛﹂櫌,娉曞201,13603733322
鍒樹簯椋,,2002-9-21,鏂囨硶瀛﹂櫌,娉曞201,13603733415

以二进制方式读取文件的内容,然后用 utf-8 编码强制读取该文件。

import os
if os.path.exists("d:\\stu.txt"):with open("d:\\stu.txt", mode = "rb") as file1:text = file1.read()new = text.decode("utf-8",errors = "ignore")print(new)
else:print("要打开的文件不存在!")程序运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
姓名,性别,出生日期,院系,班级,手机号
张平,,2002-12-5,经济与管理学院,信管201,13603735216
刘涛,,2002-10-15,经济与管理学院,信管201,13603733334
张静静,,2003-8-6,经济与管理学院,信管212,13603734243
王强,,2003-6-25,经济与管理学院,信管212,13603736654
张海洋,,2002-7-9,机电学院,机制211,13603737778
刘思雨,,2001-8-30,机电学院,机制211,13603736538
王彦强,,2002-7-31,机电学院,机制212,13603736528
刘朝辉,,2001-7-6,机电学院,机制201,13603736235
王鹏,,2002-9-27,机电学院,机制201,13603734215
刘燕燕,,2001-8-22,文法学院,法学201,13603733685
王芸,,2002-6-30,文法学院,法学201,13603733322
刘云飞,,2002-9-21,文法学院,法学201,13603733415

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?

近日&#xff0c;麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势&#xff0c;并把他们分为5大类&#xff0c;人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一&#xff1a;人工智能革命 生成式AI 生成型人工智能标志着人工智…

CSRF

文章目录 CSRF(get)CSRF(post)CSRF Token CSRF(get) 根据提示的用户信息登录 点击修改个人信息 开启bp代理&#xff0c;点击submit 拦截到请求数据包 浏览器关闭代理 刷新页面 CSRF(post) 使用BP生成CSRF POC post请求伪造&#xff0c;可以通过钓鱼网站&#xff0c;诱导用户去…

docker 常用命令大全

1.查看docker版本&#xff1a; docker -v2.检查 Docker 是否正在运行: systemctl status docker3.重启docker服务: systemctl restart docker4.列出本地镜像: docker images5.列出正在运行的容器&#xff1a; docker ps6.列出所有容器&#xff08;包括停止的&#xff09;&…

css 实现文字横向循环滚动

实现效果 思路 ## 直接上代码,html部分 //我这里是用的uniapp <view class"weather_info_wrap"><view class"weather_info">当前多云&#xff0c;今晚8点转晴&#xff0c;明天有雨&#xff0c;温度32摄氏度。</view><view class&qu…

CF1005A Tanya and Stairways 题解

题目传送门 题目意思&#xff1a; 给你 n n n 个数&#xff0c;如果第 i i i 个数小于或等于第 i − 1 i-1 i−1 个数&#xff0c;就输出这个数。 思路&#xff1a; 输入后直接遍历判断即可。 代码&#xff1a; #include<bits/stdc.h> using namespace std; int …

解决IDEA tomcat控制台只有server日志

解决IDEA tomcat控制台只有server日志 确认tomcatxxx/conf/logging.properties文件是否存在&#xff0c;存在就会有。前提是在run configuration配置了打印多个日志

uniapp封装组件,选中后右上角显示对号√样式(通过css实现)

效果&#xff1a; 一、组件封装 1、在项目根目录下创建components文件夹&#xff0c;自定义组件名称&#xff0c;我定义的是xc-button 2、封装组件代码 <template><view class"handle-btn"><view :class"handleIdCode 1 ? select : unSelec…

蚂蚁数科持续发力PaaS领域,SOFAStack布局全栈软件供应链安全产品

8月18日&#xff0c;记者了解到&#xff0c;蚂蚁数科再度加码云原生PaaS领域&#xff0c;SOFAStack率先完成全栈软件供应链安全产品及解决方案的布局&#xff0c;包括静态代码扫描Pinpoint、软件成分分析SCA、交互式安全测试IAST、运行时防护RASP、安全洞察Appinsight等&#x…

【电商领域】Axure在线购物商城小程序原型图,品牌自营垂直电商APP原型

作品概况 页面数量&#xff1a;共 60 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;网上商城、品牌自营商城、商城模块插件 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为品牌自营网上商城…

无涯教程-Perl - warn函数

描述 此函数将LIST的值打印到STDERR。基本上与die函数相同,除了不对出口进行任何调用并且在eval语句内不引发异常。这对于引发错误而不导致脚本过早终止很有用。 如果变量$包含一个值(来自先前的eval调用),并且LIST为空,则$的值将以。\t.caught打印。附加到末尾。如果$和LIST…

MySQL数据库概述

MySQL数据库概述 1 SQL SQL语句大小写不敏感。 SQL语句末尾应该使用分号结束。 1.1 SQL语句及相关操作示例 DDL&#xff1a;数据定义语言&#xff0c;负责数据库定义、数据库对象定义&#xff0c;由CREATE、ALTER与DROP三个语法所组成DML&#xff1a;数据操作语言&#xff…

关于小程序收集用户手机号行为的规范

手机号在日常生活中被广泛使用&#xff0c;是重要的用户个人信息&#xff0c;小程序开发者应在用户明确同意的前提下&#xff0c;依法合规地处理用户的手机号信息。 而部分开发者在处理用户手机号过程中&#xff0c;存在不规范收集行为&#xff0c;影响了用户的正常使用体验&a…

ElasticSearchConfig

1. 添加配置 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>2. es 配置信息 import org.apache.http.HttpHost; import org.apache.http.auth.Au…

k8s简介、虚拟机快速搭建k8s集群、集群管理方式及K8S工作原理和组件介绍

文章目录 1、k8s简介1.1、部署方式的变迁1.2、定义1.3、Kubernetes提供的功能 2、虚拟机快速搭建k8s集群2.1、虚拟机配置&#xff08;centos7 2G内存2个处理器&#xff09;2.2、基础环境准备2.3、docker安装&#xff08;易踩坑&#xff09;2.4、安装k8s组件2.5、master节点部署…

在linux系统中修改mysql数据目录

目录 1.查看mysql默认存储路径2.停止mysql服务3.移动或复制原数据目录4.修改配置文件5.修改启动文件6.配置AppArmor访问控制规则7.重启apparmor服务8.启动mysql 1.查看mysql默认存储路径 在/etc/mysql/mysql.conf.d/mysqld.cnf中的datadir配置项。 datadir /var/lib/mysql2…

提高批量爬虫工作效率

大家好&#xff01;作为一名专业的爬虫程序员&#xff0c;我今天要和大家分享一些关于提高批量爬虫工作效率的实用技巧。无论你是要批量采集图片、文本还是视频数据&#xff0c;这些经验都能帮助你在大规模数据采集中事半功倍。废话不多说&#xff0c;让我们开始吧&#xff01;…

SUMO 创建带有停车位的充电站 在停车位上充电

前言 SUMO提供的Charging Station是没有停车位的&#xff0c;车辆只有在通过充电站区域或者停在充电站区域内时才能被充电&#xff0c;这时充电的车辆就会占用道路。然而&#xff0c;真实世界中的情况通常是充电站设在路边&#xff0c;且提供一定量的车位用于停车&#xff0c;…

半导体自动化专用静电消除器主要由哪些部分组成

半导体自动化专用静电消除器是一种用于消除半导体生产过程中的静电问题的设备。由于半导体制造过程中对静电的敏感性&#xff0c;静电可能会对半导体器件的质量和可靠性产生很大的影响&#xff0c;甚至造成元件损坏。因此&#xff0c;半导体生产中采用专用的静电消除器是非常重…

setfacl给jenkins用户加权限

用setfacl给jenkins用户加一个/tmp的权限 setfacl是set File ACL&#xff08;访问控制列表&#xff09;的缩写 如果你想递归地将它应用到所有子目录&#xff1a;添加-R标志&#xff0c;如下所示&#xff1a; yum -y install aclsetfacl -R -m u:jenkins:rwx /tmp Give speci…

Linux Day09

目录 一、进程替换 二、Linux信号的使用 2.1 kill() 发送信号 2.2 signal() 改变进程对信号的响应方式 2.3 处理僵死进程 2.3.1 在信号处理函数中调用wait 2.3.2 Linux特有的 2.3.3 结果 一、进程替换 linux上创造一个新进程&#xff0c;没有create创建方法&#xf…