Python基础之数据类型(PartC.文件与字典类型)

图片名称

Python主要包含以下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技术