目录
一、概述
二、txt文件读写
三、csv文件读写
四、Json文件读写
一、概述
读写模式:
- r:读数据
- w:覆盖写入
- a:追加写入
- rb:以二进制形式读出
- wb:以二进制形式写入
- ab:以二进制形式追加
- r+、w+、a+:可读可写
编码方式:
- GBK:ASCII字符编码是单字节编码,无法处理汉字。1981年中国提出GB2312的双字节字符编码,又称GB0,共收录6763个汉字,同时兼容ASCII编码,基本满足了汉字的使用需求,但是依然无法满足100%的汉字需求,于是在GB2312的基础上提出了GBK编码,满足了全部汉字的使用需求。GBK不仅收录了27484个汉字,还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,同时GBK也是兼容ASCII编码的,英文字符占用1字符,汉字字符占用2字符。
- Unicode:为了解决全球不同语言的编码问题,统一联盟国际组织提出了Unicode编码,它为世界上每种语言的每一个字符定义了一个唯一的字符码。Unicode的学名是 "Universal Multiple-Octet Coded Character Set",简称UCS,Unicode的两种格式分别是UCS-2和UCS-4,分别占用2个字节和4个字节。Unicode编码使用定长格式,会造成严重的空间浪费,比如原本只占用1个字符的英文字符也需要2个或4个字节长度。
- utf-8:为了避免字符对空间的浪费,出现了Unicode Transformation Format组织,学术名UTF,即对unicode字符转换,以便于在存储和网络通信时节省空间。utf-8是UTF组织提出的 编码格式中应用最为广泛的一种变长的字符编码,可以根据具体情况用1~4个字符来表示一个字符。
- utf-8-sig:在Windows系统上使用open打开utf-8编码的文件时开头会有一个多余的字符BOM(ByteOrder Mark),它是用来声明该文件的编码信息。“utf-8”是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,所以当用“utf-8”编码方式读取带有BOM的文件时,它会把BOM当作是文件内容进行处理,出现报错。“utf-8-sig”编码中的“sig”的全拼是signature,也就是带有签名的utf-8,因此“utf-8-sig”读取带有BOM的“utf-8”文件时会把BOM单独处理,与文本内容隔离开,也就是我们期待的结果。
读写方式一:直接将文件打开,文件操作结束时手动关闭文件
f = open('test.txt', 'w', encoding='gbk')
f.write('hello world\n')
f.close()
f = open('test.txt', 'a', encoding='utf-8')
f.write('窗前明月光\n疑是地上霜\n举头望明月\n低头思故乡\n')
f.close()
f = open('test.txt', 'r', encoding='utf-8-sig')
text = f.read() # 将文本内容全部读出
print(text)
f.close()
读写方式二:使用上下文管理器,文件操作结束时自动关闭文件
with open('test.txt', 'r', encoding='utf-8-sig') as f:
text = f.readlines() # 读取所有行,以列表的方式返回
print(text)
二、txt文件读写
write:字符串写入
with open('test.txt', 'w', encoding='utf-8-sig') as f:
stu_id = 10000
for i in range(100):
stu_name = '张三'
stu_phone = '12345678900'
data = str(stu_id) + ' ' + stu_name + ' ' + stu_phone + '\n'
f.write(data)
stu_id += 1
writelines:字符串序列写入
stu_info_lst = []
with open('test.txt', 'w', encoding='utf-8-sig') as f:
stu_id = 10000
for i in range(100):
stu_name = '张三'
stu_phone = '12345678900'
data = str(stu_id) + ' ' + stu_name + ' ' + stu_phone + '\n'
stu_info_lst.append(data)
stu_id += 1
f.writelines(stu_info_lst)
read:读取全部文本内容
with open('test.txt', 'r', encoding='utf-8-sig') as f:
text = f.read()
print(text)
readlines:按行读取文本内容并存储列表
with open('test.txt', 'r', encoding='utf-8-sig') as f:
text = f.readlines()
for line in text:
print(line, end='')
三、csv文件读写
csv(comma-separated values)是跨多种形式导入导出数据的标准格式,如MySQL、Excel......
csv以纯文本存储数据,文件的每一行就是一条数据,每条数据通过逗号区分字段。
在python的csv模块中,我们可通过reader、writer、DictReader、DictWriter的方式将csv文件作为参数传递给一个读写对象,而reader / writer 和 DictReader / DictWriter 的区别是前者是通过列表或元组格式将数据逐条进行读写,后者是通过字典格式将数据进行读写。
csv文件的读写的每条数据(每行)支持多种类型(整型、浮点型、字符串、时间),每个字段(每列)的格式统一,多个字段通过列表、元组、字典的数据结构打包成一条条数据进行读写,但是数据结构之间不允许嵌套。
reader、writer
import csv
with open('test.csv', 'w', encoding='utf-8-sig', newline='') as f:
write_object = csv.writer(f)
stu_id = 10000
for i in range(100):
stu_name = '张三'
stu_phone = '12345678900'
stu_high = 175.5
data = [stu_id, stu_name, stu_phone, stu_high]
# data = (stu_id, stu_name, stu_phone, stu_high)
write_object.writerow(data)
stu_id += 1
with open('test.csv', 'r', encoding='utf-8-sig') as f:
read_object = csv.reader(f)
for line in read_object:
stu_id = line[0]
stu_name = line[1]
stu_phone = line[2]
stu_high = line[3]
print(stu_id, stu_name, stu_phone, stu_high)
DictReader、DictWriter
import csv
with open('test.csv', 'w', encoding='utf-8-sig', newline='') as f:
headers = ['stu_id', 'stu_name', 'stu_phone', 'stu_high']
write_object = csv.DictWriter(f, headers)
write_object.writeheader() # 写入标题行,定义字典的KEY值
stu_id = 10000
for i in range(100):
stu_name = '张三'
stu_phone = '12345678900'
stu_high = 175.5
data = {
'stu_id': stu_id,
'stu_name': stu_name,
'stu_phone': stu_phone,
'stu_high': stu_high
}
write_object.writerow(data)
stu_id += 1
with open('test.csv', 'r', encoding='utf-8-sig') as f:
read_object = csv.DictReader(f)
for line in read_object:
stu_id = line['stu_id']
stu_name = line['stu_name']
stu_phone = line['stu_phone']
stu_high = line['stu_high']
print(stu_id, stu_name, stu_phone, stu_high)
四、Json文件读写
json字符串:通常类似python数据类型中的列表和字典的结合,也可能是单独的列表或者字典格式,通常可以通过json模块的函数接口转换为python数据类型,也可将python中的数据类型转换成json字符串。
json文件:后端通常将数据库的文件统一以json文件的格式传给前端,而前端在对json文件数据进行加工渲染,展示在前端页面。
很多时候,我们使用爬虫从前端页面获取的数据因为经过了加工渲染而并不完整,所以我们有时候需要通过获取后端的json文件数据包来获取数据。
将python数据转换为json字符串时,json的内部数据是unicode编码,汉字在json字符串中无法显示为中文字符,但是将json字符串做数据提取时,可将unicode编码转化为中文字符。
import json
stu_info_lst = []
for i in range(100):
stu_id = 10000 + i
stu_name = '张三'
stu_phone = '12345678900'
data = {
'stu_id': stu_id,
'stu_name': stu_name,
'stu_phone': stu_phone
}
stu_info_lst.append(data)
# 数据为一行写入json文件
with open('stu_info1.json', 'w', encoding='utf-8-sig') as f:
json.dump(stu_info_lst, f)
# 数据分行写入json文件
with open('stu_info2.json', 'w', encoding='gbk') as f:
json.dump(stu_info_lst, f, indent=4)
# python数据类型和json字符串之间的相互转换
json_text = json.dumps(stu_info_lst)
python_text = json.loads(json_text)
for i in python_text:
s_id = i['stu_id']
s_name = i['stu_name']
s_phone= i['stu_phone']
print(s_id, s_name, s_phone)