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()函数将名字,电话,邮箱连成一个字符串,加入到新的列表中——将新列表写入新的文件——实现功能

 

posted on 2017-08-15 00:23  箬笠蓑衣  阅读(833)  评论(0)    收藏  举报