# -*- coding: utf-8 -*-
#嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av15123607/?from=search&seid=10211084839195730432#page=25 中的38-41讲
# 文件
# 文件是存储在外部介质上的数据或信息的集合
# 文件是有序的数据序列
# 常用的编码
# ASCII码是标准化字符集
# 7个二进制位编码
# 表示128个字符 # ord() 将字符转化为ASCII码, chr() 将ASCII码转化为字符
#
# Unicode :为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言跨平台的需求。
# 有65536个字符的编码空间
# 它是十六进制的编码方式
#
# UTF-8 : 为一种可变长度的Unicode编码,它是一种多字节的编码体系
# 英文对应Unicode的单字节,中,日,韩文对应Unicode的三字节
# 可以用一到四个字节的不同长度来表示
#
# Python中字符串类型是未编码的类型,我们可以用encode()来进行编码操作,使用decode()来进行解码操作
#
# GBK编码 :全称为《汉字内码扩展规范》
# 双字节编码
#
# 文件数据按其组织形式的不同可分为文本文件和二进制文件
# 文本文件:以ASCII码方式存储的文件,英文,数字等字符存储在ASCII码上
# 文本文件是基于字符定长的ASCII码文件
# Python使用常规换行符(\n)表示换行
# 二进制文件
# 广义二进制文件:文件在外部设备的存放形式为二进制的文件
# 狭义二进制文件:除文本文件外的所有文件
# 二进制文件包括照片,音乐,视频,计算机程序等
# 二进制文件优点:
# 更加节省空间
# 采用二进制无格式存储
# 二进制数据表示更为精确,不会造成有效位的丢失。
# 二进制文件编码是变长的,灵活利用率更高
# 不同的二进制文件解码方式不同
#
# 文件操作:
# 读取
# 写入
# 定位
# 计算,追加等
#
# 打开文件
# open()
# <variable> = open(<name>,<mode>)
# mode形式:r:只读,如果文件不存在,则输出错误
# w: 只写,如果文件不存在,则自动创建文件
# a: 附加到文件末尾
# rb:只读二进制文件,如果文件不存在,则输出错误
# wb:只写二进制文件,如果文件不存在,则自动创建文件
# ab: 附加到二进制文件末尾
# r+ :读写
# read() 返回值为包含整个文件内容的一个字符串
# readline() 返回值为文件下一行内容的一个字符串
# readlines() 返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串。
# write() 把含有文本数据或二进制数据块的字符串定稿到文本中
# writelines() 针对列表操作,接受一个字符串列表作为参数,将它们写入文件,并且行结束符不会被自动加入
#
#infle = open(r"C:\Users\Admin\Desktop\宋冬野 - 斑马,斑马.flac",‘rb‘) #文件路径要根据实际情况填列
#print(infle)
#infile = open(r"C:\Users\Admin\Desktop\123.txt",‘r‘)
#for i in range(10):
# line = infile.readline()
# print(line[:-1])
#>>>outfile = open(r‘C:\Users\Admin\Desktop\123.txt‘,‘w‘) #文件路径要根据实际情况填列
#>>>outfile.writelines(["Hello",‘ ‘,‘world‘]) #写入内容后原文件内容会被清除
#>>>outfile.close()
#>>>infile = open(r‘C:\Users\Admin\Desktop\123.txt‘,‘r‘) #文件路径要根据实际情况填列
#>>>infile.read()
#‘Hello world‘
#
# 文件遍历:最常见的文件处理方法,如拷贝,根据数据文件定义行走路径,将文件由一种编码转换成另一种编码。
# 遍历文件模板:
# 通用代码框架:
#file = open(r‘文件路径‘,‘r‘)
#for line in file.readlines():
# 编写程序处理一行文件内容
#file.close()
# 简化代码框架
#file = open(r‘文件路径‘,‘r‘)
#for line in file:
# 编写程序处理一行文件内容
#file.close()
#
# 文件拷贝代码
"""
def main():
f1 = input("请输入一个需要拷贝的文件名称: ").strip()
f2 = input("请输入一个拷贝后的目标文件名称: ").strip()
infile = open(f1,‘r‘)
outfile = open(f2,‘w‘)
countLines = countChars = 0
for line in infile:
countLines += 1
countChars += len(line)
outfile.write(line)
print(countLines, "lines and ", countChars, "chars copied.")
infile.close()
outfile.close()
main()
"""
"""
data.txt
300,0,144,1,0,0 #元素1(第一列)路径前进像素数
300,0,144,0,1,0 #元素2(第二列)转动方向,0为左,1为右
300,0,144,0,0,1 #元素3(第三列)转动角度
300,0,144,1,1,0 #元素3(最后) 绘制颜色的RGB值
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
"""
# 根据data.txt文件中的数据在窗口中进行动态路径绘制
import turtle
def main():
turtle.title("数据驱动的动态路径绘制")
turtle.setup(800,600,0,0)
pen = turtle.Turtle()
pen.color("red")
pen.width(5)
pen.shape("turtle")
pen.speed(5)
result = []
file = open(r"C:\Users\fengbo\Desktop\data.txt","r") #文件路径要根据实际情况填列
for line in file:
print(type(line)) #查看line的属性
print(line.split(‘,‘)) #查看分割后line的存储信息
result.append(list(map(float,line.split(‘,‘))))
print(result)
print(len(result))
for i in range(len(result)):
pen.color((result[i][3],result[i][4],result[i][5]))
pen.fd(result[i][0])
if result[i][1]:
pen.rt(result[i][2])
else:
pen.lt(result[i][2])
pen.goto(0, 0)
if __name__ == ‘__main__‘:
main()
# 文件信息合并程序
ftele1 = open(r‘C:\Users\fengbo\Desktop\电话1106.txt‘,‘rb‘)
ftele2 = open(r‘C:\Users\fengbo\Desktop\邮箱1106.txt‘,‘rb‘)
ftele1.readline() #跳过第一行
ftele2.readline() #跳过第一行
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()
list1_name = []
list2_name = []
list1_tele = []
list2_email = []
for line in lines1: #获取第一个文本中的姓名和电话信息
elements = line.split()
list1_name.append(str(elements[0].decode(‘gbk‘)))
list1_tele.append(str(elements[1].decode(‘gbk‘)))
for line in lines2:
elements = line.split()
list2_name.append(str(elements[0].decode(‘gbk‘)))
list2_email.append(str(elements[1].decode(‘gbk‘)))
#按索引方式遍历姓名列表1
for i in range(len(list1_name)):
s = ‘‘
if list1_name[i] in list2_name:
j = list2_name.index(list1_name[i]) #找到姓名,列表1对应列表2中的姓名
s = ‘\t‘.join([list1_name[i], list1_tele, list2_email[j]])
s += ‘\n‘
else:
s = ‘\t‘.join([list1_name[i], list1_tele, str(‘ ----- ‘)])
s += ‘\n‘
lines.append(s)
#处理姓名列表2中剩余的姓名
for i in range(len(list2_name)):
s = ‘‘
if list2_name[i] not in list1_name:
s = ‘\t‘.join([list2_name[i], str(‘ ----- ‘), list2_email[i]])
s += ‘\n‘
lines.append(s)
ftele3 = open(r‘C:\Users\fengbo\Desktop\电话邮箱1106.txt‘,‘w‘)
ftele3.write(lines)
ftele3.close()
ftele1.close()
ftele2.close()
print("个人信息簿合并完成。") #需要学完正则表达式后再来回顾