文件及非常

1. 文件操作

1.1 从文本被读取数据

  许多情景下,我们的音讯是储存在文件中的。例如对用户作为之辨析,用户访问系统或网站的访问信息会为积存于文本中,然后针对文件内容进行分析,分析用户作为,找来里面起价的消息。

  要是用文件文件中信息,首先得拿消息读取到内存中。因此,我们可以因文件大小,选择读取文件的措施。该法发出三三两两种植状况,一种是一次性读取文件之全部内容;一栽是逐行读取,即同差读一行。

 

1.1.1 读博全方位文件

  要读取整个文件,需要一个蕴含几实施内容之文书文件。

  例如,我们创建一个文件,并以一律首古老诗文词存于中,然后读取整个文件内容。文本文件被的情节如下所示:

        念奴娇·赤壁怀古
        宋代:苏轼

大江东去,浪淘尽,千古风流人物。
故垒西边,人道是,三国周郎赤壁。
乱石穿空,惊涛拍岸,卷起千堆雪。
江山如画,一时多少豪杰。
遥想公瑾当年,小乔初嫁了,雄姿英发。
羽扇纶巾,谈笑间,樯橹灰飞烟灭。
故国神游,多情应笑我,早生华发。
人生如梦,一尊还酹江月。

 

  代码:

1 file = open("test_file1",'r',encoding="utf-8")
2 print(file.read())
3 file.close()

  说明:

  第1行,“test_file1.txt” 是需要开拓的文件名称;‘r’
是以朗诵之办法打开文件;encoding
指定用什么字符集打开,open()函数是为此来开辟文件的声明。

  第2履行,使用成套文件读取的法read()读了所有文件内容。

  第3实践,使用close()方法关闭文件。

  运行结果:

 1         念奴娇·赤壁怀古
 2         宋代:苏轼
 3 
 4 大江东去,浪淘尽,千古风流人物。
 5 故垒西边,人道是,三国周郎赤壁。
 6 乱石穿空,惊涛拍岸,卷起千堆雪。
 7 江山如画,一时多少豪杰。
 8 遥想公瑾当年,小乔初嫁了,雄姿英发。
 9 羽扇纶巾,谈笑间,樯橹灰飞烟灭。
10 故国神游,多情应笑我,早生华发。
11 人生如梦,一尊还酹江月。

 

  虽然以上办法吧兑现了咱的求,但是下open()和close()来开辟和关文件时,如果程序存在bug,则会招close()方法无履行,文件拿无见面给关。这看似鸡毛蒜皮,但也稳妥的倒闭文件,可能会见招致数据丢失或受损。如果当次中过早的以close()方法关闭文件,那么以需要经常以无法访问,这为会见招致更多之荒谬。因此,以上代码可以使用外一样种植实现方式。

  代码:

1 with open("test_file1",'r',encoding="utf-8") as file_object:
2     print(file_object.read())

  说明:

  第1推行,关键字with会在不再要拜访文件后以那个关闭,因此,在全方位代码中还并未出现close()方法的调用。

    

  运行结果:

 1         念奴娇·赤壁怀古
 2         宋代:苏轼
 3 
 4 大江东去,浪淘尽,千古风流人物。
 5 故垒西边,人道是,三国周郎赤壁。
 6 乱石穿空,惊涛拍岸,卷起千堆雪。
 7 江山如画,一时多少豪杰。
 8 遥想公瑾当年,小乔初嫁了,雄姿英发。
 9 羽扇纶巾,谈笑间,樯橹灰飞烟灭。
10 故国神游,多情应笑我,早生华发。
11 人生如梦,一尊还酹江月。

  以上运行结果及之前的落实方式示的结果完全一致,但是建议下第二种办法读取文件。因为第二栽艺术,我们尽管打开文件,并以急需的当儿下它,Python自会在合适的时光自动关闭打开的文本。

 

1.1.2 文件路劲

  在Python中,当我们拿项目 .txt
的略的公文称传递让函数open()时,Python会先行到眼前推行之次所当的目录中寻觅该文件。但有时候我们为了方便管理文件,会以文件存于单独的目下。

  文件路劲有个别栽:一种植是绝对路劲;一种植是相对路劲。如果我们用开拓的公文所在的公文夹和履行顺序在同目录下,那么得应用相对路劲即可;如果我们用打开的文本所在的公文夹在执行顺序目录外的地方,那么只能利用绝对化路劲。

  在Windows中,文件路劲用之是倒斜杠(\),而在Linux、Unix、OS
X等等其他系统中,文件的路劲用之凡斜杠(/)。

  因为在Python中,反斜杠(\)被视为转义标记,所以,在Windows中以保证万无一失,应该当文件的路劲的引号前加上r。

  例如,分别以相对路径和绝对路劲的措施打开相应路径下的文本。

  代码1:

1 with open(r"text_files\test_file",'r',encoding="utf-8") as file_object:
2     print(file_object.read())

  运行结果:

 1           将进酒
 2          作者:李白
 3 
 4 君不见,黄河之水天上来,奔流到海不复回。
 5 君不见,高堂明镜悲白发,朝如青丝暮成雪。
 6 人生得意须尽欢,莫使金樽空对月。
 7 天生我材必有用,千金散尽还复来。
 8 烹羊宰牛且为乐,会须一饮三百杯。
 9 岑夫子,丹丘生,将进酒,杯莫停。
