面向小白的Python教程:入门篇(八)

本节概要

  • 读写文件
  • 按指定字符分割字符串

程序实例10

在上一节中我们学习了如何利用字典将学生姓名和成绩关联起来。但是这个程序仍然不完善,比如学生信息都是写在代码中的,每次我们修改学生信息的时候都要修改代码十分不方便。而且输出的信息没有保存,随着程序关闭输出信息也丢失了。

在本节中我们将学习读写文件操作,这样我们就可以从一个文件里读取学生信息,然后再把处理后的学生信息保存到一个文件中了。这样不仅方便我们修改输入信息,而且对于输出信息我们可以持久保存。

下面给出一个读取文件的示例代码。在下面的代码中,我们将读取一个名叫test.txt的文本文件,然后把文件内容都读取到内存中,最后通过for循环依次打印每一行的内容。

with open("test.txt", "r") as fin:
    for line in fin.readlines():
        print(line)

with open("test.txt", "r") as fin是一种安全地打开文件的方式。"test.txt"实际上是要读取文件的路径,但是关于文件路径不是三言两语能介绍清楚的(文件路径涉及到相对路径,绝对路径等概念,并且在不同操作系统上表示的方式还略有差别)。

在入门篇中为了突出重点淡化次要点,我们就先避开文件路径这个概念。这里只要把"test.txt"文件和你的程序文件放在同一个目录下,我们就可以通过文件名"test.txt"直接打开文件了。在open()中的参数"r"代表read,意思是说打开这个文件是要读这个文件中的内容。

fin.readlines()我们可以理解为一个列表,这个列表是由test.txt文件中一行一样内容组成的。假设test.txt文件中写了4行内容:

锄禾日当午,

汗滴禾下土。

谁之盘中餐,

粒粒皆辛苦。

那么fin.readlines()我们可以把它当成列表["锄禾日当如,", "汗滴禾下土。", "谁之盘中餐,", "粒粒皆辛苦。"]。在这里我们介绍了另一种for循环遍历列表的方式,因此我们现在有两种方式来遍历列表了。

names = ["张三", "李四", "王五"]
# 方法1
for i in range(len(names)):
    print(names[i])

# 方法2
for name in names:
    print(name)

接下来我们介绍写文件操作。把open("test.txt", "r")中的"r"改为"w"就是以写的方式打开文件了,然后通过write()就可以写入内容。示例程序如下:

with open("students_info.txt", "w") as fout:
    fout.write("张三 97分 优秀\n")

按照上面的方式会向students_info.txt文件中写入一行内容“张三 97分 优秀”,\n表示换行符。在linux和windows环境中换行符是不一样的,但是不用担心,采用上面的写法python会根据系统自动更改\n为系统换行符,所以这里写\n就好。

至此,我们已经学会了读写文件操作。让我们回到学生成绩录入程序中。假设我们在输入文件中每行写一名学生的姓名和成绩,姓名和成绩用一个空格符隔开,如下所示:

张三 97
李四 70
王五 85

我们可以通过把每行内容按照空格分割,然后解析出学生姓名和成绩。利用split()方法可以把一个字符串按指定符号分割,分割后的结果以列表返回。示例如下:

>>> line = "abc def xyz"
>>> line.split(" ") # 也可写作line.split(),无参数的时候按照空白符分割,空格符包括空格符,制表符,换行符等
>>> ["abc", "def", "xyz"]

现在我们给出完整的程序代码。我们从文件input_data.txt读取每位学生的姓名和成绩,每行一位学生的姓名和成绩,姓名和成绩用空格符分开。然后我们根据学生的成绩转化为等级。最后把学生姓名,成绩,等级再写入到students_info.txt文件中。

with open("input_data.txt", "r") as fin, open("students_info.txt", "w") as fout:
    for line in fin.readlines():
        infos = line.strip().split() # strip()的作用是去除字符串首尾的空白符,因为读入的每行内容结尾包含换行符,因此需要去除
        name = infos[0]
        score = infos[1]
        # 上面三行代码可以简写为一行: name, score = line.strip().split()
        score = int(score)
        if score >= 60:
            level = "及格"
        else:
            level = "不及格"
        fout.write("{0} {1} {2}\n".format(name, score, level))

input_data.txt文件中的内容如下:

张三 97
李四 50
王五 68

把input_data.txt文件和程序文件放在同一目录下,然后运行上面的程序。程序会生成students_info.txt文件,students_info.txt文件中会保存如下内容:

张三 97 及格
李四 50 不及格
王五 68 及格

注意:运行如果输出结果出现乱码,可以把open("input_data.txt", "r")改为open("input_data.txt", "r", encoding="utf8")。出现乱码的原因是输入文件的编码可能不是utf8造成的,关于编码问题在入门篇中暂不介绍。

本节总结

本节主要介绍的内容包括:

  • 读写文件的方式,通过with open()安全打开文件,通过"r"或者"w"参数控制读或写文件。
  • 读取文件时,可以通过split()函数按照指定符号分割字符串,strip()方法可以剔除字符串首尾的空白符。

在本节中我们学习了如何读写文件以及如何按照指定符号分割字符串。学会了本节的内容之后,我们就可以把数据和程序分开了。输入的信息单独保存在一个文件中,程序处理后的信息保存在另一个文件中。下一节我们将学习如何定义函数。我们下一节再见吧。

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