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)<f>.read(size = -1)——读入全部内容;如果给出参数,读入前size长度。

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

<<<中国

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

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

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

3)<f>.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的数据类型是字符串。

数据的文件写入

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

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

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

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

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

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

<f>.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.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容