Python——文件处理
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()
<variable> = open (<name>, <mode>)
<name>磁盘文件名
<mode>打开模式

1 def main():
2 fname=input("enter filename:")
3 infile=open(fname,'r')
4 data=infile.read()
5 print(data)
6 main()

1 def main():
2 fname=input("enter filename:")
3 infile=open(fname,'r')
4 for i in range(5):
5 line=infile.readline()
6 print(line)
7 def Read():
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 def main():
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 def main():
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=0
10 for line in infile:
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 def main():
2 file=open("data.txt",'r')
3 s=[]
4 for line in file:
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 def f(x):
2 return x*x
3 b=[1,2,3]
4 print(list(map(f,b)))

map()类似函数映射,list由于python版本问题,需要用list显示出来。
(3)动态画图
1 import turtle 2 3 def main(): 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 in file: 16 result.append(list(map(float,line.split(","))))#逗号隔开,形成列表,map()用来转换格式 17 print(result) 18 19 for i in range(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 def main(): 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 in range(len(list1_name)): 36 s='' 37 if list1_name[i] in list2_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 in range(len(list2_name)): 49 s='' 50 if list2_name[i] not in list1_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 def main(): 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 in lines1: 18 elements=line.split()#列表类型 19 file1_name.append(elements[0])#增加和替换的区别,一步一步加 20 file1_tel.append(elements[1])#列变行 21 22 for line in lines2: 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] in file2_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 in range(len(file2_name)): 45 s='' 46 if file2_name[i] not in file1_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 in lines1:#获取第一个文本中的姓名和电话信息 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 in lines2:#获取第二个文本中的姓名和邮件信息 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 #按索引方式遍历姓名列表1 31 for i in range(len(list1_name)): 32 s= '' 33 if list1_name[i] in list2_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 in range(len(list2_name)): 44 s= '' 45 if list2_name[i] not in list1_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()函数将名字,电话,邮箱连成一个字符串,加入到新的列表中——将新列表写入新的文件——实现功能

浙公网安备 33010602011771号