1、文件
存储在外部介质上的数据或信息的集合 。程序中的源程序、数据中保存着数据、图像中的像素数据
有序的数据序列。
2、编码
信息从一种形式转换为另一种形式的过程。ASCII码、Unicode、UTF-8
(1)ASCII码
ASCII码是标准化字符集,7个二进制位编码,表示128个字符
可以看出,字符和数字之间一一对应,还有,字符串需要用引号。
(2)Unicode
跨语言、 跨平台进行文本转换和处理。对每种语言中字符设定统一且唯一的二进制编码,每个字符两个字节长
65536 个字符的编码空间
“严” :Unicode的十六进制数为4E25
(3)UTF-8编码可变长度的Unicode的实现方式
“严” :十六进制数为E4B8A5
(4)GBK编码
双字节编码
2、文件数据
文本文件:以ASCII码方式存储的文件…
二进制文件
(1)文本文件
以ASCII码方式存储的文件…
(2)二进制文件ASCII码
照片、 音乐、 视频、 计算机程序等
优点:更加节省空间、采用二进制无格式存储、表示更为精确
3、文件基本处理
(1)写入
Open()
= open (, )
磁盘文件名
打开模式
1 defmain():2 fname=input("enter filename:")3 infile=open(fname,'r')4 data=infile.read()5 print(data)6 main()
1 defmain():2 fname=input("enter filename:")3 infile=open(fname,'r')4 for i in range(5):5 line=infile.readline()6 print(line)7 defRead():8 fname=input("enter filename:")9 infile=open(fname,'r')10 for n in range(5):11 line=infile.readline()12 print(line[:-1])13 main()14 Read()
以上两段程序是将文件按行输出,后一段是去掉了最后的换行符,得以没有行间隔。
(2)写入
从计算机内存向文件写入数据
write():把含有本文数据或二进制数据块的字符串写入文件中。
writelines():针对列表操作,接受一个字符串列表作为参数,将它们写入文件。
1 defmain():2 filename=input("enter the file's name:")3 outfile=open(filename,'w')4 outfile.writelines(['hello','\n','world'])5 outfile.close()6 infile=open(filename,'r')7 data=infile.read()8 print(data)9
10 main()
(3)文件遍历
最常见的文件处理方法
举例:拷贝文件、根据数据文件定义行走路径、将文件由一种编码转换为另外一种编码 通用代码框架:
通用代码框架:
file = open (someFile, "r")
For line in file.readlines():#处理一行文件内容
file.close()
简化代码框架:file = open (someFile, "r")
For line in file#处理一行文件内容
file.close()
1 defmain():2
3 f1=input("enter a souce file:")4 f2=input("enter a souce file:")5
6 infile=open(f1,'r')7 outfile=open(f2,"w")8
9 countlines=countchars=010 for line ininfile:11 countlines+=1
12 countchars+=len(line)13 outfile.write(line)14 print(countlines,'lines and',countchars,'chars copied')15
16 infile.close()17 outfile.close()18 main()19
20
21
注意:write()是用来写入字符串的,writelines()可以用来写入数组。
4、实例
(1)append函数
1 defmain():2 file=open("data.txt",'r')3 s=[]4 for line infile:5 s.append(line)6 print(s)7 print(len(s))8 print("\n",s[-1])9 print(s[-1][0])10 main()
可以看得出,列表s有4个部分,每部分由一组字符串构成。
(2) map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
例如,对于list [1, 2, 3]
如果希望把list的每个元素都作平方,就可以用map()函数:
因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
1 deff(x):2 return x*x3 b=[1,2,3]4 print(list(map(f,b)))
map()类似函数映射,list由于python版本问题,需要用list显示出来。
(3)动态画图
1 importturtle2
3 defmain():4 turtle.title("数据驱动的动态路径绘制")5 turtle.setup(800,600,0,0) #画布大小800*600像素,(0,0)画笔中心点
6
7 pen=turtle.Turtle()#创建画笔
8 pen.color('red')9 pen.width(5)10 pen.shape("turtle")#形状
11 pen.speed(5)12
13 result=[]14 file=open("data.txt",'r')15 for line infile:16 result.append(list(map(float,line.split(","))))#逗号隔开,形成列表,map()用来转换格式
17 print(result)18
19 for i inrange(len(result)):20 pen.color(result[i][3],result[i][4],result[i][5])21 pen.forward(result[i][0])22 if result[i][1]: #如果这个数是1,向右转
23 pen.rt(result[i][2])24 else:25 pen.lt(result[i][2])#0的话,向左转
26 pen.goto(0,0)27
28 main()29
30
4、文件合并
将以上TXT文件合并
(1)
1 defmain():2 ftele1=open('tel.txt','r')3 ftele2=open('email.txt','r')4
5 ftele1.readline() #跳过第一行,标题栏
6 ftele2.readline()7 lines1 =ftele1.readlines()8 lines2 =ftele2.readlines()9
10 list1_name = [] #每一列的内容单独摘出来
11 list1_tele =[]12 list2_name =[]13 list2_email =[]14
15 for line in lines1:#获取第一个文本中的姓名和电话信息
16 elements=line.split() #列表类型
17 list1_name.append(str(elements[0]))18 list1_tele.append(str(elements[1]))19 print(elements) #空格分开后的列表
20 print('\n',list1_name)#名字列表
21 print(list1_tele,'\n')#电话列表
22
23 for line in lines2:#获取第二个文本中的姓名和邮箱信息
24 elements=line.split() #列表类型
25 list2_name.append(str(elements[0]))26 list2_email.append(str(elements[1]))27 print(elements) #空格分开后的列表
28 print("\n",list2_name)#名字列表
29 print(list2_email,'\n')#电话列表
30
31 lines=[]32 lines.append("姓名\t 电话\t 邮箱\n")33 print(lines)34
35 for i inrange(len(list1_name)):36 s=''
37 if list1_name[i] inlist2_name:38 j=list2_name.index(list1_name[i])#表2中与表1中名字对应的位置索引
39 s='\t'.join([list1_name[i],list1_tele[i],list2_email[j]])#'\t'插入到三个元素中间
40 s+='\n'
41 else:42 s = '\t'.join([list1_name[i], list1_tele[i], str('-----')])43 s += '\n'
44 print('\n',s)45 lines.append(s)46
47
48 for i inrange(len(list2_name)):49 s=''
50 if list2_name[i] not inlist1_name:51 s='\t'.join([list2_name[i],str("---"),list2_email[i]])52 s+='\n'
53 print(s)54 lines.append(s)55 print(lines)56
57 ftele3=open('book.txt','w')58 ftele3.writelines(lines)59 ftele3.close()60 ftele1.close()61 ftele2.close()62 print('ok')63
64 main()
对齐功能还没有实现。
1 defmain():2
3 file1=open("tel.txt",'r')4 file2=open("email.txt",'r')5
6 file1.readline() #第一行内容
7 file2.readline()8
9 file1_name=[]10 file1_tel=[]11 file2_name=[]12 file2_email=[]13
14 lines1=file1.readlines()#余下的内容
15 lines2=file2.readlines()16
17 for line inlines1:18 elements=line.split()#列表类型
19 file1_name.append(elements[0])#增加和替换的区别,一步一步加
20 file1_tel.append(elements[1])#列变行
21
22 for line inlines2:23 elements=line.split()24 file2_name.append(elements[0])25 file2_email.append(elements[1])26 print(file2_name)27
28 lines=[]#创建新的列表
29 lines.append("姓名\t电话\t 邮箱\n")#增加了一个字符串
30
31 for i in range(len(file1_name)):#用下标是为了可以表示出电话
32 s=''#抽取元素,构成新的一行字符串,(每行是否可以换成列表?)
33 if file1_name[i] infile2_name:34 j=file2_name.index(file1_name[i])35 s="\t".join([file1_name[i],file1_tel[i],file2_email[j]])36 s+='\n' #换行
37 else:38 s="\t".join([file1_name[i],file1_tel[i],"---"])39 #s.append('\n')#字符串不可以用append()
40 s+='\n'
41 lines.append(s)42 print(lines)43
44 for i inrange(len(file2_name)):45 s=''
46 if file2_name[i] not infile1_name:47 s='\t'.join([file2_name[i],"---",file2_email[i]])#将一个列表结合成一个字符串
48 s+='\n'
49 lines.append(s)50 print(lines)51
52 file3=open("text.txt","w")53 file3.writelines(lines) #write()只能用字符串,writelines()用于列表
54 file3.close()55 file1.close()56 file2.close()57
58 main()
1 #利用字符串和列表将两个通讯录文本合并为一个文本2 def main():3 ftele1=open('tel.txt','rb')4 ftele2=open('email.txt','rb')5
6 ftele1.readline() #跳过第一行7 ftele2.readline()8 lines1 =ftele1.readlines()9 lines2 =ftele2.readlines()10
11 list1_name =[] #每一列的内容单独摘出来12 list1_tele =[]13 list2_name =[]14 list2_email =[]15
16 for line inlines1:#获取第一个文本中的姓名和电话信息17 elements =line.split()#将一个字符串分裂成多个字符串组成的列表。18 list1_name.append(str(elements[0].decode('gbk')))19 list1_tele.append(str(elements[1].decode('gbk'))) #将文本读出来的bytes转换为str类型20
21 for line inlines2:#获取第二个文本中的姓名和邮件信息22 elements =line.split()23 list2_name.append(str(elements[0].decode('gbk')))24 list2_email.append(str(elements[1].decode('gbk')))25
26 ###开始处理###27 lines =[]28 lines.append('姓名\t 电话 \t 邮箱\n')29
30 #按索引方式遍历姓名列表131 for i inrange(len(list1_name)):32 s= ''
33 if list1_name[i] inlist2_name:34 j =list2_name.index(list1_name[i]) #找到姓名列表1对应列表2中的姓名索引位置35 s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])36 s += '\n'
37 else:38 s = '\t'.join([list1_name[i], list1_tele[i], str('-----')])39 s += '\n'
40 lines.append(s)41
42 #处理姓名列表2中剩余的姓名43 for i inrange(len(list2_name)):44 s= ''
45 if list2_name[i] not inlist1_name:46 s = '\t'.join([list2_name[i], str('-----'), list2_email[i]])47 s += '\n'
48 lines.append(s)49
50 ftele3 = open('AddressBook.txt', 'w')51 ftele3.writelines(lines)52 ftele3.close()53 ftele1.close()54 ftele2.close()55
56 print("The addressBooks are merged!")57
58
59 main()
思路:
读取两个文件——以行为循环,通过split()函数,拆分行 ,将名字,电话,邮箱用append()函数添加到新建的列表中——新建一个列表,append语句添加表头——用for循环 if语句判断两个名字是否相同,以下标为索引,通过join()函数将名字,电话,邮箱连成一个字符串,加入到新的列表中——将新列表写入新的文件——实现功能