Python零基础入门学习13:文件的读写和使用

:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。

文件的类型

文件是数据的抽象和集合。文件是存储在辅助存储器上的数据序列。

文件是数据存储的一种形式。

文件展现形态:文本文件和二进制文件。

文本文件vs.二进制文件

文本文件和二进制文件只是文件的展示方式。

本质上所有文件都是以二进制形式存储的;形式上所有文件采用两种方式展示。

文本文件是由单一特定编码组成的文件,如UTF-8编码。

文本文件由于存在编码,所以也被看作是存储着的长字符串。在WINDOWS OS中,.txt文件、.py文件都是文本文件。

二进制文件是直接由比特0和1组成、没有统一编码的文件。一般存在二进制0和1的组织结构,即文件格式。比如.jpg文件、.avi文件等。

f.txt文件保存为:"中国是个伟大的国家!"

#文本形式打开文件
tf = open("f.txt", "rt")
print(tf.readline())
tf.close()

<<<中国是个伟大的国家!

#二进制形式打开文件
bf = open("f.txt", "rt")
print(bf.readline())
bf.close()

<<<  #输出一段二进制代码
文件的打开和关闭

文件处理的步骤:打开-操作-关闭。

文件的占用状态和存储状态之间的转换用a = open(,)和a.close()来实现。

文件的读写

3个常用的读文件函数:

a.read(size)

a.readline(size)

a.readlines(hint)

3个常用的写文件函数:

a.write(s)

a.writelines(lines)

a.seek(offset)

文件的打开

<变量名> = open(<文件名>, <打开模式>)。

<文件名>——文件路径和名称,源文件同目录则可省略路径。

<打开模式>——文本或二进制。

<文件名>、相对路径和绝对路径

关于文件路径和名称,如果要使用的文件绝对路径是D:\PYE\f.txt,那么路径和文件名是:

"D:/PYE/f.txt"或"D:\\PYE\\f.txt",两个反斜杠是因为Python默认反斜杠为转义符。

除了绝对路径外,也可以使用相对路径——打开的文件与当前程序之间的路径。

如果当前程序存储在D:根目录下,则"D:/PYE/f.txt"的相对路径就是"./PYE/f.txt";如果打开的文件和程序在同一个目录里,那么就可以直接使用"f.txt"而不需要任何路径。

<打开模式>

Python有以下4种文件打开模式:

'r'——只读模式,默认值。如果文件不存在,则返回FilenNotFoundError错误。

'w'——覆盖写模式。文件不存在则创建;文件存在则完全覆盖。

'x'——创建写模式。文件不存在则创建;文件存在则返回FileExistError错误。

‘a'——追加写模式。文件不存在则创建;文件存在则在文件最后追加内容。

还有2种与打开文件相关的模式:

'b'——二进制文件模式。

't'——文本文件模式,默认值。

最后还有一种打开模式方式:

'+'——与r/w/x/a一同使用,在原功能基础上增加同时读写功能。

打开模式的一些例子:

f = open("f.txt") ——文本形式、只读模式、默认值

f = open("f.txt", "rt") ——文本形式、只读模式、同上默认值

f = open("f.txt", "w") ——文本形式、覆盖写模式

f = open("f.txt", "a+") ——文本形式、追加写模式+读文件

f = open("f.txt", "x") ——文本形式、创建写模式

f = open("f.txt", "b") ——二进制形式、只读模式

f = open("f.txt", "wb") ——二进制形式、覆盖写模式

文件的关闭

文件的关闭只有1种:

<变量名>.close() ——<变量名>文件句柄

文件内容的读取

Python提供了3种读取文件内容的方法。

以"中国是个伟大的国家!"为一个text文件为例来说明。

1).read(size = -1)——读入全部内容;如果给出参数,读入前size长度。

s = f.read(2)   #s的数据类型是字符串,s是f文件里所有行的文本组成的字符串,每一行的结尾有个换行符\n,算作1个字符串。

<<<中国

2).realine(size = -1)——读入一行内容,如果给出参数,读入该行前size长度。