10 与君歌一曲,请君为我倾耳听。
11 钟鼓馔玉不足贵,但愿长醉不复醒。
12 古来圣贤皆寂寞,惟有饮者留其名。
13 陈王昔时宴平乐,斗酒十千恣欢谑。
14 主人何为言少钱,径须沽取对君酌。
15 五花马,千金裘,呼儿将出换美酒,
16 与尔同销万古愁。

 

  代码:

1 with open(r"F:\PyProject\s14\text_files\test_file",'r',encoding="utf-8") as file_object:
2     print(file_object.read())

 

  运行结果:

 1 满江红·怒发冲冠
 2 年代: 宋 作者: 岳飞
 3 
 4 怒发冲冠,凭栏处潇潇雨歇。
 5 抬望眼,仰天长啸,壮怀激烈。
 6 三十功名尘与土,
 7 八千里路云和月。
 8 莫等闲白了少年头,空悲切。
 9 
10 靖康耻,犹未雪;
11 臣子恨,何时灭!
12 驾长车踏破贺兰山缺。
13 壮志饥餐胡虏肉,
14 笑谈渴饮匈奴血。
15 待从头收拾旧山河,朝天阙。

 

1.1.3  逐行读取文件

  以Python中,有时我们需要检讨文件被是不是带有我们关注之音讯,或者需要修改的消息,此时,可采取for循环来逐行读取文件。

  例如,将一如既往篇存于文本文件被,然后逐行读取,并打印。

  文本内容如下所示:

   当你老了
  叶芝(爱尔兰)

当你老了,头白了,睡思昏沉,
炉火旁打盹,请取下这部诗歌,
慢慢读,回想你过去眼神的柔和,
回想它们昔日浓重的阴影;
多少人爱你青春欢畅的时辰,
爱慕你的美丽,假意或者真心,
只有一个人爱你那朝圣者的灵魂,
爱你衰老了的脸上痛苦的皱纹;
垂下头来,在红光闪耀的炉子旁,
凄然地轻轻诉说那爱情的消逝,
在头顶的山上它缓缓踱着步子,
在一群星星中间隐藏着脸庞。


代码:

1 with open(r"text_files\test_file1",'r',encoding="utf-8") as  file_object:
2     for line in file_object:
3         print(line)

  说明:

  第2执,用for循环遍历整个文件,逐行读取文件的情。

  

运作结果:

 1    当你老了
 2 
 3   叶芝(爱尔兰)
 4 
 5 
 6 
 7 当你老了,头白了,睡思昏沉,
 8 
 9 炉火旁打盹,请取下这部诗歌,
10 
11 慢慢读,回想你过去眼神的柔和,
12 
13 回想它们昔日浓重的阴影;
14 
15 多少人爱你青春欢畅的时辰,
16 
17 爱慕你的美丽,假意或者真心,
18 
19 只有一个人爱你那朝圣者的灵魂,
20 
21 爱你衰老了的脸上痛苦的皱纹;
22 
23 垂下头来,在红光闪耀的炉子旁,
24 
25 凄然地轻轻诉说那爱情的消逝,
26 
27 在头顶的山上它缓缓踱着步子,
28 
29 在一群星星中间隐藏着脸庞。

  从上述之周转结果能够,每行打印后还见面追加一个拖欠白行,故与原来文格式不完全一致。这是为当这文件中,每行的末段都起一个扣不显现底换行符,而print语句也会助长一个换行符,因此,每行末尾都出星星点点独转移行符:一个出自文件本身,另一个起源print语句。

  那么怎么才能够而打印的始末和原文保持一致呢?我们得以运用rstrip()函数消除多余的空。

  代码:

1 with open(r"text_files\test_file1",'r',encoding="utf-8") as  file_object:
2     for line in file_object:
3         print(line.rstrip())

  说明:

  第2尽,使用函数rstrip()来祛除多余的空白行。

 

  运行结果:

 1    当你老了
 2   叶芝(爱尔兰)
 3 
 4 当你老了,头白了,睡思昏沉,
 5 炉火旁打盹,请取下这部诗歌,
 6 慢慢读,回想你过去眼神的柔和,
 7 回想它们昔日浓重的阴影;
 8 多少人爱你青春欢畅的时辰,
 9 爱慕你的美丽,假意或者真心,
10 只有一个人爱你那朝圣者的灵魂,
11 爱你衰老了的脸上痛苦的皱纹;
12 垂下头来,在红光闪耀的炉子旁,
13 凄然地轻轻诉说那爱情的消逝,
14 在头顶的山上它缓缓踱着步子,
15 在一群星星中间隐藏着脸庞。

  从上述之运行结果会,打印的情及文件中之完全一致。

 

1.1.4 将文件内容存入一个列表

  在Python中,使用要字with时,函数open()返回的文本对象就当with代码块内得以用。如果如于拜访文件之情,可当with代码块内将文件的各行存储于一个列表中,并当with代码块外使用列表。

  例如,我们用一个文件的情读取后存入一个列表。

  代码:

1 with open(r"text_files\test_file2","r",encoding="utf-8") as file_object:
2     lines = file_object.readlines()
3 for line in lines:
4     print(line.rstrip())

  说明:

  第1履,用要字with
