python文件读写-txt, json

  • 2018-09-17
  • 777
  • 3
# 多行输出结果
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

1. TXT文本存储

open():

  1. 参数1是操作的文件,
  2. 参数2是打开方式,打开方式主要包括: r, w, a 以及其后可追加的 +, b:
    • r, w 方式文件指针在文件头,而 a 追加方式打开文件指针在文件尾
    • + 表示赋予完整的读写权限
    • b 表示以二进制方式读写文件
  3. 参数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

关于下面例子中使用的 listextendappend 方法的区别:

  • extend: a.extend(b),会把 b 中所有元素依次加入 a
  • append: a.extend(b),会把 b 作为一个整体加入 a,也就列表嵌套列表

strsplit 方法见 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参数:

  1. indent缩进值
  2. 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))

版权声明: 本网站所有资源采用BY-NC-SA 4.0协议进行授权,转载应当以相同方式注明文章来自:python文件读写-txt, json - 一方的天地

评论

发表评论

陕ICP备18010914号
知识共享许可协议
本作品由一方天地采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资源请尽快联系站长,本站会在24h内删除有争议的资源。 -