json和txt文件的读取和json文件与字典之间的格式读取转换
一. 读取txt文件
with open('filename.txt','r',encoding='utf-8') as f:
data = f.readlines()
这样会将filename.txt
文件中的内容以列表的形式读入到data
中,每一行数据为一个元素。
二. 将字典写入到json文件
import json
dict_data = {}
with open('filename.json','w',encoding='utf-8') as f:
f.write(json.dumps(dict_data,indent=4,ensure_ascii=False))
这样的话会将字典dict_data
写入filename.json
文件。
indent=4
代表按格式缩进4个空格ensure_ascii=False
对于非ascii字符不采用ascii编码,可以处理中文乱码问题
栗子
1. 字典数据
import json
dict_data = {
'English_name':'Jack',
'Chinese_name':'接客',
'age':18
}
with open('test.json','w',encoding='utf-8') as f:
f.write(json.dumps(dict_data,indent=4,ensure_ascii=False))
运行之后json
文件为:
{
"English_name": "Jack",
"Chinese_name": "接客",
"age": 18
}
2. 字典列表数据
当然dict_data
也可以是字典列表,也就是说dict_data
本身是一个列表,其中的每一个元素是一个字典。如:
dict_data = [
{
'English_name':'Jack',
'Chinese_name':'接客',
'age':18
},
{
'English_name':'John',
'Chinese_name':'约汉',
'age':20
}
]
其他写入文件的代码不变,运行之后保存的json文件结构为:
[
{
"English_name": "Jack",
"Chinese_name": "接客",
"age": 18
},
{
"English_name": "John",
"Chinese_name": "约汉",
"age": 20
}
]
3. 单行字典数据
有的时候会有这样的要求:存到json文件里的数据,每一条数据只占一行。
为了满足这个要求,只需要去掉json.dumps()
函数中的indent=4
即可。代码如下:
dict_data = {
'English_name':'Jack',
'Chinese_name':'接客',
'age':18
}
with open('test.json','w',encoding='utf-8') as f:
f.write(json.dumps(dict_data,ensure_ascii=False)+'\n')#最好加一个换行
注意:这大多用在每次都插入一条字典数据的情况,这样的话可以让每一条字典数据占一行。如:
dict_data = [
{
'English_name':'Jack',
'Chinese_name':'接客',
'age':18
},
{
'English_name':'John',
'Chinese_name':'约汉',
'age':20
}
]
with open('test.json','w',encoding='utf-8') as f:
for data in dict_data:
f.write(json.dumps(data,ensure_ascii=False)+'\n')
效果为:
{"English_name": "Jack", "Chinese_name": "接客", "age": 18}
{"English_name": "John", "Chinese_name": "约汉", "age": 20}
每条数据占一行。(其实在做爬虫的时候经常采用这种方式,因为你每爬到一条数据就要将它存到json文件中,如果你想要全部爬完数据再存的话,万一爬虫程序中间突然异常退出,你爬的数据就莫得了~~)
三. json文件的读取
- 如果采用:
f.write(json.dumps(data,ensure_ascii=False)+'\n')
的方式保存的json文件,格式如下:
{"English_name": "Jack", "Chinese_name": "接客", "age": 18}
{"English_name": "John", "Chinese_name": "约汉", "age": 20}
读取这样的json文件的话,很明显每一行是一条数据,也就是一个字典,那么就可以按行读并用json.loads()
来处理,代码如下:
with open('test.json','r',encoding='utf-8') as f:
for line in f:
data.append(json.loads(line.strip()))
得到的结果data是一个列表,每一个元素是一个字典。
- 如果利用结构化方法存储json文件,即如下结构的json文件:
[
{
"English_name": "Jack",
"Chinese_name": "接客",
"age": 18
},
{
"English_name": "John",
"Chinese_name": "约汉",
"age": 20
}
]
那么读取该json文件可以更直接,不能按行处理了,代码如下:
with open('test.json','r',encoding='utf-8') as f:
data = json.loads(f.read())
同样,得到的结果data是一个列表,每一个元素一个字典。