s = f.readline()   #s的数据类型是字符串,s是文本中多行文本的第一行。

<<<中国是个伟大的国家!

3).realines(hint = -1)——读入文件所有行,以每一行为一个元素形成列表。如果给出参数,读入index=hint这个字符为止所有的行。

l = f.readlines()   #l的数据类型是列表。其中每一行(字符串类型)都是l的一个元素。

<<<[中国是个伟大的国家!]

文件的全文本操作

遍历全文本之方法一

fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
txt = fo.read()
#对全文txt进行处理
fo.close()

遍历全文本之方法一的特点是一次读入,统一处理;其劣势是,如果一个文本太大,比如10TB,那么一次读入将会耗费大量的时间和运行资源。
如果遇到上述大文本情况,那么分批分阶段处理是一个有效的办法。

遍历全文本之方法二

fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
txt = fo.read(2)
while txt != "":
    #对txt进行分批处理
    txt = fo.read(2)
fo.close()

遍历全文本之方法二的特点是,按数量读入,逐步处理。这种方法对于处理大文件十分有效。

逐行遍历文件之方法一

fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
for line in fo.readlines():
    print(line)
#每一行都被遍历出来,fo.readlines()形成一个列表,每一行line都属于字符串类型,同时也都是列表fo.readlines()的一个元素
fo.close()

逐行遍历文件之方法一的特点是,每一行都被遍历出来,fo.readlines()形成一个列表,每一行line都是字符串类型,也都是列表fo.readlines()的一个元素。

逐行遍历文件之方法二

fname = input("请输入要打开的文件名称:")
fo = open(fname, "r")
for line in fo:
    print(line)
# 每一行都被遍历出来,逐行进行处理,不会生成列表。line的数据类型是字符串。
fo.close()

逐行遍历文件之方法二的特点是,每一行都被遍历出来,逐行进行处理,但不会生成列表。line的数据类型是字符串。

数据的文件写入

.write(s)——向文件写入一个字符串或字节流。

f.write("中国是一个伟大的国家!")

<<<  # 把"中国是一个伟大的国家!"这个字符串写入到了文件f当中。

.writelines(lines)——将元素lines写入文件。lines可以是字符串,也可以是元素全为字符串的列表,写入以后,字符串之间将会被无缝连接起来。

l = ["中国", "法国", "美国"]
f.writelines(l)

<<<中国法国美国   #6个汉字之间没换行、空格和逗号 

.seek(offset)——改变当前文件操作指针的位置,offset含义如下:

0- 文件开头;1-当前位置;2-文件结尾。

f.seek(0)   #光标回到文件开头

文件写入的一个例子如下:

fo = open("output.txt", "w+")
l = ["中国", "法国", "美国"]
fo.writelines(l)
for line in fo:
    print(line)
fo.close()

<<<     #竟然没有输出任何信息

若是加入一行:

fo = open("output.txt", "w+")
l = ["中国", "法国", "美国"]
fo.writelines(l)
fo.seek(0)
for line in fo:
    print(line)
fo.close()

<<<<中国法国美国

输入有内容了。这是因为,之前输出为空,因为for line in fo使光标从写完的内容后面开始遍历的。fo.seek(0)解决了光标的位置问题,所以能输出内容。

文件读写操作时,一定要随时注意文件操作指针的位置。

文件中的with关键字

每次f.write或f.writelines之后,必须加上f.close()才能再去做其它操作,比如f.read()等读的操作。因为,f.close()相当于游戏里的save操作,把之前的缓冲区的数据写到硬盘上,且,通常采用with语句能保证系统自动关闭打开的流。

为了更简单地使用文件,Python提供了一个关键字:with。

在处理文件对象时,如果使用with关键字,当子句体结束后文件会正确关闭,无需加上f.close()语句,即使在某个时刻引发了异常。

with关键字用法实例如下:

with open('workfile') as f:
    read_data = f.read()

To be continued.

你可能感兴趣的:(Python零基础入门学习13:文件的读写和使用)