目录
9.1从文件中读取数据
9.1.1要读取文件
要读取文件,需要一个包含几行文本的文件。
我们先传建一个文件,内容包含圆周率值小数点后30位,且在小数点后每10位处换行
然后我们在同一个目录下写一个file_reader.py的程序来读取这个文件
with open('pi.txt') as file_object:
contents = file_object.read()
'''输出有空行'''
print(contents)
'''输出无空行'''
print(contents.rstrip())
代码解析:
1.这个程序的第一行代码做了大量的工作。函数open():要以任何方式使用文件,都要先打开文件,才能访问它。函数open()接受一个参数:要打开的文件的名称。接着python在当前执行的文件所在的目录中查找指定的文件。查找到之后函数open()返回一个表示文件的对象。(在这个程序中,open(‘pi.txt’)返回一个表示文件pi_digits.txt的对象,python将该对象赋给file_object供以后使用)
2.关键字with在不需要访问文件后将其关闭。(在这个程序中,我们调用了open(),但没有调用close()。也可以调用open()和close()来打开和关闭文件。但是这样做的话,如果存在bug导致方法close()未执行,文件将不会关闭,这将会导致很多错误。所以使用with比较好,让程序在合适的时候自动关闭文件。)
3.有了表示pi.txt的文件对象后,使用方法read()读取这个文件的全部内容,并将其作为一个长长的字符串赋给变量contents。
4.我们会发现,相比较原始文本,该输出末尾多了一个空行,这是因为read()到达文件末尾时返回一个空字符串,而将这个空格字符显示出来就是一个空行。要删除多的空行,可在函数调用print()中使用rstrip()
9.1.2文件路径
¥什么是绝对路径:
大家都知道,在我们平时使用计算机时要找到需要的文件就必须知道文件的位置,而表示文件的位置的方式就是路径,例如只要看到这个路径:c:/website/img/photo.jpg我们就知道photo.jpg文件是在c盘的website目录下的img子目录中。这样完整的描述文件位置的路径就是绝对路径。我们不需要知道其他任何信息就可以根据绝对路径判断出文件的位置。
¥什么是相对路径:
所谓相对路径,顾名思义就是自己相对与目标位置。不论将这些文件放到哪里,只要他们的相对关系没有变,就不会出错。 另外我们使用“../”来表示上一级目录,“../../”表示上上级的目录,以此类推。
9.1.3逐行区读
读取文件时,常常需要检查其中的每一行:可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。
例:要以每次一行的方式检查文件,可对文件对象使用for循环
'''逐行读字'''
with open('pi.txt') as file_object:
for line in file_object:
print(line)
9.1.4创建一个包含文件各行内容的列表
使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表:可以立即处理文件的各个部分,也可推迟到程序后面再处理。
方法readlines() 从文件中读取每一行,并将其存储在一个列表中。
例:在with代码块中将文件pi.txt的各行存储在一个列表中,再在with代码块外打印。
'''使用关键字with时,open()返回的文件对象只在代码块内可用,从文件中读取每一行'''
with open('pi.txt') as file_object:
lines=file_object.readlines()
for line in lines:
print(line.rstrip())
9.1.5使用文件的内容
将文件读取到内存中后,就能以任何方式使用这些数据了。
例:以简单的方式使用圆周率的值。先创建一个字符串,它包含文件中存储的所有数字,且没有任何空格。
'''使用文件内容'''
with open('pi.txt') as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
创建一个变量pi_string,用于指向圆周率的值。接下来,用一个循环将各行加入pi_string,并删除每行末尾的换行符,打印这个字符串及其长度。
变量pi_string指向的字符串包含原来位于每行左边的空格,为删除这些空格,可以使用strip()。
9.1.6包含一百万位的大型文件
上面这个代码也可以用来处理大文件,比如说圆周率值小数点后一百万位。
我们来看下代码就行了,不用输出了
例:圆周率值小数点后一百万位,我们只输出前66位(要用到切片),后面都用省略号代替。也能检查是否包含某一串字符于其中
with open('pi_million_digits.txt') as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(f"{pi_string[:66]}...")
print(len(pi_string))
birthday=input("enter your birthday:")
if birthday in pi_string:
print("yes")
else:
print("no")
9.2写入文件
保存数据的最简单的方式之一是将其写入文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:可在程序结束运行后查看这些输出,可以与别人分享输出文件,还可以编写程序来将这些输出读取到内存中并进行处理。
读取模式---r
写入模式---w
附加模式---a
读写模式---r+
9.2.1写入空文件
要将文本写入文件,我们在调用open()时需要提供另一个实参,告诉python我们要写入打开的文件
(后文代码示例)
9.2.2写入多行
函数write()不会在写入的文本末尾添加换行符,因此如果写入多行时没有指定换行符,文件看起来可能与我们预期不一样。
要让每个字符串都独占一行,需要在方法调用write()中包含换行符。
9.2.3附加到文件
如果要给文件添加内容,而不是覆盖原有内容,可以以附加模式打开文件。以附加模式打开文件时,python不会再返回文件对象前清空文件的内容,而是将写入文件的行添加到文件末尾。如果指定的文件不存在,python将自动创建一个文件。
filename='001.txt'
with open(filename,'w') as file_object:
file_object.write("I love programme.\n")
with open(filename,'a') as file_object:
file_object.write("I hat it!")
with open('001.txt') as file_object:
content=file_object.read()
print(content)
9.3异常
python使用称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让python不知所措的错误时,她都会创建一个异常对象。如果我们编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止并显示traceback,其中包含有关异常的报告。
异常是使用try-except代码块处理的。try-except代码块让python执行指定的操作,同时告诉python发生异常时怎么办。使用try-except代码块时,即使出现异常程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
9.3.1使用ZeroDivisionError处理异常
因为0不能作为除数,所以这里发生了异常
9.3.2使用try-except代码块
当我们认为可能会发生错误时,可以编写一个try-except代码块来处理可能引发的异常。让python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常该怎么办。
try:
print(5/0)
except ZeroDivisionError:
print("you can't divide by zero!")
9.3.3使用异常避免崩溃
发生错误时,如果程序还有工作尚未完成,妥善地处理错误就尤其重要。这种情况经常会出现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。
9.3.4else代码块
将可能引发错误的代码放在try-except代码块中,可提高程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此需要将它放到try-except代码块中。
9.3.5处理FileNotFoundError异常
使用文件时,一种常见的问题是找不到文件:查找的文件可能在其他地方、文件名可能不正确、或者这个文件根本就不存在。
对于这些问题,都可以使用try-except代码块以直观的方式处理。
9.3.6分析文本(方法split())
方法split()能根据一个字符串创建一个单词列表。
方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
如果分析的某个文件不存在,将丝毫不影响该程序处理其它文件。
9.3.7静默失败
在程序中,并非每次捕获到异常都需要告诉用户,有时候我们希望程序发生异常时保持沉默,就像什么都没发生一样。
让程序静默失败,可想通常那样编写try代码块,但在except代码块中使用pass语句,可以让python在代码块中什么都不要做。
pass语句还可充当占位符
9.4存储数据
编写--json.dump()
读取--json.load()
这是一种共享数据的简单方式
9.5重构
将代码划分为一系列完成具体工作的函数,这样的过程被称为重构。重构让代码更清晰、更易于理解、更容易扩展
请指正