即函数open(),以朗诵之点子因此utf-8打开文件test_file2.txt。

  第2推行,使用readlines()方法从文本中读取每一样实施内容,并拿该储存在一个列表中,并赋值给变量lines。

  第3行,开始用for循环遍历列表。

  第4推行,打印列表内容,并据此函数rstrip()去丢多余的空格。

 

  运行结果 :

 1 世界上最遥远的距离——[印度]泰戈尔
 2 
 3 世界上最遥远的距离 不是生与死
 4 而是我就站在你面前你却不知道我爱你
 5 
 6 世界上最遥远的距离
 7 不是我就站在你面前你却不知道我爱你
 8 而是明明知道彼此相爱却不能在一起
 9 
10 世界上最遥远的距离
11 不是明明知道彼此相爱却不能在一起
12 而是明明无法抵挡这股想念却还是故意装作丝毫没有把你放在心里
13 
14 世界上最遥远的距离
15 不是明明无法抵挡这股想念却还是故意装作丝毫没有把你放在心里
16 而是用自己冷漠的心对爱你的人掘了一条无法跨越的沟渠

  从以上的运作结果会,由于列表lines的各一个因素还针对应于文件中之同行,因此打印出的情和公事被完全一致。6

 

1.1.5 使用文件被内容

  当我们用文件读到内存后,就可坐任何方法使用这些数量了。

  例如,将文件被的平首诗歌读博到外存中,然后使用它,答应所有内容,并恳求其长度。文件内容如下:

《相思》
(唐代:王维)

红豆生南国,春来发几枝。
愿君多采撷,此物最相思。

  代码:

1 with open(r"text_files\test_file3","r",encoding="utf-8") as file_object:
2     lines = file_object.readlines()
3 file_string = ''
4 for line in lines:
5     file_string += line.strip()
6 print(file_string)
7 print(len(file_string))

  说明:

  第3执行,我们创建了一个变量,初始化为空。

  第4~5实践,用for循环将每行都加入变量file_string,并去每行末尾的换行符。

  第6执,打印该字符串file_string 。

  第7行,用函数len()求来字符串的尺寸,并打印出。

 

  运行结果:

1 《相思》(唐代:王维)红豆生南国,春来发几枝。愿君多采撷,此物最相思。
2 35

 

1.2 写副文件

  保存数据的极致简单易行的章程有就是是谈那个写副到文件中。通过以出口的情写副文件,即便关闭程序输出的巅峰窗口,这些输出的内容吗照样在。这样,我们还是还足以动用输出的情。

  于Python中,打开文件时,我们可指定以下几种植模式:

  (1)r:读取模式。只能读取打开的文件内容。

  (2)w:写副模式。只能望打开的公文写内容,并且会清空文件中之情节,然后重新写副。

  (3)a:附加模式。在原文后长内容,不会见删除原有文件之情节。

  (4)r+:读写模式。对打开的文书既而读博,又只是写副。

 

1.2.1 写入空文件

  当我们怀念使拿文件写副文件中时时,我们得在调用方法open()时被那个提供任何一个实参,告诉Python我们而描绘副打开的文本。

  例如,我们创建一个空文件,然后为里面写副一些情。

  代码:

1 filename = r"text_files\test_file4"
2 with open(filename,'w',encoding="utf-8") as file_object:
3     file_object.write("东边日出西边雨,道是无晴却有晴。")

  说明:

  第2履,调用open()方法供了三独实参,第一独实参是如果开拓的公文之名目;第二单实参是(‘w’)告诉Python解释器,要以写副模式打开这文件;第三独实参告诉Python解释器,使用字符集utf-8。

  第3实施,调用方法write()将“东边日出西边雨,道是不管晴也生晴朗。”写副文件中。

  以上代码没有终点输出,但是要我们打开文件test_file4.txt时,将会晤看到其中有我们描绘副的诗文:东边日出西边雨,道是随便晴也生晴朗。

 

  执行代码后,文件内容如下所示:

东边日出西边雨,道是无晴却有晴。

 

1.2.2  写副多执内容

  当自己以办法write()往文件中描绘副内容经常,写副的文本的尾声不会见活动添加换行符,因此,如果我们要朝向文件中描绘副多实践内容经常,需要在write()语句被自行写及换行符。

  例如,往文件test_file5.txt中描写副一首诗歌。

  代码:

1 filename = r"text_files\test_file5"
2 with open(filename,'w',encoding="utf-8") as file_object:
3     file_object.write("\t\t宿严陵钓台\n")
4     file_object.write("\t作者:神颖 朝代:唐代\n")
5     file_object.write("寒谷荒台七里洲,")
6     file_object.write("贤人永逐水东流。\n")
7     file_object.write("独猿叫断青天月,")
8     file_object.write("千古冥冥潭树秋。\n")

  

  执行完毕以上代码后,会自动生成一个文件test_file5.txt,其中写入的具体内容如下所示:

        宿严陵钓台
    作者:神颖 朝代:唐代
寒谷荒台七里洲,贤人永逐水东流。
独猿叫断青天月,千古冥冥潭树秋。

  从写副文件之始末会,调用write()方法向文件被描写内容经常,如果非加换行符,写副的情会挤在联名。除了用换行符,还可以使用空格、制表符及空行等来设置输出的格式。

 

1.2.3  追加文件内容

  于Python中,如果我们纪念要朝向文件被加进内容,但非覆盖文件中已有些内容常常,那么可以附加模式(a)打开文件。**


  例如,在test_file4.txt文件被多内容:金风玉露一相逢,便大也人间无数。

  代码:

