注:本实验来源于 实验楼:python3简明教程 作者: FrostSigh
本节实验在实验楼linux环境下操作后,找了一个windows下的操作方案(《python编程:从入门到实践》)。
索引:
项目 | Value |
1.文件打开与关闭 | open()与with open() |
2.文件读取 | read();readline();readlines() |
3.文件写入 | write()方法及 open()参数 |
4.几个例子 | 拷贝文件:enumerate()方法 |
* | 文本文件相关信息统计:count()方法 |
5.大文件读取 | 一个例子:注意事项 |
6.挑战 | 检取一个文件中的数字 |
1.文件打开与关闭
我们使用open函数打开文件。它需要两个参数,第一个参数是文件名或文件路径;第二个是文件的打开模式。
- ‘r’:默认模式,以只读打开。
- ’w’:写入模式,如果文件存在将会删除里面所有内容,然后重新写入;如果不存在就新创建。
- ‘a’:追加模式:写入到文件中的内容自动添加到末尾。
注:用open打开文件时,一定要在使用完之后关闭文件。
推荐用with open;这样python会自动帮我们关闭文件。
2.文件读取
有三种方法可以读取文件内容:
- read()
一次性读取整个文件,如果再次调用,会返回空字符串(因为它已经读取完了整个文件)。 - 以后都会用with open来打开文件。
read()方法到达文件末尾时会返回一个空字符串,这个空字符串显示出来就是一个空行;可用print中的rstrip()删除。 - readline()
每次读取文件的一行。 - readlines()
将读取所有行到一个列表中。
使用关键字with时,open返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with内将文件的各行存储为一个列表。 - 使用文件内容 :将文件内容读取到内存后就可以使用它了。
filename = 'pi_digits.txt'
with open(filename) as fobj:
lines = fobj.readlines()
pi_string = ''
for line in lines:
pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))
3.文件写入
写入空文件:为open()提供另一个实参’w’;将模式改为写入。我们将一条信息存储到文件中:
- write()方法
filename = 'sample.txt'
with open(filename, 'w') as fobj:
fobj.write("I love python! and I am comming!")
程序执行后,就在此文件夹内创建了这一个txt文件。
- 附加到文件
如果要给文件添加内容,而不是覆盖原有内容,可以附加模式 打开文件,将写入的文件添加到文件的末尾。
filename = 'sample.txt'
with open(filename, 'a') as fobj:
fobj.write("\nI also love C language.\n")
fobj.write("Becasue the test will use.\n")
4.几个例子
- 拷贝文件
拷贝给定的文件到另一个给定的文本文件。
f_ile = 'sample.txt'
Copy_file = 'Copy_sample.txt'
with open(f_ile) as fobj:
lines = fobj.readlines()
with open(Copy_file, 'w') as cfobj:
for line in lines:
cfobj.write(line)
查看文件,写入成功。
一个函数: enumerate(iterableobject)
在序列中循环时,索引位置和对应值可以使用它同时得到。
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
- 文本文件相关信息统计
编写一个文件,对任意给定文本文件中的指表符、行、空格进行计数。
import os
def parse_file(path):
"""
分析指定文本文件;返回其空格、制表符、行 的数目
:arg path:文件的路径
:return:包含空格数、制表符数、行数的元组
"""
with open(path) as fobj:
#分别是存储行数、制表符数、空格数的变量
i = 0
spaces = 0
tabs = 0
for i, line in enumerate(fobj):
#字符串内建函数count(str, beg= 0,end=len(string))
#返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定
#则返回指定范围内 str 出现的次数
spaces += line.count(' ')
tabs += line.count('\t')
return spaces, tabs, i+1
def main(path):
"""
主函数用于打开文件分析结果
:argv path:文件的路径
:return:若文件存在则为True, 否则False
"""
if os.path.exists(path):
spaces, tabs, lines = parse_file(path)
print("space {}. tabs {}. lines {}".format(spaces, tabs, lines))
return True
else:
return False
if __name__ == '__main__':
path = 'Copy_sample.txt'
main(path)
:程序有两个函数,main()和parse_file(),parse_file()函数真正分析文件并返回结果,然后在main()函数里打印结果。通过分割代码到一些更小的单元(函数)里,能帮助我们组织代码库且也更容易为函数编写测试用例。
5.大文件读取
有些文件会过大,不能用read()方法一次性读取,会造成错误;
需要一行一行的读~!
例:读取linux的cpu信息
filepath = 'proc/cpuinfo'
with open(filepath) as fobj:
lines = fobj.readlines()
for line in lines:
print(lines.rstrip())
6.挑战
实现一个程序用来提取文件中的字符串中的数字,然后打印输出。
filepath = "sample.txt"
with open(filepath) as fobj:
lines = fobj.readlines()
digits = ""
for line in lines:
for char in line:
if char.isdigit():
digits += char
print(digits)
sample.txt:
结果: