本文最后更新于 1411 天前,其中的信息可能已经有所发展或是发生改变。
# 多行输出结果
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
1. TXT文本存储
open():
- 参数1是操作的文件,
- 参数2是打开方式,打开方式主要包括:
r
,w
,a
以及其后可追加的+
,b
:r
,w
方式文件指针在文件头,而a
追加方式打开文件指针在文件尾+
表示赋予完整的读写权限b
表示以二进制方式读写文件
- 参数3是文件编码方式。
1.1 方法一
question = '银河系中心的超大黑洞怎么形成的?'
author = 'Berg'
file = open('test_txt.txt', 'w', encoding='utf-8')
file.write('\n'.join(['问题: ' + question, '作者: ' + author]))
file.write('\n' + '=' * 50 + '\n')
file.close()
1.2 with语句
(依赖上下文管理器,实质是调用了__enter__()
和__exit__()
)
question = '银河系中心的超大黑洞怎么形成的?'
author = 'Berg'
with open('test_txt.txt', 'a', encoding='utf-8') as file:
file.write('\n'.join(['问题: ' + question, '作者: ' + author]))
file.write('\n' + '=' * 50 + '\n')
1.3 读取txt
关于下面例子中使用的 list
的 extend
和 append
方法的区别:
extend
: a.extend(b),会把 b 中所有元素依次加入 aappend
: a.extend(b),会把 b 作为一个整体加入 a,也就列表嵌套列表
str
的 split
方法见 python-字符串
users_info = []
with open('Quantum mechanics.txt', 'r', encoding='utf-8') as file:
lines = file.readlines() # 创建包含文件各行内容的列表
print(type(lines),len(lines))
for line in lines:
line = line.rstrip()
line = line.split('; ')
user_info = line[0].split(':')
user_info.extend(line[1:])
users_info.append(user_info)
for user in users_info:
print(len(user), user)
<class 'list'> 9
5 ['Planck', 'Max Karl Ernst Ludwig Planck', '1858', 'The Planck–Einstein relation', 'Germany']
5 ['Dirac', 'Paul Adrien Maurice Dirac', '1902', 'Dirac equation', 'UK']
5 ['Bohr', 'Niels Henrik David Bohr', '1885', 'Bohr model', 'Denmark']
5 ['Faraday', 'Michael Faraday', '1791', 'Electromagnetic induction', 'UK']
5 ['Lorentz', 'Hendrik Antoon Lorentz', '1853', 'Lorentz force', 'Netherlands']
5 ['Feynman', 'Richard Phillips Feynman', '1988', 'Feynman diagrams, Feynman rules', 'US']
5 ['Einstein', 'Albert Einstein', '1879', 'Photoelectric Effect, Mass–energy equivalence, Special relativity, General relativity', 'US']
5 ['Heisenberg', 'Werner Heisenberg', '1901', 'Uncertainty principle', 'Germany']
5 ['Schrödinger', 'Erwin Rudolf Josef Alexander Schrödinger', '1887', "Schrödinger equation, Schrödinger's cat", 'Austria']
2. JSON文件
全称: JavaScript Object Notation, JavaScript对象标记。以对象和数组的组合来表示数据,
任何支持的类型都可以通过 Json 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种组合类型。
- 对象,对象在 JavaScript 中是使用花括号 {} 包裹起来的内容,数据结构为 {key1:value1, key2:value2, …} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。注意的是:json 中 key 不能是单引号,只能用双引号。在实际使用时,使用
json.dumps()
可以将对象转化为合法的 json 字符串对象,这时不需要考虑引号问题。 - 数组,数组在 JavaScript 中是方括号 [] 包裹起来的内容,数据结构为 [“java”, “javascript”, “vb”, …] 的索引结构。在 JavaScript 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。
2.1 输出json
- 调用 dumps() 方法来将对象转化为合法的 json 字符串对象
import json
# 对象数据
data_object = {
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
}
# 列表与对象嵌套
data_list = [{
'name': 'Pauil'}, {
'name': 'Planck'}, {
'name': 'Dirac'}, {
'name': 'Bohr'},{
'name': 'Faraday'}, {
'name': 'Lorenz'}, {
'name': 'Feynman'}, {
'name': 'Heisenberg'
}]
# 注意: 下面两个不同的结构(一个是对象,一个是列表)不推荐直接追加到一个文件,否则会打乱json的结构,后续读取等等带来麻烦。
with open('test_json1.json', 'w') as file:
file.write(json.dumps(data_list))
with open('test_json1.json', 'a') as file:
file.write(json.dumps(data_list))
# 解决上面问题的办法是: 1. 不同结构写到不同文件里 2. 整理结构,使其完美,见下面代码
data_list.append(data_object) # 将上面单个对象数据整合到列表中,再写入到文件
dumps参数:
indent
缩进值ensure_ascii=False
规定文件输出的编码, 显示中文,要与open()
的encoding='utf-8'
一起使用,否则编辑器无法显示中文或者打开出错)
import json
data_object = {
'name': '达文西',
'gender': 'male',
'birthday': '1992年10月18日'
}
with open('test_json1.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(data_object, indent=2, ensure_ascii=False))
2.2 读取json
- 使用 loads() 方法将 json 字符串对象转为对象
import json
strs = '''
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
}, {
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]
'''
print(type(strs))
data = json.loads(strs)
print(data)
print(type(data))
<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
<class 'list'>
原 strs 内包裹的数据是列表内嵌字典,json.loads()
后会把 json 字符串转为对象,也就是还原成 Python 的数据类型列表内嵌字典。
如果我们是从 Json 文本中读取内容,例如在这里有一个data.json 文本文件,其内容是刚才我们所定义的 Json 字符串。
我们可以先将文本文件内容读出,然后再利用 loads() 方法转化。
import json
with open('test_json.json', 'r') as file:
txt = file.read()
data = json.loads(txt)
print(data)
[{'NAME': 'Planck', 'FULL NAME': 'Max Karl Ernst Ludwig Planck', 'BIRTH': '1858', 'KNOWN FOR': 'The Planck–Einstein relation', 'NATIONALITY': 'Germany'}, {'NAME': 'Dirac', 'FULL NAME': 'Paul Adrien Maurice Dirac', 'BIRTH': '1902', 'KNOWN FOR': 'Dirac equation', 'NATIONALITY': 'UK'}, {'NAME': 'Bohr', 'FULL NAME': 'Niels Henrik David Bohr', 'BIRTH': '1885', 'KNOWN FOR': 'Bohr model', 'NATIONALITY': 'Denmark'}, {'NAME': 'Faraday', 'FULL NAME': 'Michael Faraday', 'BIRTH': '1791', 'KNOWN FOR': 'Electromagnetic induction', 'NATIONALITY': 'UK'}, {'NAME': 'Lorentz', 'FULL NAME': 'Hendrik Antoon Lorentz', 'BIRTH': '1853', 'KNOWN FOR': 'Lorentz force', 'NATIONALITY': 'Netherlands'}, {'NAME': 'Feynman', 'FULL NAME': 'Richard Phillips Feynman', 'BIRTH': '1988', 'KNOWN FOR': 'Feynman diagrams, Feynman rules', 'NATIONALITY': 'US'}, {'NAME': 'Einstein', 'FULL NAME': 'Albert Einstein', 'BIRTH': '1879', 'KNOWN FOR': 'Photoelectric Effect, Mass–energy equivalence, Special relativity, General relativity', 'NATIONALITY': 'US'}, {'NAME': 'Heisenberg', 'FULL NAME': 'Werner Heisenberg', 'BIRTH': '1901', 'KNOWN FOR': 'Uncertainty principle', 'NATIONALITY': 'Germany'}, {'NAME': 'Schrödinger', 'FULL NAME': 'Erwin Rudolf Josef Alexander Schrödinger', 'BIRTH': '1887', 'KNOWN FOR': "Schrödinger equation, Schrödinger's cat", 'NATIONALITY': 'Austria'}]
txt与json读取综合例子
例子的文件见评论区。
import json
users_info = []
with open('Quantum_mechanics.txt', 'r', encoding='utf-8') as file:
lines = file.readlines() # 创建包含文件各行内容的列表
for line in lines:
line = line.rstrip()
line = line.split('; ')
user_info = line[0].split(':')
user_info.extend(line[1:])
users_info.append(user_info)
# 列表与对象嵌套
data_list = []
for user in users_info:
data = {
'NAME': user[0],
'FULL NAME': user[1],
'BIRTH': int(user[2]),
'KNOWN FOR': user[3],
'NATIONALITY': user[4]
}
data_list.append(data)
with open('test_json.json', 'w', encoding='utf-8') as file:
# file.write(json.dumps(data_list, indent=2, ensure_ascii=False))
file.write(json.dumps(data_list, indent=2))
服务很到位
点击下载例子中的txt