1 filename = r"text_files\test_file4"
2 with open(filename,'a',encoding="utf-8") as file_object:
3     file_object.write("\n-----追加以下诗句--------------")
4     file_object.write("\n金风玉露一相逢,便胜却人间无数。")

  说明:

  第2履行,我们开拓文件时,指定了的参’a’,以便将内容多至文件中,而不是覆盖文件原内容。

  第3~4执,我们写副了有限尽内容,他们拿于多至文件test_file4.txt的末尾。

  执行后文件内容如下所示:

东边日出西边雨,道是无晴却有晴。

-----追加以下诗句--------------
金风玉露一相逢,便胜却人间无数。

 

1.2.4  文件内容之修改

   以Python中,如果我们怀念修改文件被之某一样情节,可以应用函数replace()替换需要修改的公文内容。

  例如,我们创建一个文书test_file6.txt,然后拿文件被之”莫愁前路无亲密,天下谁人不识君。”修改为:”海内存知已,天涯若比邻。”
然后用修改后的情写副文件test_file6_new.txt。修改前文件的内容如下:

东风不与周郎便,铜雀春深销二乔。
莫愁前路无知己,天下谁人不识君。

  代码:

 1 filename = r"text_files\test_file6"
 2 filename_new = r"text_files\test_file6_new"
 3 find_str = "莫愁前路无知己,天下谁人不识君。"
 4 replcae_str = "海内存知已,天涯若比邻。"
 5 with open(filename,'r',encoding="utf-8") as file_object:
 6    with open(filename_new, 'w', encoding="utf-8") as file_object_new:
 7        for line in file_object:
 8            if find_str in line:
 9                line = line.replace(find_str,replcae_str)
10            file_object_new.write(line)

 

  代码运行后底新文件内容如下所示:

东风不与周郎便,铜雀春深销二乔。
海内存知已,天涯若比邻。

 

3.  异常

  在有编程语言中,对好的处理好关键。Python程序执行期间发生摩擦时,会通过一样种植非常目标来管理程序,这种奇特的目标就是深受称作大。每当有受Python不知所措的一无是处时,它还见面创一个死对象。如果我们编辑了拍卖该生的代码,那么程序将会晤持续运行;反之,程序用适可而止运作,并出示一个traceback,其中含关于好的语。

  在Python中,异常是动try-except代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生特别时许什么处理。使用了try-except代码块时,即便出现异常,程序吗将继承运行:显示我们编辑的亲善的荒唐信息,而不是驱动用户迷惑的traceback。

 

3.1 处理ZeroDivisionError异常

  我们且懂,算术运算被,除数不能够为0。当我们就此一个数字除以0时,往往会提示除数不可知为0。

  例如,用10除以0。

  代码:

1 y = 10
2 x = 0
3 z = y / x
4 print(z)

 

  运行结果:

1 Traceback (most recent call last):
2   File "F:/PyProject/s14/day3/test_except.py", line 5, in <module>
3     z = y / x
4 ZeroDivisionError: division by zero

  从上述运行结果会,在traceback中,第4执指出的荒谬ZeroDivisionError是一个死对象。Python无法按照我们的渴求处理常,就会见创这种对象。在这种情景下,Python将已运转程序,并指出引发了哪种怪,而我们而因这些信对先后开展修改。

 

3.2  try-except代码块的应用

  以Python中,当我们觉得可能会见产生错误时,可编制一个try-except替代码块来处理或引发的非常。

  例如,用try-except处理1.3.1 中之代码有的特别。

  代码:

1 try:
2     y = 10
3     x = 0
4     z = y / x
5     print(z)
6 except ZeroDivisionError:
7     print("You can't divide by zero!")

  说明:

  当我们拿错误的代码print(z)放到了一个try代码中,如果try代码中的代码运行没有问题,则Python将超过except代码块;反之,则执行except中的代码块。

  运行结果:

1 You can't divide by zero!

  从上述之运行结果能够,try中的代码引发了ZeroDivisionError异常,因此Python指出了拖欠怎么缓解问题的except代码块,并运行中的代码。

 

3.3  使用特别的补益

  使用好处理,避免程序出现崩溃现象。当次来错误时,如果程序还有代码没运行了,如何妥善处理错误就是根本。

  例如,编写一个主次,让用户根据提示输入两独数,然后求商。

  代码:

1 while True:
2     first_number = input("请任意输入第一个数字:")
3     if first_number == "q":
4         break
5     second_number = input("请任意输入第二个数字:")
6     if second_number == "q":
7         break
8     answer = int(first_number) / int(second_number)
9     print("第一个数字除以第二数字等于:",answer)

 

  运行结果:

1 请任意输入第一个数字:8
2 请任意输入第二个数字:9
3 第一个数字除以第二数字等于: 0.8888888888888888
4 请任意输入第一个数字:10
5 请任意输入第二个数字:0
6 Traceback (most recent call last):
7   File "F:/PyProject/s14/day3/test_except.py", line 10, in <module>
8     answer = int(first_number) / int(second_number)
9 ZeroDivisionError: division by zero

  从以上的运作结果可知,当我们输入的老二个数为0时,程序即使完蛋,无法持续运行。为这,我们引入了else
