从文件中读取数据
读取文件、文件路径
#pi_digits.txt
3.1415926535
8979323846
2643383279
#file_reader.py
fillename = 'pi_digits.txt'
#读取整个文件
with open(filename) as file_object:
contents = file_object.read()
print(contents.rstrip())
#逐行读取
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
运行结果:
3.1415926535
8979323846
2643383279
3.1415926535
8979323846
2643383279
函数open()
:接受要打开文件的文件名作为参数。如果没有指定路径,则在当前执行的文件所在的目录中查找指定的文件。此函数返回一个表示文件的对象。
关键字with
:表示在不需要访问文件之后将其关闭。
函数read()
:用于从文件读取指定的字节数,如果未给定或为负则读取所有。到达文件末尾时返回一个空字符串(空行)。打印时可使用函数rstrip()
删掉。
相对文件路径:相对于当前运行的程序所在目录。
绝对文件路径:完整的文件路径。
创建包含文件各行内容的列表并使用
使用关键字with
时,open()
返回的文件对象只在with
代码块内使用。如果要在with
代码块外访问文件内容,可在里边将文件各行存储在一个列表中待后续使用。
filename = 'pi_30_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
运行结果:3.141592653589793238462643383279
32
注意:读取文本文件时,python将其中所有文本都解读稳字符串。
写入文件
将文本写入文件时,调用open()时需要提供另外一个实参。其中,第一个实参时要打开的文件的名称。第二个实参是指定的模式:读取模式('r'
)、写入模式('w'
)、附加模式('a'
)、读取和写入模式('r+'
)。如果省略将以默认的只读模式打开文件。
如果写入的文件不存在,则open()
会自动创建它。如果以写入模式打开文件且指定文件对象存在,则返回文件对象前会清空改文件。
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
运行结果:
programming.txt
I love programming.I love programming.
I love creating new games.
注意:python只能将字符串写入文本文件。函数write()
不会在写入的文本末尾添加换行符。
附加到文件
如果要写入文件并不覆盖,可以使用附加模式。写入的行都会添加到文件末尾。指定文件不存在时,自动创建。
filename = 'programming.txt'
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")
运行结果:
programming.txt
I love programming.I love programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.
异常
异常时python用来管理程序执行期间发生错误的特殊对象。
异常是使用try-except
代码块处理的。如果try
代码块中的代码运行无误,则跳过except
代码块;如果try
代码块中的代码运行出现错误,则运行except
代码块。
print(5/0)
运行结果:
Traceback (most recent call last):
File "division.py", line 1, in <module>
print(5/0)
ZeroDivisionError: division by zero
ZeroDivisionError
是一个异常对象。
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
运行结果:
You can't divide by zero!
使用try-except
代码块也可以隐藏Traceback,防止恶意攻击等等。
除了try-except
代码块还有try-except-else
代码块。其中try
代码块只包含可能导致错误的代码,而依赖于其成功执行的代码都放在else
代码块中。
如果希望发生错误时继续运行,可以在except
代码块中使用pass
语句。pass
语句还充当了占位符,用来提醒我们在程序的某个地方什么都没有做。
存储数据
模块json可以让我们将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。并且还可以使用json在python程序中分享数据。
函数json.dump()
接受两个实参:要存储的数据以及可用于存储数据的文件对象。
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
运行结果:
numbers.json
[2, 3, 5, 7, 11, 13]
函数json.load()
加载存储在指定文件对象的信息。
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
运行结果:
[2, 3, 5, 7, 11, 13]
下面将存取数据和异常结合一下程序运行时,从文件获取用户名,若文件不存在,则提示输入用户名并存储:
import json
# 如果以前存储了用户名就加载它
# 否则提示用户输入用户名并存储它
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
username = input("What is your name? ")
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
else:
print("Welcome back, " + username + "!")
运行结果:
#如果文件不存在
What is your name? Eric
We'll remember you when you come back, Eric!
#如果文件存在
Welcome back, Eric!