# _*_ 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('圆周率中未匹配到您的生日')