Python学习日记 Day12文件

今天是2020年2月21日,晴,6~17℃

现今,文件是程序运行时不可缺少的部分。借助文件储存信息,可以让计算机快速地处理和分析大量数据。

一、文件读取

1、简单读取整个文件

在项目目录下新建一个 .txt 文件,并输入任意内容。随后在程序中添加代码打开该文件。

with open("pi.txt") as file_object:
	pi = file_objct.read()
	print(pi)
'''
Output:
3.1415926535
  8979323846
  2643383279
'''

open 函数将获取文件的路径和文件名,并打开该文件,返回一个文件对象。在只有文件名时,它将打开与代码文件同目录的该文件。若未找到文件,则抛出一个异常。

with 关键字将把紧跟在后面的值赋给 as 关键字后的变量名,在这里,就是将文件对象赋值给 file_object 这个变量名。使用 with 关键字后,程序将在该语句块结束时自动关闭文件,无需手动调用 close 函数。在 with 语句后的语句块结束后,文件被关闭,因此 file_object 这个变量名也不可再使用。

在获取文件对象后,read 方法可以读取文件的所有内容,并存入一个长字符串中,包括换行等符号在内。

相比于原始文件,输出在末尾会多一个空行。read方法到达文件末尾时返回一个空字符串,显示为一个空行。要删除多出来的空行,可使用 rstrip 函数。

事实上,我在使用 read 方法时并未遇到多出空行的情形。或许是新版本的Python修改了这个问题?

2、文件路径

借助在 open 函数中添加文件路径,可以打开计算机中任何位置的文件。

with open("D:\pi.txt") as file_object:		#绝对路径法
    pi = file_object.read()
    print(pi.rstrip())

若文件所在的文件夹在项目目录内,则可以使用相对路径法。
若文件路径较为复杂,或路径是在程序运行时才能知道,可以将路径字符串储存在一个变量中(通常命名为filename),再直接用变量名调用 open 函数。

3、逐行读取文件

打开文件后,利用 for 循环可以遍历文件的每一行。

with open("D:\pi.txt") as file_object:
    for line in file_object:
        print(line)
'''
Output:
3.1415926535

  8979323846

  2643383279
'''

如此输出时,发现每行之间多了一个空行。这是因为每一行末尾的换行符‘ \n ’也被作为字符串的部分存入 line 中,再加上 print 函数自身的换行,就产生了两个换行。要消除多余换行,可以用 rstrip 函数。

with open("D:\pi.txt") as file_object:
    for line in file_object:
        print(line.rstrip())
'''
Output:
3.1415926535
  8979323846
  2643383279
'''

4、创建各行的列表

使用 with 关键字打开文件后,用上例的方法遍历各行只能在 with 下的语句块内进行。若要在退出该语句块,关闭文件后还能使用文件各行的内容,则应该使用 readlines() 方法获取该文件各行内容组成的列表。

with open("D:\pi.txt") as file_object:
    lines = file_object.readlines()
#文件已关闭
for line in lines:
    print(line.rstrip())
'''
Output:
3.1415926535
  8979323846
  2643383279
'''

5、使用文件内容

在完成读取文件内容后,便可以在程序中使用这些内容了。

'''计算圆的面积'''
filename = "D:\pi.txt"
with open(filename) as pi_file:
    lines = pi_file.readlines()
pi = ""
for line in lines:
    pi += line.strip()
pi = float(pi)

radius = float(input("请输入圆的半径:"))
area = radius ** 2 * pi
print("圆的面积是:" + str(area) )
'''
Output:
请输入圆的半径:5
圆的面积是:78.53981633974483
'''

6、书本练习:圆周率中有你的生日吗?

首先下载一个有百万位圆周率的文本文件,然后测试文件中圆周率位数。

'''计算位数'''
filename = "D:\pi_million_digits.txt"
with open(filename) as pi_file:
    lines = pi_file.readlines()
pi = ""
for line in lines:
    pi += line.strip()
print(len(pi))		#Output:1000002

确定文件无误后,开始编写判断代码。