代码块。

       例如,使用try-except代码块和else代码块拍卖非常。

  代码:

 1 while True:
 2     first_number = input("请任意输入第一个数字:")
 3     if first_number == "q":
 4         break
 5     second_number = input("请任意输入第二个数字:")
 6     if second_number == "q":
 7         break
 8     try:
 9         answer = int(first_number) / int(second_number)
10     except ZeroDivisionError:
11         print("除数不能为0,请重新输入!")
12     else:
13         print("第一个数字除以第二数字等于:",answer)

 

  运行结果:

1 请任意输入第一个数字:18
2 请任意输入第二个数字:7
3 第一个数字除以第二数字等于: 2.5714285714285716
4 请任意输入第一个数字:23
5 请任意输入第二个数字:0
6 除数不能为0,请重新输入!
7 请任意输入第一个数字:q

  从上述运行结果会,使用十分处理后,当输入的第二个数为0时,程序依然可持续运行,除非输入q时离程序。

 

3.4  FileNotFoundError异常

  当我们运用文件时,一种最常见的不得了问题就是是找不至文件,为了避免出现异常,我们得以运用try-except代码块进行处理。

  例如,打开一个不存的文本,看该运行结果。

  代码:

1 filename = r"test_file"
2 with open(filename,'r',encoding="utf-8") as file_object:
3      lines = file_object.read()
4      for line in lines:
5          print(line)

 

  运行结果:

1 Traceback (most recent call last):
2   File "F:/PyProject/s14/day3/test_except.py", line 4, in <module>
3     with open(filename,'r',encoding="utf-8") as file_object:
4 FileNotFoundError: [Errno 2] No such file or directory: 'test_file'

  从上述运行结果可知,由于文件不设有,在traceback中之终极一履报告了FileNotFoundError异常,这是Python找不至打开的文件时创造的坏。该生时由于函数open()导致的,因此要拍卖此错误,必须以try语词放在包含open()的代码行之前。

  例如,用try-except代码块处理上述代码。

  优化后代码:

1 filename = r"test_file"
2 try:
3     with open(filename,'r',encoding="utf-8") as file_object:
4          lines = file_object.read()
5          for line in lines:
6              print(line)
7 except FileNotFoundError:
8     print("Sorry,the file ",filename,"does not exist.")

 

  运行结果:

1 Sorry,the file  test_file does not exist.

  从以上运行结果负但是分晓,由于try代码块引发那个,故跳到except替码块运行。

 

3.5 文本文件分析

  文件文件的剖析包括分析单个文本以及多个文件。

3.5.1 单文本文件分析

  我们可以分析包含整本书的公文文件,计算其富含多少单词。此时,我们好行使方式split(),它根据一个字符串创建一个单词列表。

  例如,分析文本文件alice.txt中发出微微只单词。

  代码:

 1 filename = r"text_files\alice.txt"
 2 try:
 3     with open(filename,'r',encoding="utf-8") as file_object:
 4         contents = file_object.read()
 5 except FileNotFoundError:
 6     print("Sorry, the file ",filename,"does not exist.")
 7 else:
 8     #计算文本大致包含多少个单词
 9     words = contents.split()
10     num_words = len(words)
11     print("The file ",filename,"has about ",str(num_words),"words.")

  说明:

  第2~4尽,属于try代码块,其中因朗诵模式,用utf-8打开文件,并拿内容读取后赋值给变量contents。

  第5~6执行,属于except 代码块,处理好FileNotFoundError,并打印提示。

  第7~11履,属于else代码块,其中第9执以办法split()对变量contents进行拍卖,生成一个列表,兵赋值给变量words;第10行以len()求生成为的列表的尺寸,就足以领略原字符串中盖包含多少只单词。

 

  运行结果:

1 The file  text_files\alice.txt has about  28753 words.

 

3.5.2 多文件文件分析

  在Python中,如果我们怀念分析多只公文文件,那么得调用函数count_words()来实现。

  例如,我们先行将单文本文件分析的代码修改用count_words()来实现。

  代码:

 1 def count_words(filename):
 2     '''算一个英文的文本大致包含多少个单词'''
 3     try:
 4         with open(filename,'r',encoding="utf-8") as file_object:
 5             contends = file_object.read()
 6     except FileNotFoundError:
 7         print("Sorry,the file ",filename,"does not exist.")
 8     else:
 9         # 计算英文文件大致包含多少个单词
10         words = contends.split()
11         nume_words = len(words)
12         print("The file ",filename,"has about ",str(nume_words))
13 filename = r"text_files\alice.txt"
14 count_words(filename)

  说明:

  第1推行,用def 申明一个函数count_words()。

  第2、9行,都是注释的始末,这证明Python中注释可以应用三只单引号将内容引起来要以每行内容前面加#声泪俱下,都只是实现注释功能。

  第14行,调用代码中表明的函数count_words(),并受该传递一个实参。

 

  运行结果:

1 The file  text_files\alice.txt has about  28753

    从以上的运作结果可知,其结果和1.3.4.1备受的一致。这证明实现单个文件分析时出少栽实现方式。

  那么我们怀念实现分析多单文本时,该怎么收拾吧?

  例如,分析多个英文文本文件。

  代码:

 1 def count_words(filename):
 2     """计算一个英文的文本大致包含多少个单词"""
 3     try:
 4         with open(filename, 'r', encoding="utf-8") as file_object:
 5             contends = file_object.read()
 6     except FileNotFoundError:
 7         print("Sorry,the file ", filename, "does not exist.")
 8     else:
 9         # 计算英文文件大致包含多少个单词
