Python-十二、读写计算机文件

1.编码

编码的本质就是让只认识0和1的计算机,能够理解我们人类使用的语言符号,并且将数据转换为二进制进行存储和传输。

这种从人类语言到计算机语言转换的形式,就叫做编码表,它让人类语言和计算机语言能够一一对应起来。

1.1二进制

由于有二进制,0和1这两个数字才能像“太极生两仪,两仪生四象,四象生八卦”一样,涵盖容纳世间所有的信息。

举例:

烽火与二进制

现在有两座烽火台,右边为第1座,左边为第2座。我们约定,当没有烽火台被点着的时候,表示没有敌人(00);只点着第一座烽火台的时候,表示来了一个敌人(01);只点着第二座烽火台的时候,表示来了2个敌人。(10,逢二进一)

当两座烽火台都被点着的时候(11),就表示来了3个人。

用来存放一位0或1,就是计算机里最小的存储单位,叫做【位】,也叫【比特】(bit)。我们规定8个比特构成一个【字节】(byte),这是计算机里最常用的单位。

bit位/比特:存放一位二进制数,即0或1,最小的存储单位。
byte子节:8个二进制位为一个子节(B),最常用的单位。

1B(byte) = 8bit
1KB(Kilobyte 千字节) = 1024B
1MB(Megabyte 兆字节 简称“兆”) = 1024KB
1GB(Gigabyte 吉字节 又称“千兆”) = 1024MB

1.2编码表

计算机一开始发明的时候,只是用来解决数字计算的问题。后来人们发现,计算机还可以做更多的事,正所谓能力越大,责任越大。但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符。

于是除了0、1这些阿拉伯数字,像a、b、c这样的52个字母(包括大小写),还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数 字表示哪个符号,理论上每个人都可以有自己的一套规则(这就叫编码)。

但大家如果想要互相沟通而不造成混乱,就必须使用相同的编码规则。如果使用了不同的编码规则,那就会彼此读不懂,这就是“乱码”的由来。

编码演进表

1.3encode()和decode()

编码,即将人类语言转换为计算机语言,就是【编码】encode();反之,就是【解码】decode()。它们的用法如下代码表示:

print('小张'.encode('utf-8'))
print('小张'.encode('gbk'))
print(b'\xe5\x90\xb4\xe6\x9e\xab'.decode('utf-8'))
print(b'\xce\xe2\xb7\xe3'.decode('gbk'))
# 输出结果
# b'\xe5\x90\xb4\xe6\x9e\xab'
# b'\xce\xe2\xb7\xe3'
# 吴枫
# 吴枫

所谓的编码,其实本质就是把str(字符串)类型的数据,利用不同的编码表,转换成bytes(字节)类型的数据。

分隔符还挺常见的,我们在上网的时候,不是会有网址嘛?你经常会看到网址里面有好多的%,它们也是分隔符,替换了Python中的\x。比如像下面这个:

https://www.baidu.com/s?wd=%E5%90%B4%E6%9E%AB

2.文件读写

文件读写,是Python代码调用电脑文件的主要功能,能被用于读取和写入文本记录、音频片段、Excel文档、保存邮件以及任何保存在电脑上的东西。

2.1读文件

文件的地址有两种:相对路径和绝对路径,拖到终端获取的地址是绝对路径。这两种地址,Mac和Windows电脑不太一样。

Mac:

