1从文件中读取数据
文件路径
Python在当前执行的文件所在的目录中查找指定的文件。
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
open(‘pi_digits.txt’)返回一个表示文件pi_digits.txt的对象
你只管打开文件,并在需要时使用它,Python自会 在合适的时候自动将其关闭。
我们使用方法**read()**读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。这样,通过打印contents 的值,就可将这个文本文件的全部内容显示出来
read()到达文件末尾时返回一个空字符串print(contents.rstrip())
ith open('text_files/filename.txt') as file_object:
这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。
file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:
逐行读取
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
print(line.rstrip()) #消除空白行
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
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(pi_string[:52] + "...") #处理任意的数据量
print(len(pi_string))
读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并 要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转 换为浮点数。
2写入文件
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
第一个实参也是要打开的文件的名称;
第二个实参(‘w’)告诉Python,我们要以写入模式打开这个文件。
打开文件时,可指定读取模 式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或让你能够读取和写入文件的模式(‘r+’)。
如果你省略了模式实参,Python将以默认的只读模式打开文件。
如果你要写入的文件不存在,函数open()将自动创建它。
然而,以写入(‘w’)模式打开文 件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数 str()将其转换为字符串格式。
需要在write()语句中包含换行符
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
附加模式‘a’
你以附加模式 打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。
3异常
当你认为可能发生了错误时,可编写一个try-except代码块来处理可能引发的异常。
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
我们将导致错误的代码行print(5/0)放在了一个try代码块中。如果try代码块中的代码运行 起来没有问题,Python将跳过except代码块;如果try代码块中的代码导致了错误,Python将查找 这样的except代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。
程序崩溃可不好,但让用户看到traceback也不是好主意。不懂技术的用户会被它们搞糊涂, 而且如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息。例如,他将知道你的程 序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息 判断出可对你的代码发起什么样的攻击。
try-except-else代码块
工作原理大致如下:Python尝试执行try代码块中的代码;只有可 能引发异常的代码才需要放在try语句中。有时候,有一些仅在try代码块成功执行时才需要运行 的代码;这些代码应放在else代码块中。except代码块告诉Python,如果它尝试运行try代码块中 的代码时引发了指定的异常,该怎么办。
word_count.py
:# 计算文件大致包含多少个单词
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) +
" words.")
pass
try:
--snip--
except FileNotFoundError:
pass
else:
--snip--
4 存储数据
JSON(JavaScriptObjectNotation)格式最初是为JavaScript开发的,但随后成了一种常见 格式,被包括Python在内的众多语言采用。
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
filename = 'numbers.json' 12
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
使用函数json.load()加载存储在numbers.json中的信息, 并将其存储到变量numbers中。
remember_me.py
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 + "!")
重构
代码能够正确地运行,但可做进一步的改进——将代码划分为 一系列完成具体工作的函数。这样的过程被称为重构。
import json
def get_stored_username():
"""如果存储了用户名,就获取它"""
filename = 'username.json'
try:
with open(filename) as f_obj:
username = json.load(f_obj)
except FileNotFoundError:
return None
else:
return username
def greet_user():
"""问候用户,并指出其名字"""
username = get_stored_username()
if username:
print("Welcome back, " + username + "!")
else:
username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f_obj:
json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
greet_user()