文章目录
本文将学到:
- 如何打开文件
- 如何一次性读取整个文件,以及如何以每次一行的方式读取文件的内容;
- 如何写入文件,以及如何将文本附加到文件末尾;
文件概述
- 文件是存储在
辅助存储器
上的的数据序列,是数据的集合和抽象。- 一个文件需要有唯一确定的文件标识,文件标识包括:文件路径、文件名、文件拓展名。
- 文件按编码方式分为
文本文件、二进制
文件两类。
一. 从文件中读取数据
要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
1. 读取整个文件
pi_digits.txt
3.1415926535
8979323846
2643383279
if __name__ == '__main__':
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
操作 | 说明 |
---|---|
a. 接收文件参数 | open接收文件名称。 Python在当前执行的文件所在的目录中查找指定的文件。 |
b. 创建文件实例 | with open('pi_digits.txt') as file_object 返回一个表示文件pi_digits.txt的对象,并将该对象赋给file_object。关键字with在不再需要访问文件后将其关闭。 |
c. 打开和关闭文件 | 使用关键字with时,文件流会自动关闭 |
d. 读取文件 | 使用方法read()读取这个文件的全部内容,并将其作为字符串赋给变量contents。 |
e. 处理空行 | read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在函数调用print()中使用rstrip(): |
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
2. 文件读取的方式
当文件被打开之后,按照开发方式的不同对文件进行相应的读写操作。
- 如果文件用文本文件打开,读写按照字符串的方式进行操作,使用当前计算机使用的编码或指定编码
- 如果使用二进制方式打开,读写方式按照字节流方式操作。
如下三个常用的文件读取方法:
方法 | 说明 |
---|---|
file.read(size) | read()方法默认读取全部内容。size表示读取的字节数 |
file.readline(size) | 默认从文件中读取整行,包含“\n”字符。参数size非负,则返回指定大小的字节数。“\n”算一个字符,但注意一次只读取一行内容。 |
file.readlines(hint) | 默认读取所有行,每行为列表中的一个元素。若参数hint小于等于0,于默认一致。 |
read方法
# Python采用解释器内置的open()函数打开一个文件,并实现该文件 与一个程序变量的关联。
# 文件名、打开模式、文件编码
f=open('example.txt','r', encoding='utf-8')
打开模式用于控制使用何种方式打开文件。如下7种打开模式
readline方法
默认一次读取整行,包括"\n",参数hint说明如下:
a. 为负数读取整行内容
b. 非负,返回指定大小的字符数,但只读一行内容
f = open('runoob.txt', 'r', encoding='utf8')
line1 = f.readline()
print('读取第一行:%s' % line1)
line2_1 = f.readline(5)
print('第二行读入5个字符是:%s' % line2_1)
line2_2 = f.readline(12)
print('接着第二行读入12个字符是:%s' % line2_2)
line3 = f.readline(20)
print('第三行读入20个字符是:%s' % line3)
f.close()
readlines方法
用于从文件或流中一次性读取多行数据,返回数据存入下一个列表中。
参数hint用于查询的字节数
- 在文本文件模式下,字符数量是以unicode编码的字符集的字符为单位来计算,及支持多字节的字符,如中文一个汉字表示一个字符,并且计算数量时剔除了换行符。
- 在二进制模式下,字符数量是以ASCII码对应的单字节为单位来计算,不剔除换行符\n,\n占一个字节长度。
- 如果hint大于前n行的总字数但小于前n+1行的总字数,则执行函数会读取文件的前n+1行
- 当hint<=0时,会读取整个文件的内容
with open('runoob.txt', 'r', encoding='utf8') as f:
content = f.readlines()
print('全部字符串:%s' % content)
with open('runoob.txt', 'r', encoding='utf8') as f:
# 返回20个字节的内容,如果一行没有20字节,则返回两行
content = f.readlines(20)
print('读取的字符串是:%s' % content)
3. 文件路径
相对路径
例如,你可能将程序文件存储在了文件夹python_work中,而该文件夹中有一个名为text_files的文件夹用于存储程序文件操作的文本文件。
可以使用相对文件路径来打开其中的文件,该位置是相对于当前运行的程序所在目录的。
with open('text_files/filename.txt') as file_object:
绝对文件路径
将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在什么地方了。这称为绝对文件路径。
file_path = '/home/ehmatthes/other_files/text_files/_filename_.txt'
with open(file_path) as file_object:
二. 写入文件
1. write和writelines
python提供了两个与文件内容写入的有关方法
方法 | 含义 |
---|---|
file.write(s) | 向文件中写入(s)一个字符串或字节流 。返回为本次写入文件的字节流 |
file.writelines(lines) | 将一个元素全为字符串的列表 (lines)写入文件 |
with open('write.txt', 'w') as f1:
f1.write('1:www.runoob.com\n')
with open('write.txt', 'w') as f1:
num = f1.write('2:www.runoob.com\n') # 看下write()的返回值
print(num) # 16
with open('write.txt', 'w') as f1:
f1.write('1:www.runoob.com\n')
with open('write.txt', 'a') as f1:
num = f1.write('2:www.runoob.com\n') # 看下write()的返回值
print(num) # 16
with open('write.txt', 'w') as f2:
li = ['basketball\n', 'baseball\n', 'football\n', 'volleyball\n']
f2.writelines(li)
2. 写入模式
with open('pi_digits.txt','w') as file_object:
file_object.write("I love python")
- 实参一也是要打开的文件的名称。
- 实参二(‘w’)告诉Python,要以写入模式打开这个文件。
– 打开文件时,可指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或读写模式(‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。
– 如果要写入的文件不存在,函数open()将自动创建它
。然而,以写入模式(‘w’)打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件的内容。
1. 注意转换数值为str
Python
只能将字符串
写入文本文件。要将数值
数据存储到文本文件中,必须先使用函数str()
将其转换为字符串格式。
2. 不会自动添加换行符:
注意:函数write()不会在写入的文本末尾添加换行符,
with open('programming.txt', 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
要让每个字符串都单独占一行,需要在方法调用write()中包含换行符。
3. 附加到文件
如果要给文件添加内容,而不是覆盖原有的内容,可以以附加模式打开文件。
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
file_object.write("I love creating apps that can run in a browser.\n")
三. 文件系统其他API
方法 | 说明 |
---|---|
file.flush | 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件 |
file.seek(offset,whence) | 设置文件当前操作指针的位置,offset是开始的偏移量,whence表示从那个位置开始偏移 |
file.tell | 返回文件当前操作指针的位置,返回值非负,表示当前指针相对开始位置的偏移量 |
file.truncate(size) | 截取文件,截取的字节通过size指定,默认为当前文件位置 |
seek将文件指针移动到指定位置,tell获取当前指针位置,他们配合使用。
# 打开一个文件
from io import SEEK_END
file = open('workfile.txt', 'r')
# 移动文件指针到文件开头
file.seek(0)
# 读取文件的前 10 个字符
content = file.read(10)
print(content) # 输出文件前 10 个字符
# 移动文件指针到文件末尾
file.seek(0, SEEK_END)
# 获取文件末尾的偏移量
end_position = file.tell()
print(f"End position: {end_position}")
# 关闭文件
file.close()
# 以读写模式打开文件
file = open('example.txt', 'r+')
# 读取文件内容
content = file.read()
print("Original content:")
print(content)
# 截断前 10 个字符
file.truncate(10)
# 将文件指针移动到文件开头并重新读取内容
file.seek(0)
modified_content = file.read()
print("\nModified content:")
print(modified_content)
# 关闭文件
file.close()
# Original content:
# 0123456789abcdef
# Modified content:
# 0123456789
四. 存储数据
模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据
1. 使用json.dump()和json.load()
第一个程序将使用json.dump()来存储这组数,而第二个程序将使用json.load()。
if __name__ == '__main__':
# 写入文件
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f:
json.dump(numbers, f)
# 读文件
with open(filename) as f:
numbers_read = json.load(f)
print(numbers_read)
2. 保存和读取用户生成的数据
import json
if __name__ == '__main__':
# 如果以前存储了用户名,就加载它。
# 否则,提示用户输入用户名并存储它。
filename = 'username.json'
try:
with open(filename) as f:
username = json.load(f)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f:
json.dump(username, f)
print(f"We'll remember you when you come back, {username}!")
else:
print(f"Welcome back, {username}!")
参考:《Python编程:从入门到实践(第二版)》