# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:
form:《Python编程从入门到实践》
"""
10.1.1 读取整个文件
要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数
点后30位的圆周率值,且在小数点后每10位处都换行:
pi_digits.txt
3.1415926535
8979323846
2643383279
下面的程序打开并读取这个文件,再将其内容显示到屏幕上:
with open('pi_digits.txt') as pi:
contents = pi.read()
print(contents)
函数open()接受一个参数:
要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。
关键字with在不再需要访问文件后将其关闭
当然不使用with语句,你也可以调用open()和close()来打开和关闭文件
相比于原始文件,该输出唯一不同的地方是末尾多了一个空行
3.1415926535
8979323846
2643383279
为何会多出这个空行呢?因
为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删
除多出来的空行,可在print语句中使用rstrip()
方法rstrip()删除(剥除)字符串末尾的空白
with open('pi_digits.txt', ) as pi:
contents = pi.read()
print(contents.rstrip())
现在,输出与原始文件的内容完全相同:
3.1415926535
8979323846
2643383279
10.1.2 文件路径
要让Python打开不与程序文件位于同一个目录中的文
件,需要提供文件路径,它让Python到系统的特定位置去查找。
由于文件夹text_files位于文件夹python_work中,因此可使用相对文件路径来打开该文件夹中
的文件。相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目
录的。在Linux和OS X中,你可以这样编写代码:
with open('text_files/filename.txt') as file_object:
pass
这行代码让Python到文件夹python_work下的文件夹text_files中去查找指定的.txt文件。在
Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/):
with open('text_files\filename.txt') as file_object:
pass
# 防止转义可以写成
with open(r'text_files\filename.txt') as file_object:
pass
你还可以将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在
什么地方了。这称为绝对文件路径。
绝对路径通常比相对路径更长,因此将其存储在一个变量中,再将该变量传递给open()会有
所帮助。在Linux和OS X中,绝对路径类似于下面这样:
file_path = '/home/ehmatthes/other_files/text_files/filename.txt'
with open(file_path) as file_object:
pass
# 而在Windows系统中,它们类似于下面这样:
file_path = r'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:
pass
10.1.3 逐行读取
读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以
某种方式修改文件中的文本。
要以每次一行的方式检查文件,可对文件对象使用for循环:
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
10.1.4 创建一个包含文件各行内容的列表
使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外
访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该
列表:
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
# readlines()从文件中读取每一行,并将其存储在一个列表中
for line in lines:
print(line.rstrip())
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()
print(pi_string)
print(len(pi_string))
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()
print(pi_string)
print(len(pi_string))
3.141592653589793238462643383279
32
10.1.6 圆周率值中包含你的生日吗
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
birthday = input("请输入您的生日,如20220202: ")
if birthday in pi_string:
print('您的生日存在于圆周率中')
else:
print('圆周率中未匹配到您的生日')