Python 允许您从本地存储的文件中读取数据和向其中写入数据。您还可以获取文件夹中包含的文件列表并更改文件夹名称。在这里,我将解释如何在 Python 中管理文件。
目录
19-1 打开文件
19-2 读取文本文件
19-3 写入文本文件
19-4 读写二进制文件
19-5 使用 pathlib 模块读写文件
要使用 Python 从文件读取数据或将数据写入文件,您需要打开文件。使用完后关闭文件。在这里,我们将解释如何使用 Python 内置的打开功能打开和关闭文件。
打开文件
要在 Python 中打开文件,请使用内置的打开功能。打开函数的格式如下。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
有很多参数,但我们主要讲解一下第一个、第二个和第四个参数。其余参数将在使用时进行解释。
在第一个参数 file 中指定要打开的文件的名称。如果打开成功,则返回相应的文件对象(返回什么样的文件对象取决于第二个参数指定的模式)。如果无法打开文件,则引发 OSError。
第二个参数 mode 指定打开文件的模式。您可以指定以下值:
r 用于读取(如果文件不存在则出错)
r+ 用于读取和写入(如果文件不存在则出错)
w 用于写入(清除文件内容)
w+ 用于读写(清除文件内容)
a 用于写入(附加到文件末尾)
a+ 用于读写(附加到文件末尾)
x 用于写入(如果文件存在则出错)
x+ 用于读取和写入(如果文件存在则出错)
b 二进制模式
t 文本模式
模式默认为文本模式,但通过添加’b’,如’r+b’或’wb’,它变成二进制模式。(默认为文本模式,因此无需显式添加“t”)。
指定要在第四个参数编码中使用的字符编码名称。仅用于文本模式。下面列出了一些可以指定的编码名称。
ascii
cp932
euc_jp
shift_jis
utf-8 (utf_8)
如果省略编码名称,则使用当前平台的默认编码。要检查您环境中的默认编码,请尝试以下操作。
import locale
locale.getpreferredencoding()
>> 'cp932'
我环境中的默认编码名称是 cp932。( cp932 是 Shift_JIS 的扩展)。如果要读取使用 UTF-8 编写的文件,请将其指定为参数,如 encoding=’UTF-8’。
具体写如下。
f1 = open('myfile.txt', 'r')
f2 = open('myfile.txt', 'w+')
f3 = open('myfile.txt', 'r', encoding='UTF-8')
f4 = open('myfile.txt', 'rb')
文件对象的CLASS
如果文件打开成功,则返回一个文件对象。文件对象的类取决于打开函数中使用的模式。。
r io.TextIOWrapper
r+ io.TextIOWrapper
rb io.BufferedReader
r+b io.BufferedRandom
w io.TextIOWrapper
w+ io.TextIOWrapper
wb io.BufferedWriter
w+b io.BufferedRandom
a io.TextIOWrapper
a+ io.TextIOWrapper
ab io.BufferedWriter
a+b io.BufferedRandom
x io.TextIOWrapper
x+ io.TextIOWrapper
xb io.BufferedWriter
x+b io.BufferedRandom
文本模式是 io.TextIOWrapper 、2进制的模式的读取是 io.BufferedReader 、写入是 io.BufferedWriter 、只读取是 io.BufferedRandom 。
关闭文件
使用完文件后,使用 close 方法关闭文件对象。(close 方法在每个文件对象的类中定义)。
close()
具体写如下。
f = open('myfile.txt', 'r')
...
...
f.close()
或者,您可以使用 with 语句打开一个文件,然后在使用完后自动关闭该文件。
with open('myfile.txt', 'r') as f:
...
...
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample1.py。
f = open('myfile.txt', 'r')
data = f.read()
print(data)
f.close()
我在程序的同一目录下创建了一个名为myfile.txt的文件,并输入如下文本:我将编码保存为 GB2312,这是我环境中的默认编码。
明天的天气怎么样?
我希望是晴天。
然后运行:
python sample1.py
打开文件 myfile.txt,读取文件的内容,并将其打印到屏幕上。然后关闭文件对象。
我将解释如何使用 Python 打开本地存储的文本文件并读取文件的内容。读取文件有两种方式:一种是一次读取整个文件,另一种是逐行读取文件。
打开文件进行阅读
要打开文本文件进行读取,请将“r”指定为打开函数的模式并运行:
f = open('myfile.txt', 'r')
如果要打开的文件的字符编码与您环境的默认编码不同,请指定字符编码。
f = open('myfile.txt', 'r', encoding='UTF-8')
如果要打开的文件不存在,则会引发 FileNotFoundError。
f = open('other.txt', 'r')
>> FileNotFoundError: [Errno 2] No such file or directory: 'other.txt'
读取整个文件(read方法)
使用 read 方法读取文件中包含的所有文本。
read(size=-1)
在没有参数的情况下,它读取文件直到 EOF(文件结尾)并将其作为字符串返回。如果参数中指定了最大字符数,则只会读取指定数量的字符。
具体写如下。
f = open('myfile.txt', 'r')
data = f.read()
f.close()
如果目标文件中使用的字符编码与open函数中指定的字符编码不同,则执行read方法时会出现UnicodeDecodeError。
f = open('myfile.txt', 'r', encoding='UTF-8')
data = f.read()
>> UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 0: invalid start byte
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample2.py。
f = open('myfile.txt', 'r', encoding='UTF-8')
data = f.read()
print(data)
f.close()
我在程序的同一目录下创建了一个名为myfile.txt的文件,并输入如下文本:编码以 UTF-8 格式保存。
明天的天气怎么样?
我希望是晴天。
如果不下雨,我们就去公园吧。
然后运行:
python sample2.py
打开文件 myfile.txt,读取文件的全部内容,并将其打印到屏幕上。然后关闭文件对象。
将整个文件分成行并作为列表获取(readlines方法)
像以前一样读取整个文件后,读取的数据可以分成几行并作为列表元素添加。使用 readlines 方法。
readlines(hint=-1)
读取整个文件并返回一个列表,其中逐行数据作为元素附加。如果参数中指定了最大字符数,则只会读取指定数量的字符。
具体写如下。
f = open('myfile.txt', 'r')
datalist = f.readlines()
print (datalist[0])
print (datalist[1])
print (datalist[2])
f.close()
要按顺序将获得的文件的数据输出为列表,请编写如下。
f = open('myfile.txt', 'r')
datalist = f.readlines()
for data in datalist:
print(data)
f.close()
请注意,每行数据都包含一个换行符。默认情况下,打印功能会自动在末尾插入一个换行符,因此如果您按原样打印列表元素,换行符将输出两次。因此,请确保打印功能不以换行符结尾,或者从读取的数据末尾删除换行符。
f = open('myfile.txt', 'r')
datalist = f.readlines()
print (datalist[0], end='')
f = open('myfile.txt', 'r')
datalist = f.readlines()
print (datalist[0].rstrip('\n'))
示例程序
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample3.py。
f = open('myfile.txt', 'r', encoding='UTF-8')
datalist = f.readlines()
for data in datalist:
print(data, end='')
f.close()
我在程序的同一目录下创建了一个名为myfile.txt的文件,并输入如下文本:编码以 UTF-8 格式保存。
明天的天气怎么样?
我希望是晴天。
如果不下雨,我们就去公园吧。
然后运行:
python sample3.py
打开文件myfile.txt后,读取文件的所有内容,分行添加为列表的元素,此时依次从列表中获取元素输出到屏幕。输出时,换行符不重叠。然后关闭文件对象。
从文件中逐行读取(readline 方法)
使用 readline 方法从文件而不是整个文件中逐行读取文件内容。
readline(size=-1)
读取文件直到换行符或 EOF 并将其作为字符串返回。如果参数中指定了最大字符数,则只会读取指定数量的字符。读取文件末尾 EOF 返回一个空字符串。
具体写如下。以下仅读取一行文件。
f = open('myfile.txt', 'r')
data = f.readline()
print (data)
f.close()
要按顺序读取并处理一个文件的内容,直到文件结束,使用while语句等,写成如下。
f = open('myfile.txt', 'r')
while True:
data = f.readline()
if data == '':
break
print (data)
f.close()
请注意,与 readlines 方法一样,每行数据都包含一个换行符。要么像在 readlines 方法中那样避免print函数中的尾随换行符,要么从读取的数据末尾删除换行符。
f = open('myfile.txt', 'r')
while True:
data = f.readline()
if data == '':
break
print (data.rstrip('\n'))
示例程序
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample4.py。
f = open('myfile.txt', 'r', encoding='UTF-8')
while True:
data = f.readline()
if data == '':
break
print (data.rstrip('\n'))
f.close()
我在程序的同一目录下创建了一个名为myfile.txt的文件,并输入如下文本:编码以 UTF-8 格式保存。
明天的天气怎么样?
我希望是晴天。
如果不下雨,我们就去公园吧。
然后运行:
python sample4.py
打开文件 myfile.txt,逐行读取文件内容,并将其打印到屏幕上。输出时,换行符不重叠。然后关闭文件对象。
从文件中逐行读取(for语句)
for 语句允许您逐行读取文件的内容。像这样写:
f = open('myfile.txt', 'r')
for data in f:
print(data)
f.close()
请注意,与 readlines 方法一样,每行数据都包含一个换行符。要么像在 readlines 方法中那样避免print函数中的尾随换行符,要么从读取的数据末尾删除换行符。
f = open('myfile.txt', 'r')
for data in f:
print (data.rstrip('\n'))
示例程序
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample5.py。
f = open('myfile.txt', 'r', encoding='UTF-8')
for data in f:
print (data.rstrip('\n'))
f.close()
我在程序的同一目录下创建了一个名为myfile.txt的文件,并输入如下文本:编码以 UTF-8 格式保存。
明天的天气怎么样?
我希望是晴天。
如果不下雨,我们就去公园吧。
然后运行:
python sample5.py
打开文件 myfile.txt,逐行读取文件内容,并将其打印到屏幕上。输出时,换行符不重叠。然后关闭文件对象。
我将解释如何使用 Python 打开本地存储的文本文件并将文本写入文件。可以通过覆盖或附加到文件末尾来写入文件。
打开文件进行写入
要打开文件以写入文本文件,请为打开函数指定模式“w”“a”“x”之一,如下所示:
f = open('myfile.txt', 'w')
f = open('myfile.txt', 'a')
f = open('myfile.txt', 'x')
“w” :如果目标文件不存在,则新建并写入。如果文件已经存在,它将被覆盖(清除文件中原来的内容)。
“a” : 如果目标文件不存在,则新建并写入。如果文件存在,则保留文件原有内容,追加到末尾写入。
“x” : 如果目标文件不存在,则新建并写入。如果文件存在则引发 FileExistsError。
f = open('myfile.txt', 'x')
>> FileExistsError: [Errno 17] File exists: 'myfile.txt'
如果要打开的文件的字符编码与您环境的默认编码不同,请指定字符编码。
f = open('myfile.txt', 'w', encoding='UTF-8')
覆盖写入(w模式)
以“w”模式写入文件。如果文件不存在,则创建它,如果文件已经存在,则覆盖它。
f = open('myfile.txt', 'w')
使用 write 方法将文本写入文件。
write(s)
在参数中指定要写入文件的字符串。
具体写如下。
f = open('myfile.txt', 'w')
f.write('你好\n')
f.close()
write 方法不会自动在末尾写入换行符,因此如有必要,请包含 ‘\n’。
默认情况下,写 '\n' 会自动为您的平台写一个换行符。例如,“\r”是为 macOS 编写的,“\r\n”是为 Windows 编写的。
此外,一次将多个字符串写入文件时,请使用 writelines 方法。
writelines(lines)
指定一个包含字符串的列表作为参数中的元素。将添加到列表的元素按顺序写入文件。
具体写如下。
f = open('myfile.txt', 'w')
datalist = ['你好\n', '你好吗?\n', '回头见\n']
f.writelines(datalist)
f.close()
writelines 方法不会自动写入尾随换行符,因此如有必要,请将“\n”添加到您存储在元素中的字符串中。
在“w”模式下,文件即使存在也会被覆盖,所以文件将使用写入文件时指定的字符编码写入,而不管现有文件的字符编码。即使字符编码不同也不会发生错误。
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample6.py。
f = open('myfile.txt', 'w', encoding='UTF-8')
f.write('你好\n')
datalist = [ '你好吗?\n', '回头见\n']
f.writelines(datalist)
f.close()
然后运行:
python sample6.py
这次 myfile.txt 已经存在,所以我打开文件 myfile.txt 并用文本覆盖文件。然后关闭文件对象。
运行程序后,将在程序所在的同一目录中创建一个名为 myfile.txt 的文件。当我检查文件内容时,它是这样写的。
你好
你好吗?
回头见
追加写入(a模式)
以“a”模式写入文件。如果文件不存在,则新建,如果文件已经存在,则现有内容不变,追加到文件末尾。
f = open('myfile.txt', 'a')
要写入文件,请使用 write 方法或 writelines 方法,如 w 模式。
具体写如下。
f = open('myfile.txt', 'a')
f.write('你好\n')
datalist = [ '你好吗?\n', '回头见\n']
f.writelines(datalist)
f.close()
追加写入已有文件时,如果已有文件的字符编码与写入时使用的字符编码不同,write方法执行时不会报错,但会出现乱码,请注意。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample7.py。
f = open('myfile.txt', 'a', encoding='UTF-8')
f.write('回头见\n')
f.close()
我在程序的同一目录下创建了一个名为myfile.txt的文件,并输入如下文本:编码以 UTF-8 格式保存。
你好
你好吗?
然后运行:
python sample7.py
这次 myfile.txt 已经存在,所以我打开文件 myfile.txt 并附加到文件的末尾。然后关闭文件对象。
运行程序后,查看了myfile.txt文件的内容,发现如下:
你好
你好吗?
回头见
如果文件不存在则写入(x 模式)
以“x”模式写入文件。如果文件不存在,则新建写入,如果文件存在,则会报错。
f = open('myfile.txt', 'x')
要写入文件,请使用 write 方法或 writelines 方法,如 w 模式。
具体写如下。
f = open('myfile.txt', 'x')
f.write('你好\n')
datalist = [ '你好吗?\n', '回头见\n']
f.writelines(datalist)
f.close()
在执行 open 函数时,以 x 模式写入现有文件将引发 FileExistsError。
f = open('myfile.txt', 'x')
>> FileExistsError: [Errno 17] File exists: 'myfile.txt'
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample8.py。
f = open('myfile.txt', 'x', encoding='UTF-8')
f.write('你好\n')
datalist = [ '你好吗?\n', '回头见\n']
f.writelines(datalist)
f.close()
然后运行:
python sample8.py
这次程序运行时 myfile.txt 不存在。创建一个新的 myfile.txt 后,我打开它并用文本覆盖文件。然后关闭文件对象。
运行程序后,将在程序所在的同一目录中创建一个名为 myfile.txt 的文件。当我检查文件内容时,它是这样写的。
你好
你好吗?
回头见
解释如何使用Python打开本地存储的二进制文件,从文件中读取字节数据,以及将字节数据写入文件。
读取和写入二进制文件
打开文件读取二进制文件,指定“rb”,即“r”加“b”,作为打开函数的模式,执行如下。
f = open('myfile.dat', 'rb')
使用 read 方法读取二进制文件中包含的数据。
read([size])
该参数指定要读取的字节数。如果省略该参数,将读取直到 EOF 的所有数据并作为字节对象返回。
当打开文件写入二进制文件时,指定“w”“a”“x”加“b”之一作为打开函数的模式,“wb”“ab”“xb”。然后运行:
f = open('myfile.dat', 'wb')
f = open('myfile.dat', 'ab')
f = open('myfile.dat', 'xb')
使用 write 方法将数据写入二进制文件。
write(b)
将参数中指定的字节对象写入文件。
例如:
f = open('myfile.dat', 'wb')
f.write(b'ABCDEFG')
f.close()
f = open('myfile.dat', 'rb')
data = f.read()
print(data)
>> b'ABCDEFG'
f.close()
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample9.py。
fr = open('icon_o.png', 'rb')
fw = open('icon_c.png', 'wb')
while True:
data = fr.read(1)
if len(data) == 0:
break
fw.write(data)
fw.close()
fr.close()
将文件名为 circle_o.png 的以下图像文件放在与程序相同的目录中。
然后运行:
python sample9.py
逐字节读取图像文件并将读取的数据写入新文件。迭代直到图像文件结束,然后关闭每个文件对象。
运行该程序后,将在程序所在的同一目录中创建一个名为 icon_c.png 的文件。
我能够读取图像文件的数据并将其原样复制到新创建的文件中。
从 Python 3.4 开始,pathlib 模块可用。为路径创建 Path 类的实例,并使用提供的方法来操作文件。本节介绍如何使用 pathlib 模块读写文件。
创建 Path 类的实例
使用以下构造函数创建 Path 类的实例。
class pathlib.Path(*pathsegments)
通过将路径指定为参数来创建 Path 类的实例。
例如:
import pathlib
path = './test/movie'
p = pathlib.Path(path)
创建 Path 类的实例实际上会创建 pathlib.WindowsPath CLASS或 pathlib.PosixPath CLASS的实例,它们是 Path CLASS的子CLASS,具体取决于您的环境(Windows 或非 Windows)。由于我的环境是 Windows,因此创建了 pathlib.WindowsPath 类的一个实例。
import pathlib
path = './test/movie'
p = pathlib.Path(path)
type(p)
>> <class 'pathlib.WindowsPath'>
还提供了 pathlib.WindowsPath CLASS和 pathlib.PosixPath CLASS的构造函数,您可以显式创建实例。
class pathlib.PosixPath(*pathsegments)
class pathlib.WindowsPath(*pathsegments)
但是,在 Windows 环境中,您可以创建 pathlib.WindowsPath 类的实例,但不能创建 pathlib.PosixPath 类的实例(将引发 NotImplementedError)。
import pathlib
path = './test/movie'
wp = pathlib.WindowsPath(path)
pp = pathlib.PosixPath(path)
>> NotImplementedError: cannot instantiate 'PosixPath' on your system
获取文件对象并打开文件
传统的方式是使用open函数获取文件对象,使用文件对象读写文件。使用pathlib模块时,创建一个Path CLASS的实例,然后使用open方法获取文件对象。
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
第一个参数 mode 指定打开文件的模式。您可以指定以下值:指定要在第三个参数 encoding 中使用的字符编码的名称。仅用于文本模式。可以为每个指定什么值与打开函数完全相同。
具体写如下。
import pathlib
p = pathlib.Path('./test/name.txt')
f1 = p.open('r')
f2 = p.open('w+')
f3 = p.open('r', encoding='UTF-8')
f4 = p.open('rb')
Path 类提供了在不使用文件对象的情况下读写文件的方法,但有些功能是无法完成的。在这种情况下,请在获取文件对象后进行处理。
关闭文件
使用完文件后,使用 close 方法关闭文件对象。这与传统方法相同。
import pathlib
p = pathlib.Path('./test/name.txt')
f = p.open('r')
...
...
f.close()
或者,您可以使用 with 语句打开一个文件,然后在使用完后自动关闭该文件。
import pathlib
p = pathlib.Path('./test/name.txt')
with p.open('r') as f:
...
...
读取文本文件
要一次读取所有文本文件,可以使用 Path 类提供的 read_text 方法。
Path.read_text(encoding=None, errors=None)
以文本形式获取路径指示的文件的内容。可选的第一个参数指定字符编码。
如果你使用这个方法,你不需要获取文件对象,你可以这样写:
import pathlib
p = pathlib.Path('./test/name.txt')
print(p.read_text())
>> Yuhua
>> Jiangming
>> Lihong
逐行读取文本文件时,与传统方法一样使用文件对象的 readline 方法。
import pathlib
p = pathlib.Path('./test/name.txt')
f = p.open('r')
while True:
data = f.readline()
if data == '':
break
print (data.rstrip('\n'))
>> Yamada
>> Andou
>> Kuroki
写入文本文件
要将文本写入文本文件,可以使用 Path 类提供的 write_text 方法。
Path.write_text(data, encoding=None, errors=None)
将第一个参数指定的文本写入路径指示的文件。可选的第二个参数指定字符编码。
如果你使用这个方法,你不需要获取文件对象,你可以这样写:
import pathlib
p = pathlib.Path('./test/name.txt')
p.write_text('Yuhua\nJiangming\n')
print(p.read_text())
>> Yuhua
>> Jiangming
请注意,该文件是通过覆盖写入的。如果该文件不存在,将创建它并写入文本。如果要追加写入现有内容,请与传统方法一样使用文件对象的 write 方法等。
读写二进制文件
要从二进制文件中读取字节数据、将字节数据写入二进制文件或写入文本,可以使用 Path 类提供的 read_bytes 方法和 write_bytes 方法。
Path.read_bytes()
获取路径指示的文件的内容作为字节对象。
Path.write_bytes(data)
将参数指定的字节对象写入路径指示的文件。
你可以写:
import pathlib
p = pathlib.Path('./test/name.txt')
p.write_bytes(b'ABCDEFG')
data = p.read_bytes()
print(data)
>> b'ABCDEFG'
如果要指定一次读取数据的字节数,请与传统方法一样使用文件对象的读取方法等。(有关详细信息,请参 阅读写二进制文件)。
示例代码
让我们创建一个简单的示例程序并尝试一下。在文本编辑器中编写以下内容后,将其保存为 sample10.py。
import pathlib
p = pathlib.Path('./test/name.txt')
data = p.read_text()
print(data.split('\n'))
在与程序相同的目录中有一个名为 test 的目录,在 test 目录中有一个 name.txt 文件。
然后运行:
python sample10.py
通过读取指定文件的内容并以换行符作为分隔符向每一行添加元素来创建一个列表。