10         words = contends.split()
11         nume_words = len(words)
12         print("The file ", filename, "has about ", str(nume_words))
13 filenames = [r'text_files\alice.txt',r'text_files\little_warrior.txt',r'text_files\moby_dick.txt',r'text_files\test_file.txt',r"text_files\siddhartha.txt"] 
14 for filename in filenames: 15 count_words(filename)

  说明:

  第13实施,将要分析的文书之称存到一个列表中,并当每个元素前加一个许母r。

  第14实行,用for语句循环列表中之文件名称。

  第15履行,调用函数count_words(),并以每次循环的结果传递让该函数。

 

  运行结果:

1 The file text_files\alice.txt has about 28753 words .
2 The file text_files\little_warrior.txt has about 120399 words .
3 The file text_files\moby_dick.txt has about 214408 words .
4 Sorry,the file text_files\test_file.txt does not exist.
5 The file text_files\siddhartha.txt has about 37428 words .

  从以上运行结果可知,test_file.txt文件未在时时,也无见面影响呈现期后面的代码的周转,也不见面出现完整的traceback,这样避免了用户观看。

  因此,使用try-except代码块处理非常的利益是:避免用户看到traceback;让程序能够继续朝着后行。

  对于以上之周转结果,如果我们在出现异常时,什么也无举行,也未思叫用户了解,那么可应用pass语句。

  例如,实现多文件分析,但次非常时给什么啊未举行,同时吃用户无论感知。

  代码:

 1 def count_words(filename):
 2     """计算一个英文的文本大致包含多少个单词"""
 3     try:
 4         with open(filename, 'r', encoding="utf-8") as file_object:
 5             contends = file_object.read()
 6     except FileNotFoundError:
 7         pass
 8     else:
 9         # 计算英文文件大致包含多少个单词
10         words = contends.split()
11         nume_words = len(words)
12         print("The file ", filename, "has about ", str(nume_words),"words .")
13 filenames = [r'text_files\alice.txt',r'text_files\little_warrior.txt',r'text_files\moby_dick.txt',r'text_files\test_file.txt',r'text_files\siddhartha.txt']
14 for filename in filenames:
15      count_words(filename)

  说明:

  第7实行,使用pass语句,什么呢未开。

 

  运行结果:

1 The file  text_files\alice.txt has about  28753 words .
2 The file  text_files\little_warrior.txt has about  120399 words .
3 The file  text_files\moby_dick.txt has about  214408 words .
4 The file  text_files\siddhartha.txt has about  37428 words .

  从以上之周转结果能够,当文件test_file.txt没有找到时,什么为尚无做,也无出口任何提示,程序为能够持续运行。

  pass语句充当了占有位符,它提醒我们当先后的有位置什么还尚未开,并且以后可能要当该处做些什么。

  例如,我们以解析多单文件时,如果文件找不顶常,我们不让用户提示任何音讯,但是我们需要以拖欠公文写副一个记下文件名称的文本,便于对此类文件进行处理。

  代码:

 1 def count_words(filename):
 2     """计算一个英文的文本大致包含多少个单词"""
 3     try:
 4         with open(filename, 'r', encoding="utf-8") as file_object:
 5             contends = file_object.read()
 6     except FileNotFoundError:
 7         # pass
 8         with open(filename_missing,'a',encoding="utf-8") as file_missing_object:
 9             file_missing_object.write(filename)
10     else:
11         # 计算英文文件大致包含多少个单词
12         words = contends.split()
13         nume_words = len(words)
14         print("The file ", filename, "has about ", str(nume_words),"words .")
15 filenames = [r'text_files\alice.txt',r'text_files\little_warrior.txt',r'text_files\moby_dick.txt',r'text_files\test_file.txt',r'text_files\siddhartha.txt']
16 filename_missing =r"file_missing.tex"
17 for filename in filenames:
18      count_words(filename)

  说明:

  第8尽,以长的模式,用utf-8字符集打开文件。

  第9推行,将出现异常,找不至的文件名称写副文件file_missing.txt中。

 

  运行结果:

1 The file  text_files\alice.txt has about  28753 words .
2 The file  text_files\little_warrior.txt has about  120399 words .
3 The file  text_files\moby_dick.txt has about  214408 words .
4 The file  text_files\siddhartha.txt has about  37428 words . 

  从上述运行结果看,其结果与用pass语句时一致,但是,程序目录中几近了一个file_missing.txt文件,并且其中的始末如下:

  text_files\test_file.txt  

  以上文件就是分析文件的经过中无找到的公文。

 

3.6  如何处理非常

  于编程语言中,一个团结之雅处理,可以增强用户体验。当次出现异常时,我们需要判定是否应告知用户。一般情况下,一个前行过详尽测试了之应有尽有的次序,很少出现中错误,即由语法或逻辑引发的非常,但假如程序因外界因素,如用户输入、存在指定的文书、有网络连接,就足以出现异常。

  由于Python的错误处理结构得以让我们能细致的决定及用户享受错误信息的程度,因此,我们得以或出现异常的地方使用try-except代码块来处理好,并冲实际得控制是否应被用户提示相应的信息。

 

