9.1从文件中读取数据 文本文件可以存储的数据量及其丰富:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或是修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。
with open('pi_digits.txt') as file_object:
contents=file_object.read()
print(contents.rstrip())
read()到达文件末尾时返回一个空字符串,而将这个空字串显示出来时就是一个空行。因此在打印输出时,在print语句中使用了rstrip()。 Python一般都是在当前执行文件的所在目录中查找文件,可有时候要打开不在程序文件所属目录中的文件,因此可使用相对文件路径来打开该文件夹中的文件。
file_path='C:\Users\ehmatthes\other_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.rstrip())
在每行的末尾都有着一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符,一个来自文件一个来自print语句,为消除多余的空白行,可在print语句中使用rstrip()。 在使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。
filename='pi_digits.txt'
with open(filename) as file_object:
lines=file_object.readlines()
若字符串要删除空格,则可以使用strip()而不是rstrip()。 检查字符串是否包含在另一个字符串中可以使用in。
if birthday in pi_string:
print("...")
9.2写入文件 要将文本写入文件,你在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。
filename='programming.txt'
with open(filename,'w') as file_object:
file_object.write("I love programming.")
在调用open()时的第二个实参可以指定读取模式(‘r’)、写入模式(’w’)、附加模式(‘a’)或是可以读取和写入文件的模式(‘r+’),如果你省略模式实参,Python将以默认的只读模式打开文件。 函数write()不会在你写入的文本末尾添加换行符,因此在你写入多行时且没有指定换行符,文件看起来可能不是你希望的那样。 附加到文件 如果你要给文件添加内容,而不是覆盖原有的内容,可以使用附加模式打开文件。当你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。
filename='programming.txt'
with open(filename,'a') as file_object:
file_object.write("I also love finding meaning in large datasets.\n")
9.3 异常 Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。 使用try-except代码块 当你认为可能发生了错误时,可编写一个try-except代码块来处理可能引发的异常。你让Python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。
try:
print(5/0)
except ZeroDivisionError:
print("You can't dibide by zero!")
使用异常避免程序崩溃 在发生错误时,如果程序还有工作没有完成,妥善地处理错误尤其重要。如果程序可以妥善地处理错误,就可以提示用户进行合理操作,而不至于崩溃。
print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number=input("\nFirst number: ")
if first_number=='q':
break
second_number=input("Second number: ")
try:
answer=int(first_number)/int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
分析文本 方法split()以空格为分隔符将字符串分拆成多个部分,并且将这些部分存储到一个列表中。结果时一个包含字符串中所有单词地列表,虽然有些单词可能含有标点。
filename='alice.txt'
try:
with open(filename) as f_obj:
contents=f_obj.read()
except FileNotFoundError:
msg="sorry,the file "+filename+" does not exist."
print(msg)
else
words=contents.split()
num_words=len(words)
print("The file "+filename+" has about "+str(num_words)+" words.")
在有些时候我们需要告诉用户,有一个步骤进行失败,但是并非每次捕获到异常时都需要告诉用户,有时候你希望程序在异常发生时一声不吭,就像什么都没发生一样继续运行。
def count words(filename):
try:
==snip==
except FileNotFoundError:
pass
else:
==snip==
9.4存储数据 很多程序都要求用户输入某种信息,并保存他们所提供的信息:一种简单的方式是使用模块json来存储数据。JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式。 json.dump()和json().load()的使用 我们来编写一个存储一组数字的简短程序,再写一个将这些数字读取到内存中的程序。第一个程序使用json.dump()来存储这些数字,而第二个程序将使用json.load()。 函数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)
with open(filename) as f_obj:
numbers=json.load(f_obj)
保存和读取用户生成的数据
improt 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+"!")
在编程过程中,你经常会遇到这样的情况:代码可以正确的运行,但可以做进一步的改进——将代码划分为一系列完成具体工作的函数。这样的过程叫做重构。
|