python 文件处理软件_Python——文件处理

1、文件

存储在外部介质上的数据或信息的集合 。程序中的源程序、数据中保存着数据、图像中的像素数据

有序的数据序列。

2、编码

信息从一种形式转换为另一种形式的过程。ASCII码、Unicode、UTF-8

(1)ASCII码

ASCII码是标准化字符集,7个二进制位编码,表示128个字符

08e9db6ed4d9e4d73ccc5dafb13eb751.png

可以看出,字符和数字之间一一对应,还有,字符串需要用引号。

(2)Unicode

跨语言、 跨平台进行文本转换和处理。对每种语言中字符设定统一且唯一的二进制编码,每个字符两个字节长

65536 个字符的编码空间

“严” :Unicode的十六进制数为4E25

(3)UTF-8编码可变长度的Unicode的实现方式

“严” :十六进制数为E4B8A5

(4)GBK编码

双字节编码

2、文件数据

文本文件:以ASCII码方式存储的文件…

二进制文件

(1)文本文件

以ASCII码方式存储的文件…

(2)二进制文件ASCII码

照片、 音乐、 视频、 计算机程序等

优点:更加节省空间、采用二进制无格式存储、表示更为精确

3、文件基本处理

(1)写入

Open()

= open (, )

磁盘文件名

打开模式

75606514f9c8fde66c3fa5bffb9bf558.png

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

d95ffc6d008fa385fa901a4f9fda79e8.png

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()

d244d2bd540a39201971dd8ceaad5085.png

以上两段程序是将文件按行输出,后一段是去掉了最后的换行符,得以没有行间隔。

(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()

b821c49ff4200c6d5ec7c7896fe2c40b.png

(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

0a5415ada90e7bd771dfcc729cd1a464.png

注意: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()

b2463c7384e132a4f2cbe309ca33a6a2.png

可以看得出,列表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)))

952882ad3e80b66da564f62340a37c74.png

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

16286f194385074081f036539765766b.png

4、文件合并

60bdacdcb659a7c6a651eb1acb74cb2b.png

将以上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()

d937474f402aeb3432de288fae344e54.png

对齐功能还没有实现。

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

640ffe62168b3e2e8d4f81b6c53381f8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值