(Python第六天)文件处理

一、文件操作

通常我们把文件分为两类,文本文件和二进制文件。

1)文件打开

使用open()函数打开文件,需要两个参数,第一个参数是文件路径或者文件名,第二个是文件的打开模式

'r' 以只读模式打开,只读取文件不可编辑删除文件的任何内容

'w' 以写入模式打开,文件存在将会删除里面的所有内容,然后打开这个文件进行写入

'a' 以追加模式打开,写入到文件中的任何数据将自动添加到末尾

默认模式为只读模式

打开一个文件,实例:在windows下打开一个文件,必须使用绝对路径,如:

>>>fobj = open ("G:\PythonStudy\sample.txt")
>>> fobj  

2)文件关闭

只要打开一个文件,就必须关闭一个文件,则使用方法close()完成这个操作

>>>fobj.close()  

始终确保你显式关闭每个打开的文件,一旦工作完成没有任何理由保持打开文件,因为程序能打开的文件数量是有上限的,如果超过这个限制,没有任何可靠的方法回复,所以程序可能会崩溃。

3)文件读取

使用read()一次性读取整个文件

read(size)有一个可选的参数size,用于指定字符串长度,如果没有指定size或者指定为负数,都会读取并返回整个文件,如果文件大小为当前机器内存的两倍时,就会产生问题

readlines()方法可以读取所有行到一个列表中,而readline()每次读取文件的一行,实例:循环遍历文件对象来读取文件中的每一行

>>>fobj = open('sample.txt')
>>> for x in fobj:
             print(x,end = ' ')

实验:接受用户输入的字符串作为将要读取的文件的文件名,并在屏幕上打印文件内容

1 name = input("Enter the file name:")
2 fobj = open (name)
3 print(fobj.read())
4 fobj.close()

4)文件写入

通过write()打开一个文件然后我们随便写入一些文本

二、文件操作实例程序

1)拷贝文件

拷贝给定的文本文件到另一个给定的文本文件

ps:模块sys.模块sys.argv包含所有命令行参数,获取程序外部向程序传递的参数,传递给Python脚本的命令行参数列表,argv[0]是脚本名称,如果使用-c解释器的命令行选项执行命令,argv[0]则将其设置为字符串‘-c’,如果没有脚本名称传递给Pyhton解释器,argv[0]为空字符串。

sys.exit({arg})程序中间的退出,当arg=0为正常退出,其他数值(1-127)为不正常,可抛异常事件供捕获。

关于sys详细参数功能,参考:https://blog.csdn.net/qq_38526635/article/details/81739321

这个程序的功能完全可以使用shell的cp命令替代,在cp后首先输入被拷贝的文件的文件名,然后输入新文件名

提供sys模块功能,先判断命令行是否有两个文件,argv[0]代表着这个命令本身的名字,argv[1]是准备复制的文本文件的名字,argv[2]是复制过新的文本文件的名字,如果少于,则不正常退出命令行,反之,进行打开第一个文件,读出里面的内容给s,然后以w的方式打开一个新的文本文件,把s的内容输入到新的文本文件中去。

2)文本文件相关信息统计

对任意给定文本文件中的制表符、行、空格进行计数

ps:

1) enumerate(iterableobject),在序列中循环时,索引位置和对应值可以使用它同时得到,组合为一个索引序列,同时列出数据和下标,语法是enumerate(sequence,[start=0])

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

2) count()方法,查看某对象中所包含相同元素的数量,使用Python列表内置的count()方法可以统计某个元素在列表中出现的次数。

比如,在列表列表['a','iplaypython.com','c','b‘,'a'],想统计字符串'a'在列表中出现的次数,可以

>>> ['a','iplaypython.com','c','b','a'].count('a')
2  

其返回值就是要统计参数出现的次数,在应用的时候就是把列表赋给一个变量,之后再用count()方法操作,

3)OS模块就是对操作系统进行操作,使用该模块必须先导入模块

getcwd()就是获得当前工作目录,默认为当前文件所在的文件夹

chdir()改变当前工作目录

还有一些在os.path子模块中的内容:

exists()检测某个路径是否真实存在,如:

filepath = '/home/...'
result = os.path.exists(filepath)
print(result) 

给任意的给定文本文件进行计数,代码为:

 1 import os
 2 import sys
 3 
 4 
 5 def parse_file(path):
 6     """
 7     分析给定文本文件,返回其空格、制表符、行的相关信息
 8 
 9     :arg path: 要分析的文本文件的路径
10 
11     :return: 包含空格数、制表符数、行数的元组
12     """
13     fd = open(path)
14     i = 0
15     spaces = 0
16     tabs = 0
17     for i,line in enumerate(fd):
18         spaces += line.count(' ')
19         tabs += line.count('\t')
20     # 现在关闭打开的文件
21     fd.close()
22 
23     # 以元组形式返回结果
24     return spaces, tabs, i + 1
25 
26 def main(path):
27     """
28     函数用于打印文件分析结果
29 
30     :arg path: 要分析的文本文件的路径
31     :return: 若文件存在则为 True,否则 False
32     """
33     if os.path.exists(path):
34         spaces, tabs, lines = parse_file(path)
35         print("Spaces {}. tabs {}. lines {}".format(spaces, tabs, lines))
36         return True
37     else:
38         return False
39 
40 
41 if __name__ == '__main__':
42     if len(sys.argv) > 1:
43         main(sys.argv[1])
44     else:
45         sys.exit(-1)
46     sys.exit(0)

即:先判断是否是直接运行,还是导入,再判断运行的命令是否正确,用过main自定义函数来处理命令中的文本文件,否则返回错误退出。main()函数就是判断这个路径是否存在,存在则通过parse_file函数处理,打印出空格,制表符和行数。parse_file函数就是打开这个文本文件,通过enumrate方法统计出这个文本文件的这几个符号的次数、

三、使用with语句

通过with语句处理文件对象,它会在文件用完后自动关闭,就算发生异常也没有关系。

 

四、实现lscpu

在Linux下使用lscpu命令来查看cpu当前信息,实际上是通过lscpu命令读取/proc/cpuinfo这个文件的信息并美化输出,

 

试验:在Windows下读取一个文件‘c:\\test.txt’,统计出该文件中出现的字符'a'的次数

 1 import os
 2 
 3 b=0
 4 
 5 def get_number_of_char(filePath, c):
 6     global b
 7     if os.path.exists(filePath):
 8         with open(filePath) as fp:
 9             for line in fp:
10                 n = line.count(c)     #就是一行一行的统计出每一行的字符a的次数赋值给b,让b成为全局变量,在main方法中打印出b
11                 b+=n
12     else:
13         print('the path:[{}] is not exist!'.format(filePath))
14 
15 def main():
16     file_path = 'G:\\PythonStudy\\sample.txt'
17     get_number_of_char(file_path, 'a')
18     print(b)
19     
20 if __name__ == '__main__':
21     main()

 

 

 

 

 

  

 

posted @ 2019-01-19 23:12  ywangji  阅读(287)  评论(0编辑  收藏  举报