open('/Users/Ted/Desktop/test/word/abc.txt'')
open('word/abc.txt')

Windows:

open('C:\\Users\\Ted\\Desktop\\test\\abc.txt')
#将'\'替换成'\\'
open(r'C:\Users\Ted\Desktop\test\abc.txt')
#在路径前加上字母r

读文件的三步:开——读——关

读文件

2.2写文件

写文件很没有创意的——也是三步:打开文件——写入文件——关闭文件。

file1 = open('/Users/Ted/Desktop/test/abc.txt', 'w',encoding='utf-8') 
file1.write('写入一些内容\n')     

'w'写入模式会给你暴力清空掉文件,然后再给你写入。如果你只想增加东西,而不想完全覆盖掉原文件的话,就要使用'a'模式,表示append,你学过,它是追加的意思。

我们想写入的数据不是文本内容,而是音频和图片的话,该怎么做呢?答案是使用'wb'模式,它的意思是以二进制的方式打开一个文件用于写入。因为图片和音频是以二进制的形式保存的,所以使用wb模式就好了。

OPEN函数

练习1

新建一个rantest.txt,里面有几位同学的随堂测验成绩(发现有的同学爱逃课,成就不好哦,也有天才少年,逃课成绩也很棒哦):
赵一 67 65 63
钱二 71 72 75 65 72
孙三 99 97 98 95 90 96
李四 100 99 97 98

现在我们希望统计这些同学的随堂测验总分,并存储在一个新文件中,该怎么办?
**TIPS**需要我们使用split()来把字符串分开,它会按空格把字符串里面的内容分开。

# 定义一个名为file的变量存放读取的文件数据,码率为utf-8
file = open('d:\\rantest.txt','r',encoding='utf-8')
'''
如果直接用read()会导致整个txt文件被打包读取,所以这里用readlines按行读取。
读取后,存储于file_lines变量中
'''
file_lines = file.readlines()
file.close() #文件读取完毕后,记得关闭文件

# 定义列表final_scores,用于后面我们保存需要的数据
final_scores = []

# 用循环的方法,遍历file_lines变量中的每行数据
for i in file_lines:
    data = i.split()            #定义data变量,存储用split()切分的更细的字符串
    sum = 0                     #把总成绩设为0
    for score in data[1:]:      #用到了列表的[A:]写法,意为只遍历A以后的数据
        sum = sum + int(score)  #切记要把字符串转换为数字
    result = data[0]+str(sum)   #用result存储学生姓名和成绩
    final_scores.append(result) #用append的方式存储学生的最终成绩
    print(final_scores)

# 将存储好的学生成绩写入文件中
fintest = open('d:\\fintest.txt','w',encoding='utf-8')
fintest.writelines(final_scores)
fintest.close()

练习2

练习目标

我们会通过今天的作业,复习课堂上学到的知识:编码和解码以及文件读写。

练习要求

对课堂上得到的“winner”文档再行处理一下,让学员的成绩从高到低排列,然后放到新文档“winner_new.txt”。

思路

既然是成绩的排列,就必须知道学生的成绩高低。
1、首先读取winner文档

file1 = open('winner.txt','r',encoding='utf-8') 
file_lines = file1.read() 
print(file_lines)
file1.close()

得到成绩单:
LEE 102
CHRIS 383
KATE 570
GREEN 275

2、其次创建保存成绩的变量
dict_scores = {}
list_scores = []
final_scores = []

3、最后把几位的成绩取出来,依照由高到底保存到另一个列表中
参考列表的SORT排序即可。

练习3

练习目标

学会直接修改原文件中的数据。

练习要求

语文老师将一些古诗存在txt文档里,一句一行。
最近,他计划抽一些古诗,自己设置一些空来让学生默写。
请你用代码帮老师完成这项工作(只要处理了一个文档,加上循环就能处理无数个文档了)。

思路

老师想的是把诗中需要抽查的句子腾空,那么需要抽查的句子一旦与原文匹配,就可以腾空了。

'''
poem.txt 中存储了原文
《静夜思》
唐朝:李白

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
'''

'''
poem1.txt 中用来存储抽查的诗句
《静夜思》
唐朝:李白

床前明月光,
___。
举头望明月,
___。
'''

with open ('d:\\poem.txt','r',encoding='utf-8') as f:
    lines = f.readlines()  # 这时,lines 的数据存放在内存里。
print (lines) # 将读取到的内容打印出来,发现实际上读到的是带换行符的字符串。

with open('d:\\poem1.txt','w',encoding='utf-8') as new:
    for line in lines:  # 在内存中,对数据进行处理,然后再写到文档里,覆盖之前的内容。
        if line not in ['疑是地上霜。\n','低头思故乡。\n']:  # 注意:这里的条件要根据上面打印出的数据写。
            new.write(line)

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