4 存储数据

  很多状态下,我们要求用户输入某种信息,并且于程序运行结束时犹要保障这些信。那么因此啊方法来维持这些消息为?

  这,我们见面想到一种简易的仓储数据的简短的办法,即模块JSON(JavaScript
Object
Notation)。它可给咱简要的将Python数据结构转储到文件被,并于先后还运行时加载该文件被的数目。

 

4.1 模块JSON的应用

  模块JSON
中概括个别独函数json.dump和json.load()。其中函数json.dump()需要经受两个实参,即存储的数量和可用于储存数据的文书对象;函数json.load()只需要接受需要读博该内容及外存中的公文对象。

 

4.1.1  函数json.dump()的应用

  用函数json.dump()将数据存储到.json文件被。

  例如,将数字0到9存到一个列表中,然后利用函数json.dump()来囤该数字列表。

  代码:

1 import  json
2 
3 list_numbers = [ i for i in range(10)]
4 print(list_numbers)
5 
6 filename = r'text_files\list_numbers.json'
7 with open(filename,'w') as file_object:
8     json.dump(list_numbers,file_object)

  说明:

  第1行,导入json模块;

  第3执行,创建一个0届9底数字列表,并赋值给变量list_numbers。

  第4实践,打印该列表,便于与公事list_number.json对比。

  第8执,使用函数json.dump()将列表的数量存储到文件对象中。

 

  运行结果就是文件list_numbers.json中之始末都如下所示:

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  由于打印的列表内容及贮到文件list_numbers.json中的情都同样,说明数据存储成功。

 

4.1.2  函数json.load()的应用

  用函数json.load()从.json文件被读取数据到内存中。

  例如,将文件list_numbers.json中内容读取出来,并打印。

  代码:

1 import  json
2 
3 filename = r"text_files\list_numbers.json"
4 with open(filename,'r',encoding="utf-8") as file_object:
5     list_numbers = json.load(file_object)
6 print(list_numbers)

  说明:

  第5履行,使用函数json.load()将文件对象被之始末念博到内存中,并赋值给变量list_numbers。

 

  运行结果:

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  从以上运行结果可知,我们只要想实现数量共享,可以使用json来落实。

 

4.2 保存与读取用户生成的多寡

  于Python中,对于用户生成的数,我们只是利用json保存,因为要是未因某种方式来储存这些数据,待程序运行结束后这些消息就见面丢。

 

4.2.1 保存用户生成的数据

  例如,用户登录时,提示用户以界面输入用户称,然后用json将其保存起来。

  代码:

 1 import  json
 2 
 3 username = input("Please enter your username: ")
 4 password = input("Please enter your password:")
 5 
 6 filename = r"text_files\account.json"
 7 with open(filename,'w',encoding="utf-8") as file_object:
 8     json.dump(username,file_object)
 9  print("Welcome!")

  说明:

  第3~4执行,分别提示用户输入用户称和密码。

  第8~9实践,使用函数json.dump()分别以用户称保存到文件account.json中。

 

  运行结果:

1 Please enter your username: YunQtian
2 Welcome!

  程序执行结束后,文件account.json中之情节如下所示:

"YunQtian"

 

4.2.2 读取用户生成的数码

  例如,从1.4.2.1保存之文书accoun.json中读取用户之用户称,并打印一长条消息。

  代码:

1 import json
2 
3 filename = r"text_files\account.json"
4 
5 with open(filename,'r',encoding="utf-8") as file_object:
6     username = json.load(file_object)
7     print("Welcome back,",username,"!")

  说明:

  第6实践,使用函数json.load()从文本account.json中读取存储的用户称。

  

  运行结果:

Welcome back, YunQtian !

 

  保存与读取用户生成的数额,其中好在一个序中实现。

  例如,将以上两个代码合并为一个,并做好充分处理。

  代码:

 1 import  json
 2 
 3 '''
 4  如果文件以及存在该用户,则加载它;反之,提示用户输入,并保持它
 5 '''
 6 
 7 filename = r"text_files\account.json"
 8 try:
 9     with open(filename,'r',encoding="utf-8") as file_object:
10         username =json.load(file_object)
11 except FileNotFoundError:
12     username = input("Please enter your username:")
13     with open(filename,'w',encoding="utf-8") as file_object:
14         json.dump(username,file_object)
15         print("Welcome to ",username,"!")
16 else:
17     print("Welcome back,",username,"!")

  说明:

  第1行,导入json模块。

  第3~5实践,代码注释,即程序描述。

  第8~10执,属于try代码块,如果文件在,则从文本读取用户称。

  第11~15推行,属于except代码块,如果文件不有,则提醒用户输入其用户称,并以朗诵模式及utf-8打开文件,再调用函数json.load()将输入的发出用户称存储到json文件被,并打印欢迎之问讯。

  第16~17尽,属于else代码块,打印欢迎回来的问讯。

 

  第一次执行,如果本身呢间不有,运行结果如下:

1 Please enter your username:YunQtian
2 Welcome to  YunQtian !

 

  第二破实践,已经存在拖欠公文时,其运转结果如下:

1 Welcome back, YunQtian !

  从上述结果只是推知,从第二不好结束后,每次执行之结果还如出一辙。因为文件及有,每次运行都打文本中读取。

 

4.3  重构

4.3.1  重构的定义

  在Python中,重构就是将一个能健康运行的代码作进一步的改进,即将代码划分也同一多样成就具体工作之行数的长河。

 

