【人生苦短,我学 Python】(8)文件的读写和过滤器

发布时间:2023年12月21日

简述 / 前言

上一篇我们介绍了 Python 的输入(input)和输出(print),以及如何通过命令行给程序传入参数。这篇文章就讲讲 Python 怎么读取我们的文件(比如 txt, excel 等),当然现在我们只用 Python 自带的模块和方法来介绍,后期我们还会讲一个数据处理经常用来操作表格的第三方库(pandas)。

1. 文件的操作

  • 通过内置函数 open()创建或打开文件对象;

    • 格式open(file, mode='r', buffering=-1, encoding=None)
    • 使用 open() 函数时,可以指定打开文件的模式 mode 为:‘r’(只读)、‘w’(写入,写入前删除旧内容)、‘x’(创建新文件,如果文件存在,则导致FileExistsError)、‘a’(追加)、‘b’(二进制文件)、‘t’(文本文件,默认值)、‘+’(更新,读写)
    • 特别要注意的是,当我们在读写文件的时候,最好配合异常机制一起写,即下面这段代码,关于异常处理会在之后介绍,这里仅仅有个印象即可!
      try:    # 这部分一定会执行的
          f = open("test.txt", mode='r')
      except: # 如果出现异常就会执行这段代码,否则跳过这段代码
          print(f'文件读取异常,未正确打开文件!')
      finally:    # 最终不管是否有异常,都会执行这段代码,确保关闭打开的文件
          f.close()
      
  • 通过文件对象的实例方法 write/writelines,可以写入字符串到文本文件;

  • 通过文件对象的实例方法 read/readline,可以读取文本文件的内容;

  • 文件读写完成后,应该使用 close 方法关闭文件。

例子1:读取当前代码文件。
编写代码,代码如下,文件名为:CSDN.py,这里不再用异常处理。

下面的代码像 whileif 看不懂可以跳过,这些会在下一篇文章介绍(之前忘了写这章的内容了…),所以只要看 open, close, readline 就可以了。

# !/usr/bin/env python3
# _*_ coding: utf-8 _*_ 
# @author:森林
# @time:2023/11/22 13:04

import sys

filename = sys.argv[0]  # 所读取并输出的就是本程序文件CSDN.py
f = open(filename, 'r', encoding='utf-8')  # 打开文件
line_no = 0  # 统计行号
while True:
    line_no += 1  # 行号计数
    line = f.readline()  # 读取行信息
    if line:
        print(line_no, ":", line, end='')  # 输出行号和该行内容
    else:
        break
f.close()  # 关闭打开的文件

输出(在终端 terminal 输入 python CSDN.py):

D:\MyCode\Python_Code\PyCharm>python CSDN.py
1 : # !/usr/bin/env python3
2 : # _*_ coding: utf-8 _*_
3 : # @author:森林
4 : # @time:2023/11/22 13:04
5 :
6 : import sys
7 : 
8 : filename = sys.argv[0]  # 所读取并输出的就是本程序文件CSDN.py
9 : f = open(filename, 'r', encoding='utf-8')  # 打开文件
10 : line_no = 0  # 统计行号
11 : while True:
12 :     line_no += 1  # 行号计数
13 :     line = f.readline()  # 读取行信息
14 :     if line:
15 :         print(line_no, ":", line, end='')  # 输出行号和该行内容
16 :     else:
17 :         break
18 : f.close()  # 关闭打开的文件

要是每次写 .close() 可能你会很烦,或者有时候忘记写了,这就麻烦大了,因此 Python 也提供了另外一种安全打开文件的方式(with 语句——能确保打开的文件自动关闭)!

语法with open(file, mode) as f:

# !/usr/bin/env python3
# _*_ coding: utf-8 _*_ 
# @author:森林
# @time:2023/11/22 13:04

import sys

filename = sys.argv[0]  # 所读取并输出的就是本程序文件CSDN.py
line_no = 0  # 统计行号
with open(filename, 'r', encoding='utf-8') as f:  # 使用with语句实现上下文管理协议
    for line in f:
        line_no += 1  # 行号计数
        print(line_no, ":", line, end='')  # 输出行号和该行内容

输出(在终端 terminal 输入 python CSDN.py):

D:\MyCode\Python_Code\PyCharm>python CSDN.py
1 : # !/usr/bin/env python3
2 : # _*_ coding: utf-8 _*_
3 : # @author:森林
4 : # @time:2023/11/22 13:04
5 :
6 : import sys
7 :
8 : filename = sys.argv[0]  # 所读取并输出的就是本程序文件CSDN.py
9 : line_no = 0  # 统计行号
10 : with open(filename, 'r', encoding='utf-8') as f:  # 使用with语句实现上下文管理协议
11 :     for line in f:
12 :         line_no += 1  # 行号计数
13 :         print(line_no, ":", line, end='')  # 输出行号和该行内容

在 Python 中还有标准输入、输出、错误流、重定向、管道,但是基本上没怎么用过,所以这里就不进行介绍了。


2. 过滤器

2.1 more —— 逐屏显示数据

格式python 程序名字.py 参数1 参数1 ... 参数n | more

D:\MyCode\Python_Code\PyCharm>python CSDN.py | more
1 : # !/usr/bin/env python3
2 : # _*_ coding: utf-8 _*_
3 : # @author:森林
4 : # @time:2023/11/22 13:04
5 :
6 : import sys
7 :
8 : filename = sys.argv[0]  # 所读取并输出的就是本程序文件CSDN.py
9 : line_no = 0  # 统计行号
10 : with open(filename, 'r', encoding='utf-8') as f:  # 使用with语句实现上下文管理协议
11 :     for line in f:
-- More  --

每按一次 enter 都会多显示一行,显示完全部内容就会终止程序!

2.2 sort —— 排序

格式python 程序名字.py 参数1 参数1 ... 参数n | sort

D:\MyCode\Python_Code\PyCharm>python CSDN.py | sort
1 : # !/usr/bin/env python3
10 : with open(filename, 'r', encoding='utf-8') as f:  # 使用with语句实现上下文管理协议
11 :     for line in f:
12 :         line_no += 1  # 行号计数
13 :         print(line_no, ":", line, end='')  # 输出行号和该行内容
2 : # _*_ coding: utf-8 _*_
3 : # @author:森林
4 : # @time:2023/11/22 13:04
5 :
6 : import sys
7 :
8 : filename = sys.argv[0]  # 所读取并输出的就是本程序文件CSDN.py
9 : line_no = 0  # 统计行号

它会按照你输出的内容先进行排序再输出,比如这里是先按照第一位进行排序,所以先输出1开头的行,如果第一位相同,就看第二位,依次类推…

2.3 more 和 sort 一起用

D:\MyCode\Python_Code\PyCharm>python CSDN.py | sort | more
1 : # !/usr/bin/env python3                                                                                                                                                               
10 : with open(filename, 'r', encoding='utf-8') as f:  # 使用with语句实现上下文管理协议
11 :     for line in f:
12 :         line_no += 1  # 行号计数
13 :         print(line_no, ":", line, end='')  # 输出行号和该行内容
2 : # _*_ coding: utf-8 _*_
3 : # @author:森林
4 : # @time:2023/11/22 13:04
5 :
6 : import sys
7 :
-- More  --

文章传送门

上一篇文章:【人生苦短,我学 Python】(7)命令行参数、键盘输入【input】和输出【print】
下一篇文章:【人生苦短,我学 Python】(9)分支判断和循环

文章来源:https://blog.csdn.net/senlin_6688/article/details/135115784
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。