10.1.1 读取整个文件
首先创建一个文件如:pi_digits.txt
下面的程序可以读取该文件,再将其内容显示到屏幕上:
1 with open("pi_digits.txt") as file_object: 2 contents=file_object.read() 3 print(contents)
运行结果:
>>> ================== RESTART: F:/python学习/10/10.1/file_reader.py ================= 3.1415926535 8979323846 2643383279 >>>
说明:
1.使用方法read()读取文件(该文件如果与程序文件在同一目录下,直接使用文件名,否则需加绝对路径)。
2.关键字 with 在不再需要访问文件后将其关闭(你只管打开文件,并在需要时使用它,python自会在合适的时候自动将其关闭。)
3.使用关键字with与使用close()方法比较,避免了因为程序bug而导致close()语句未能执行文件不能关闭,导致文件丢失或受损,或程序中过早的调用close()语句,当需要调用文件时它已经关闭的情况。
10.1.2 文件路径
可以将需要读取的文件的准确位置(即绝对路径)告诉python,这样就不用关心当前 运行程序存储在什么地方了。
绝对路径通常比相对 路径更长,因此可以将其存储在一个变量中,再将该变量传递给open()会有所帮助。
file_path="f:/python学习/10/10.1/py_digist.txt" with open(file_path) as file_object:
通过使用绝对路径,可读取系统任何地方的文件。
10.1.3 逐行读取
要以每次一行的方式检查文件,可对文件对象使用for 循环:
filename="pi_digits.txt" with open(filename) as file_object: for line in file_object: print(line)
运行结果:
>>> ================ RESTART: F:/python学习/10/10.1/file_readlines.py ================ 3.1415926535 8979323846 2643383279 >>>
说明:
1.第一行,把需要打开的文件名存储在一个变量中
2.使用with关键字让python负责妥善的打开和关闭文件。
问题:每打印一行时,发现多出一个空行。
原因:因为在这个文件中,每一行末尾都有一个看不见的换行符,而print()语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句
解决方法:可以在print语句中使用rstrip()
优化后的代码如下:
filename="pi_digits.txt" with open(filename) as file_object: for line in file_object: print(line.rstrip())
运行结果如下:
>>> ================ RESTART: F:/python学习/10/10.1/file_readlines.py ================ 3.1415926535 8979323846 2643383279 >>>
10.1.4 创建一个包含文件各行内容的列表
下面的示例在with代码块中将文件pi_digits.txt的各行存储在一外列表 中,再在with代码块外打印它们:
1 filename="pi_digits.txt" 2 with open(filename) as file_object: 3 lines=file_object.readlines() 4 for line in lines: 5 print(line.rstrip())
说明:readelines()方法实现从文件中读取每一行,并将其存储在一个列表中。
10.1.5使用文件的内容
将文件读取到内存中后,就可以以任何方式使用这些数据了。
下面以简单的方式使用圆周率的值。
filename="pi_digits.txt" with open(filename) as file_object: lines=file_object.readlines() pi_string="" #创建一个字符串变量,用于存储圆周率的值 for line in lines: pi_string+=line.rstrip()#将各行都加入pi_string,使用rstrip()方法删除每行末尾的换行符 print(pi_string) print(len(pi_string))
运行结果:
>>> =================== RESTART: F:/python学习/10/10.1/pi_string.py ================== 3.1415926535 8979323846 2643383279 36 >>>
发现问题:在变量pi_string存储的字符串中,包含原来位于每行左边的空格,为删除这些空格,可使用strip()而不是rstrip()。
优化后代码如下:
filename="pi_digits.txt" with open(filename) as file_object: lines=file_object.readlines() pi_string="" #创建一个字符串变量,用于存储圆周率的值 for line in lines: pi_string+=line.strip()#将各行都加入pi_string,使用strip()方法删除所有的空格 print(pi_string) print(len(pi_string))
运行结果如下:
>>> =================== RESTART: F:/python学习/10/10.1/pi_string.py ================== 3.141592653589793238462643383279 32 >>>
10.1.6 包含一百万位的大型文件
对于可处理的数据量,python没有任何限制,只要系统的内存足够多,想处理多少数据都可以。
例:打印圆周率小数点后50位,打开的文件中包含精确到小数点合100位的圆周率。
代码如下:
filename="pi_ hundred_digits.txt" with open(filename) as file_object: lines=file_object.readlines() pi_string="" #创建一个字符串变量,用于存储圆周率的值 for line in lines: pi_string+=line.strip()#将各行都加入pi_string,使用strip()方法删除所有的空格 print(pi_string[:52]+"...")#只打印出小数点后50位 print(len(pi_string))
运行结果:
>>>
============== RESTART: F:/python学习/10/10.1/pi_ hundred_string.py ==============
3.14159265358979323846264338327950288419716939937510...
102
>>>
10.1.7圆周率值中包含你的生日吗
如果你想知道自己的生日是否包含在圆周率中,可将生日表示为一个由数字组成的字符串,再检查这个字符串是否包含在pi_string中:
代码如下:
filename="pi_ hundred_digits.txt" with open(filename) as file_object: lines=file_object.readlines() pi_string="" #创建一个字符串变量,用于存储圆周率的值 for line in lines: pi_string+=line.strip()#将各行都加入pi_string,使用strip()方法删除所有的空格 birthday=input("请输入你的生日:")#提示输入生日,以字符串形式。 if birthday in pi_string: #检查这个字符串是否包含在pi_string中 print("你的生日在圆周率的前100位之中!") else: print("你的生日没有在圆周率的前100位之中!")
运行两次结果:
>>> ============= RESTART: F:/python学习/10/10.1/birthday_in_pi_string.py ============ 请输入你的生日:20010203 你的生日没有在圆周率的前100位之中! >>> ============= RESTART: F:/python学习/10/10.1/birthday_in_pi_string.py ============ 请输入你的生日:79323 你的生日在圆周率的前100位之中! >>>