Python基础之数据类型(PartC.文件与字典类型)
25 Oct 2017Python主要包含以下6种数据类型:
·数字类型 ·字符串类型
·元组类型 ·列表类型
·文件类型 ·字典类型
注:由于篇幅问题,Python基础之数据类型被分为3个部分,相关页面请跳转:
Python基础之数据类型(PartA.数字与字符串类型)
Python基础之数据类型(PartB.元组与列表类型)
Python基础之数据类型(PartC.文件与字典类型)
· 文件类型
问题1:常用的文件编码类型有哪些?
回答1:具体见下表
编码类型 | 编码描述 |
---|---|
ASCII码 | 多用于英文字母及数字(存储汉字容易报错) |
Unicode | 包含:汉字、英文字母、数字及各国通用语言 |
UTF-8 | 可变长度的Unicode(最常用) |
GBK编码 | 面向汉字的编码(最少用) |
问题2:Python如何读取文件?
回答2:Python读取文件包括两步:文件打开+文件读取
文件打开代码示例:infile = open(“numbers.dat”,”r”),文件打开模式如下:
打开模式代码 | 可做操作 | 若文件不存在 | 若该文件存在 |
---|---|---|---|
r | 只能读 | 报错 | - |
r+ | 可读可写 | 报错 | 全文覆盖 |
w | 只能写 | 创建 | 全文覆盖 |
w+ | 可读可写 | 创建 | 全文覆盖 |
a | 只能写 | 创建 | 末尾追加 |
a+ | 可读可写 | 创建 | 末尾追加 |
文件读取代码示例:data = infile.read(),文件读取方法如下:
读取模式代码 | 代码详细描述 |
---|---|
read() | 返回值为包含整个文件内容的一个字符串 |
readline() | 返回值为文件下一行内容的字符串 |
readlines() | 返回值为整个文件内容的列表,每项是以换行符为结果的一行字符串 |
Python读取文件示例
# test01.txt 文件内容如下
1 2 3
4 5 6
7 8 9
# 读取文件全部内容
fname = "D:\\test01.txt" #确保D盘下有test.txt文件
infile = open(fname,"r")
data = infile.read()
# 上述两条代码也可合并成:data = open(fname,"r").read() #建议分开写
print(data)
# 输出结果
1 2 3
4 5 6
7 8 9
# 遍历读取文件全部内容
infile = open(fname,"r")
for line in infile:
print(line)
# 输出结果
1 2 3
4 5 6
7 8 9
# 读取文件前n行内容
fname = "D:\\test01.txt"
infile = open(fname,"r")
for i in range(2): #读取文件前几行
data = infile.readline()
print(data)
# 输出结果
1 2 3
4 5 6
# 从第2行开始读取文件内容(多用于去除表头)
fname = "D:\\tes01.txt"
infile = open(fname,"r")
infile.readline() #去除表头
data = infile.readlines() #以列表方式读取
print(data)
# 输出结果
4 5 6
7 8 9
问题3:Python如何写入文件?
回答3:Python文件写入代码示例如下:
outfile = open("D:\\test02.txt","w") #在D盘建一个名为test02的文件,若存在则不会创建
outfile.writelines(["Hello"," ","World"]) #写入数据
outfile.close()
infile = open("D:\\test02.txt","r").read() #读取数据
print(infile)
# 输出结果
Hello World
Python文件写入方法如下:
写入模式代码 | 代码详细描述 |
---|---|
write() | 把含有文本数据和二进制数据块的字符串写入文件中 |
writelines() | 针对列表操作,接受一个字符串列表作为参数,并写入文件中 |
问题4:Python多个文件如何进行合并?
回答4:若熟悉SQL的童鞋应该知道横向全连接这个概念,即以某个变量为参照,将两个文件(数据集)合并成一个文件,这里演示在不借助任何库的情况下,利用Python进行横向连接的方法。
# ==== 原始文件 ====
a1.txt
姓名 电话
王五 123456
张三 456789
李四 789456
熊七 456123
a2.txt
姓名 邮箱
王五 feifei1@qq.com
胜八 feifei2@qq.com
张三 feifei3@qq.com
章九 feifei4@qq.com
# ==== Python代码 ====
# 原始数据读入
ftele1=open('d:\\a1.txt','rb') #采用二进制方式读取,避免中文乱码
ftele2=open('d:\\a2.txt','rb')
ftele1.readline() #去除表头变量名
ftele2.readline()
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()
list1_name = []
list1_tele = []
list2_name = []
list2_email = []
for line in lines1: #获取a1文件中的姓名和电话信息
elements = line.split()
list1_name.append(str(elements[0].decode('gbk'))) #采用gbk中文编码读入
list1_tele.append(str(elements[1].decode('gbk'))) #str()将文本读出来的bytes转换为字符类型
for line in lines2: #获取a2文件中的姓名和邮件信息
elements = line.split()
list2_name.append(str(elements[0].decode('gbk')))
list2_email.append(str(elements[1].decode('gbk')))
# 创建空白文件
lines = []
lines.append('姓名\t 电话 \t 邮箱\n')
#按索引方式遍历姓名列表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[i], list2_email[j]])
s += '\n'
else:
s = '\t'.join([list1_name[i], list1_tele[i], 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('d:\\a3.txt', 'w') #将数据写入文件
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()
# ==== 输出结果 ====
姓名 电话 邮箱
王五 123456 feifei1@qq.com
张三 456789 feifei3@qq.com
李四 789456 -----
熊七 456123 -----
胜八 ----- feifei2@qq.com
章九 ----- feifei4@qq.com
· 字典类型
问题1:什么是字典类型?
回答1:字典类型是Python中一种非序列的存储结构,存储的是键值对(key:value),其存储形式为 d={key1:value1, key2:value2},以用户名和密码为例:admin={‘admin01’:1234, ‘admin02’:2345, ‘admin03’:3456},其中<键>是唯一不重复的,<值>可以不唯一。值>键>
问题2:Python如何操作字典类型数据(基础)?
回答2:操作方式如下
# ==== 构建字典类型数据 ====
students={"203-2012-045":"John","203-2012-037":"Peter"} # 大括号创建字典
# 输出结果
print(students)
{'203-2012-045': 'John', '203-2012-037': 'Peter'}
# ==== 向已有字典里增加数据项 ====
students["202-2011-121"]="Susan" # 中括号添加字典
# 输出结果
print(students)
{'203-2012-045': 'John', '203-2012-037': 'Peter', '202-2011-121': 'Susan'}
# ==== 查询字典中的值 ====
students["203-2012-045"]
# 输出结果
'John'
# ==== 删除字典中的一项 ====
del students["203-2012-037"]
# 输出结果
print(students)
{'203-2012-045': 'John', '202-2011-121': 'Susan'}
# ==== 字典遍历 ====
for key in students:
print(key) # 输出key值
print(students[key]) # 输出value值
print(key + ":" + str(students[key])) # 输出key-value值
# 输出结果
203-2012-045
John
203-2012-045:John
==============
202-2011-121
Susan
202-2011-121:Susan
# ==== 判断键key是否在字典中 ====
"203-2012-045" in students # Output显示True/False
# 输出结果
True
问题3:Python如何高效操作字典类型数据(进阶)?
回答3:这里要使用到Python所提供的函数,具体方式如下:
# ==== 构建字典类型数据 ====
students={"203-2012-045":"John","203-2012-037":"Peter"}
# ==== 显示字典中所有的key ====
tuple(students.keys())
# 输出结果
('203-2012-045', '203-2012-037')
# ==== 显示字典中所有的value ====
tuple(students.values())
# 输出结果
('John', 'Peter')
# ==== 显示字典中所有的key-value ====
tuple(students.items())
# 输出结果
(('203-2012-045', 'John'), ('203-2012-037', 'Peter'))
# ==== 获取字典中key对应的值 ====
students.get("203-2012-045")
# 输出结果
'John'
# ==== 删除字典中key对应的值 ====
students.pop("203-2012-045")
students
# 输出结果
'John'
{'203-2012-037': 'Peter'} #students中删除了'John'
# ==== 删除字典中所有的值 ====
students.clear()
students
# 输出结果
{} #students被清空
分类: Python技术