'''生日是否在圆周率中'''
#获取百万位圆周率
filename = "D:\pi_million_digits.txt"
with open(filename) as pi_file:
    lines = pi_file.readlines()
pi = ""
for line in lines:
    pi += line.strip()
#获取生日并判断
birthday = input("请输入您的生日(仅数字):")
if birthday in pi:
    print("恭喜,您的生日在圆周率前一百万位中!")
else:
    print("可惜,您的生日不在圆周率前一百万位中。")
'''
Test1:
请输入您的生日(仅数字):0426
恭喜,您的生日在圆周率前一百万位中!
Test2:
请输入您的生日(仅数字):20000426
可惜,您的生日不在圆周率前一百万位中。
'''

改进代码,使其能输出生日所在的位数。

'''生日是否在圆周率中'''
#获取百万位圆周率
filename = "D:\pi_million_digits.txt"
with open(filename) as pi_file:
    lines = pi_file.readlines()
pi = ""
for line in lines:
    pi += line.strip()
#获取生日、判断并获取位数
birthday = input("请输入您的生日(仅数字):")
i = 2			#从小数点后开始
while i < len(pi):		#由于要修改i,使用while遍历
    temp = i
    flag = False		#判断的结果
    for digit in birthday:
        if digit != pi[i]:
            flag = False
            i = temp + 1
            break
        else:
            flag = True
            i += 1
    if flag:
        print("恭喜,您的生日在圆周率前一百万位中!\n您的生日在第" + str(temp-1) + "到第" + str(i-2) + "位")
        break
if flag == False:
    print("可惜,您的生日不在圆周率前一百万位中。")
'''
Test1:
请输入您的生日(仅数字):1415
恭喜,您的生日在圆周率前一百万位中!
您的生日在第1到第4位

Test2:
请输入您的生日(仅数字):0426
恭喜,您的生日在圆周率前一百万位中!
您的生日在第1391到第1394位

Test3:
请输入您的生日(仅数字):000426
恭喜,您的生日在圆周率前一百万位中!
您的生日在第592739到第592744位

Test4:
请输入您的生日(仅数字):20000426
可惜,您的生日不在圆周率前一百万位中。
'''

二、文件写入

将数据写入文件,可以使数据在程序关闭关闭后仍能保存。并且在下次运行时,程序仍可以读出并使用这些数据。

1、写入空文件

要写入文件,在使用 open 函数时需要一个提供另一个实参。不同的实参对应的文件打开方式不同:

● 写入模式:参数 ‘w’ (若文件存在,会清除原有内容)
● 读取模式:参数 ‘r’ (默认)
● 附加模式:参数 ‘a’
● 读取并写入模式:参数 ‘r+’

下面创建一个文件并写入一行内容:

with open(r"D:\test_text.txt",'w') as file_object:
    file_object.write("Hello World!")
'''
test_text.txt:
Hello World!
'''

打开文件发现内容已写入。

第一个参数在字符串前加r,告诉系统不要对该字符串进行转义,否则路径会出错。

2、写入多行

write 方法不会在末尾添加换行符。若希望文件分行写入,需要手动在末尾添加换行符。

with open(r"D:\test_text.txt",'w') as file_object:
    file_object.write("Hello World!\n")
    file_object.write("Nice to meet you!")
'''
test_text.txt:
Hello World!
Nice to meet you!
'''

Python只能写入字符串。若希望写入数值,则需要使用 str 函数转换。

3、附加到文件

如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式(‘a’)打开文件。以附加模式打开文件时,不会在返回文件对象前清空文件,而将写入到文件的行都将添加到文件末尾。如果指定的文件不存在,将创建一个空文件。

with open(r"D:\test_text.txt",'a') as file_object:
    file_object.write("Hello World!\n")
    file_object.write("Nice to meet you!\n")
'''
test_text.txt:
Hello World!
Nice to meet you!
Hello World!
Nice to meet you!
'''
发布了17 篇原创文章 · 获赞 1 · 访问量 488

猜你喜欢

转载自blog.csdn.net/weixin_44712386/article/details/104426370
今日推荐