4.3.2 重构的意图

  重构可以于代码更加分明、更爱亮、更便于扩展。

  例如,我们用1.4.2.2
中之代码进行重构,由于该代码的重大是致敬用户,故将持有代码放到一个greet_user()的函数中。

  代码:

 1 import  json
 2 def greet_user():
 3     """问候用户,并指出其名字"""
 4     filename = r"text_files\account.json"
 5     try:
 6         with open(filename,'r',encoding="utf-8") as file_object:
 7             username = json.load(file_object)
 8     except FileNotFoundError:
 9         username = input("Please enter your username:")
10         with open(filename,'w',encoding="utf-8") as file_object:
11             json.dump(username,file_object)
12             print("Welcome to",username,"!")
13     else:
14         print("Welcom back ,",username,"!")
15 
16 greet_user()

  说明:

  第2~14实行,定义一个用户问候的函数greet_user(),并以事先的diam全写副该函数中。

  第16实施,调用函数greet_user()。

 

  运行结果:

  

  第一次于执行,如果自己呢间不在,运行结果如下:

1 Please enter your username:YunQtian
2 Welcome to  YunQtian !

 

  第二次实践,已经是拖欠文件时,其运作结果如下:

1 Welcome back, YunQtian !

 

  函数greet_user()所做的不仅仅是致敬用户,还在蕴藏了用户名时获取其。而于未曾存储用户名时提示用户输入一个。现在咱们开始重构greet_user(),让他莫执那多任务。为这个,我第一用得到存储的用户名的代码移到外一个函数中。

  代码:

 1 import json
 2 
 3 def get_stored_username():
 4     """如果存储了用户,就获取它"""
 5     filename = r"text_files\account.json"
 6     try:
 7         with open(filename,'r',encoding="utf-8") as file_object:
 8             username = json.load(file_object)
 9     except FileNotFoundError:
10         return None
11     else:
12         return username
13 
14 def greet_user():
15     """问候用户,并指出其名字"""
16     username = get_stored_username()
17     if username:
18         print("Welcome back",username,"!")
19     else:
20         username = input("Please enter your username:")
21         filename = r"text_files\account.json"
22         with open(filename,'w',encoding="utf-8") as file_object:
23             json.dump(username,file_object)
24             print("Welcome to",username,"!")
25 
26 greet_user()

  说明:

  第3~12实施,定于了一个函数get_stored_username(),并且在文档字符串中明确指出了该函数之图。

  第14~24尽,第一一个函数greet_user(),如果成功之得了用户称,就打印一长达欢迎用户回来的问候语,反之,提示用户输入其用户称。

 

  运行结果:

  第一不良施行,如果我呢间不有,运行结果如下:

1 Please enter your username:YunQtian
2 Welcome to  YunQtian !

 

  第二糟糕实践,已经在拖欠文件时,其运作结果如下:

1 Welcome back, YunQtian !

 

  于上述重构的代码中,我们尚只是拿函数greet_user()中的外一个代码提取出,即将没有存储用户名时提示用户输入的代码放到一个独门的函数中。

  代码:

 1 import json
 2 
 3 def get_stored_username():
 4     """如果存储了用户,就获取它"""
 5     filename = r"text_files\account.json"
 6     try:
 7         with open(filename,'r',encoding="utf-8") as file_object:
 8             username = json.load(file_object)
 9     except FileNotFoundError:
10         return None
11     else:
12         return username
13 
14 def get_new_username():
15     """提示用户输入用户名"""
16     username = input("Please enter your usernamr:")
17     filename = r"text_files\account.json"
18     with open(filename,'w',encoding="utf-8") as file_object:
19         json.dump(username,file_object)
20     return username
21 
22 def greet_user():
23     """问候用户,并指出其用户名"""
24     username = get_stored_username()
25     if username:
26         print("Welcome back",username,"!")
27     else:
28         username = get_new_username()
29         print("Welcome to ",username,"!")
30 
31 greet_user()

  说明:

  第3~12推行,定义了一个得到已是的用户的用户名的函数get_stored_username(),找到就赶回该用户称,反的归None。

  第14~20执,定义了一个唤起新用户输入用户名的函数get_new_username(),并采用json.dump()函数将该存入文件被,并回该用户称。

  第22~29实施,定义一个greet_user()函数,问候每个用户,并指出其用户称。

  第31行,用greet_user()打印一久符合的问候语。

 

  运行结果:

  第一糟实行,如果自己呢间不在,运行结果如下:

1 Please enter your username:YunQtian
2 Welcome to  YunQtian !

 

  第二潮施行,已经是拖欠公文时,其运转结果如下:

1 Welcome back, YunQtian !

 

  从上述这最终重构的代码可知,每个函数都推行单一而清丽的任务。我们调用函数greet_user()打印一漫长恰到好处的问候语,即要问候老用户,要么欢迎新用户。

因此,函数greet_user()首先调用函数get_stored_username(),若赢得到回的用户称,则打印问候老用户之问候语,反之,再调用函数get_new_username(),提示用户输入其用户称,并将那存入打开的文书被,再打印一修欢迎新用户之问候语。

  因此,想要编制出清晰而爱维护与壮大的代码,这种细分工作必不可少,即重构在编程中非常重点。

 

相关文章

网站地图xml地图