时间:2018/5/5(毕设拖更了一个月 又啥都不会了- -!)
内容:文件和异常
文件和异常
通过文件操作使你能快速地分析大量数据;异常是Python创建的特殊对象,用于管理程序运行时出现的错误。
从文件中读取数据
读取整个文件
在目录下创建pi_digits.txt文件,其中记录π的浮点数。尝试打开并读取这个文件并且打印显示到屏幕上。
with open('/work\pi_digits.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
#该文档保存在c盘work文件夹中
#关键字with在不再需要访问文件后将其关闭。也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()未执行,文件将不会关闭。函数open()返回的是一个表示形参所代表文件的对象,python将这个对象储存在我们将在后面使用的变量(file_object)中。
#我们使用方法read()读取这个文件的全部内容,并将其作为字符串储存在变量contents内。打印contents时又使用方法rstrip()去除字符串后的空行,而read()方法到达文件末尾时返回一个空字符串。
文件路径
使用以下语句在文件夹中寻找文件:
with open('text_file/filename.txt') as file_object:
可以将文件在计算机中的准确位置告诉Python,这称为绝对文件路径,在相对路径行不通时可以使用绝对路径。而绝对路径一般来说相对较长,因此将其储存在一个变量中,再将该变量传递给open()。
file_path = 'C:\User\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:
#windows中路径使用反斜杠\, linux及os X中使用斜杠/。
!windows系统有时候能够正确地解读文件路径中的斜杠。另外,由于反斜杠在python中被视为转义标记,为在windows中确保万无一失,应以原始字符串的方式指定路径,即在开头的单引号前加上r。
逐行读取
要以每次一行的方式检查文件,可以对文件对象使用for循环:
file_name = r'C:/work/pi_digits.txt'
with open(file_name) as file_object:
for line in file_object:
print(line)
打印后会出现空行,原因是因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句,消除这些空白,可以在print语句中使用rstrip()方法。
file_name = r'C:/work/pi_digits.txt'
with open(file_name) as file_object:
for line in file_object:
print(line.rstrip())
创建一个包含文件各行内容的列表
使用关键字with时,open()返回的文件对象只有在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行储存在一个列表里,并在with代码块外使用该列表。
file_name = r'C:\work\pi_digits.txt'
with open(file_name) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
方法readlines()从文件中读取每一行,并将其储存在一个列表中;接下来该列表被储存在变量lines中。
使用文件的内容
file_name = r'C:\work\pi_digits.txt'
with open(file_name) as file_object:
lines = file_object.readlines()
pi_string = ' '
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
读取文本文件时,python将其中所有的文本都解读为字符串。如果读取的是数字并需要将其作为数字使用,必须使用int()或者float()进行数据类型转换。
包含一百万位的大型文件
file_name = r'C:\work\pi_million_digits.txt'
with open(file_name) as file_object:
lines = file_object.readlines()
pi_string = ' '
for line in lines:
pi_string += line.strip()
print(pi_string[:52] + '.....')
print(len(pi_string))
打印前50位π的前50位,该txt文档包括小数点后100000位。
圆周率中包含你的生日吗?
file_name = r'C:\work\pi_million_digits.txt'
with open(file_name) as file_object:
lines = file_object.readlines()
pi_string = ' '
for line in lines:
pi_string += line.strip()
birthday = input('Enter your birthday,in the form mmddyy: ')
if birthday in pi_string:
print('Your birthday appears in the first million digits of pi!')
else:
print('Your birthday doesn\'t appears in the first million digits of pi!')
写入文件
写入空文件
filename = r'C:\work\programing.txt'
with open(filename,'w') as file_object:
file_object.write('I love programing.')
调用open()时提供另一个实参,告诉python你要写入打开的文件。打开文件时,可指定读取模式('r')、写入模式('w')、附加模式('a')或让你能够读取和写入文件的模式('r+').如果省略了模式参数,python将以默认的只读模式打开文件。
!python只能将字符串写入文件,要将数值写入文件,需要使用函数str()将其转换成字符串形式。
!如果你写入的文件不存在,函数open()将自动创建它。然而,以写入('w')模式打开文件时千万小心,因为如果指定的文件已经存在,python将在返回文件对象前清空该文件。
写入多行
函数write()不会在你写入的文本末尾添加换行符,所以多行写入需要使用换行符。还可以使用空格制表符来调整输出格式。
filename = r'C:\work\programing.txt'
with open(filename,'w') as file_object:
file_object.write('I love programing.\n')
file_object.write('I love creating new games!\n')
附加到文件
给文件添加内容而不是覆盖原有内容,可使用附加模式打开文件。
filename = r'C:\work\programing.txt'
with open(filename,'a') as file_object:
file_object.write('I love programing.\n')
file_object.write('I love creating new games!\n')
异常
python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让python不知所措的错误时,他都会创建一个异常对象。如果你编写了处理该异常的代码,程序将会继续进行,如果你未对异常进行处理,程序将停止,显示traceback。
异常时使用try-except代码块处理的,它可以使python执行指定操作,同时报告python发生异常时怎么办。即便出现异常,程序也将继续运行:显示你编写的友好的错误信息,而不是令用户迷惑的traceback。
处理ZeroDivisionError错误
比如你用5/0:
print(5/0)
得到traceback:
Traceback (most recent call last):
File "C:\work\new 11122.py", line 1, in <module>
print(5/0)
ZeroDivisionError: division by zero
使用try-except代码块
try:
print(5/0)
except ZeroDivisionError:
print('You can\'t divide 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:')
if second_number == 'q':
break
answer = int(first_number) / int(second_number)
print(answer)
上述程序未考虑除数为0时崩溃的情况。
else代码块
通过将可能引发错误的代码放在try-except代码块中,可以提高这个程序抵抗错误的能力。
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:')
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print('You can\'t divide by zero!')
else:
print(answer)
try-except-else代码块工作原理如下:python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放入try语句中。
处理FileNotFoundError异常