Python文件和流

读文件和写文件

使用open()函数

打开文件: r w r+ w+

  1. r : 读文件
  2. w : 写文件
  3. r+ : 文件可读写,但是如果文件不存在,会抛出异常;存在的话,则是追加。通过seek函数可以改变当前的位置。
  4. w+ : 如果文件不存在,会创建一个新文件,文件存在的话,会覆盖原文件,也就是清空原来文件,写入新内容。
  5. a+ : 如果文件不存在,创建;存在的话,追加内容。

操作文件的函数:

  1. write(string):向文件写入内容,会返回写入文件的字节数。
  2. read([n]) :读取文件的内容,n是一个整数,表示从文件指针指定的位置开始读取的n个字节。如果不指定n,则从当前位置往后读取所有的字节。
  3. seek(n):重新设置文件指针,也就是改变文件当前位置。如果使用write函数需要使用seek(0)重置指针。
  4. close() : 关闭文件。

r写模式打开test.txt文件

1
2
3
4
f = open('test.txt','w')
print(f.write("阿福"))
print(f.write("真帅"))
f.close()

w读模式打开test.txt文件

1
2
3
4
f = open('test.txt','r')
print(f.read(2)) #注意文件位置到了"福"
print(f.read(1)) #这里是"真"
f.close()

r+打开一个不存在的文件

1
2
3
4
try:
f = open('afu.txt','r+')
except Exception as e:
print(e)

w+打开一个不存在的文件

1
2
3
4
5
6
7
8
try:
f = open('test.txt','w+')
print(f.read())
f.write('阿福之前的内容不见了!')
f.seek(0)
print(f.read())
finally:
f.close()

管道输出

什么是管道?即前一个命令的输出会作为下一个命令的输入。用|

Linux和mac有管道,windows没有。

1
2
3
4
5
6
7
8
9
10
11
12
import sys
import os
import re

# 从标准输入读取全部数据
text = sys.stdin.read()

files = text.split(os.linesep)
for file in files:
result = re.match('.*readme.*',file) #用到了正则表达式
if result != None:
print(file)

读行和写行

读行readline()

1
2
3
4
5
6
7
8
9
10
f = open('test.txt','r')
res = ''
while True:
res = f.readline()
res = res.rstrip() #去除一些空格

if res == '':
break;
else:
print(res)

写行

利用f.write('内容'+ os.linesep)

1
2
3
4
import os

f = open('test.txt','r+')
f.write('小璇今天很开心'+os.linesep)

使用FileInput对象读取文件

1
2
3
4
5
6
7
8
9
10
11
12
import fileinput

file_obj = fileinput.input('test.txt')
print(file_obj.readline().rstrip()) #读一行

for line in file_obj: # 读多行
line = line.rstrip()
if line != '':
print(file_obj.lineno(),':',line)
else:
print(file_obj.filename())

数据存储

XML

将字典转换为XML字符串

  1. 导入模块
1
2
import dicttoxml
from xml.dom.minidom import parseString
  1. 定义一个字典
1
2
3
4
d = [20,'names',{'name':"阿福",'age':20,'爱好':'旅游'},
{'name':"小璇",'age':18,'爱好':'电影'},
{'name':"道坤",'age':21,'爱好':'摆烂'}
]
  1. 将字典转换成XML格式(bytes形式)
1
2
3
4
bxml = dicttoxml.dicttoxml(d,custom_root='p')
#print(bxml)
xml = bxml.decode('utf-8') #有中文,所以把编码改成utf-8
print(xml)

如果你出现了以下错误,那么不要害怕

image-20220701184005936

估计你的python也是3.10,把python的版本换成3.9就可以解决。

折腾了我一下午,真是….

  1. 解析xml字符串

    1
    2
    3
    4
    dom = parseString(xml) #xml现在太乱了,所以解析xml字符串

    prettyxml = dom.toprettyxml(indent = ' ') #设置缩进,美观
    print(prettyxml)
  2. 写入文件

    1
    2
    3
    4
    5
    import os
    os.makedirs("files",exist_ok = True) #创建一个files文件夹,如果存在file文件夹就忽略
    f = open('files/persons.xml','w',encoding='utf-8')
    f.write(prettyxml)
    f.close()

读取与检索XML文件

首先,导入相关的库

1
import xml.etree.ElemenTree import parse

接着找到文件位置

1
doc  = parse('files/afu.xml')

读取

1
2
3
4
5
6
7
8
9
10
from xml.etree.ElementTree import parse

doc = parse('files/afu.xml')
for item in doc.iterfind('files/afu.xml'):
# 读取所有id节点的值
id_val = item.findtext('class')
# 读取name节点的值
name = item.findtext('div')
# 读取price节点的值
price = item.findtext('price')

XML字符串转换成字典

先导入库import xmltodict

打开文件并解析

美观

1
2
3
4
5
6
7
8
9
10
11
12
import xmltodict

# 打开文件并解析
f = open('files/persons.xml','rt',encoding='utf-8')
xml = f.read()
d = xmltodict.parse(xml) # 解析xml文件
#print(d)

# 美观一下
import pprint
nice = pprint.PrettyPrinter(indent=4) # 设置一下缩进
nice.pprint(d)

JSON

JSON转换成字典

  1. 使用eval函数将json字符串转换成为字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建字典
#json文件的缩进很严格,请注意操练时的缩进问题
target = '''
{
"语文":111,
"数学":110,
"英语":109
}
'''

# 使用eval函数将json字符串转换为字典
data = eval(target)
print(type(data)) # 查看data的类型
print(data)
  1. 使用json.loads()

    注意python文件不要命名成json.py !

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 创建字典
    import json
    target = '''
    {
    "语文":111,
    "数学":110,
    "英语":109
    }
    '''

    # 使用json.loads()将json字符串转换为字典
    data = json.loads(target)
    print(type(data)) # 查看data的类型
    print(data)

字典转换成JSON

使用json.dumps()

1
2
3
4
5
6
7
8
9
10
11
12
import json # 导入库
person = {
'小璇':'江西抚州',
'道坤':'江西九江',
'小熙':'江西抚州',
'小岚':'江西赣州',
'小彭':'江西上饶'
}

data = json.dumps(person)
print(type(data)) # 查看data的类型
print(data)

JSON转换成类实例(对象)

方法:利用loads函数的object_hook关键字参数指定一个类或者一个回调函数。

先创建一个json文件(我的文件名是person.json)

image-20220702010414108

  1. 指定一个类
1
2
3
4
5
6
7
8
9
10
11
12
13
import json # 导入库

# 指定一个类
class Person:
def __init__(self,d):
self.__dict__ = d

f = open('person.json','r')
read_data = f.read()
to_person1 = json.loads(read_data,object_hook=Person) # 使用json.loads()
print(type(to_person1))
print("name=",to_person1.name)
print("age=",to_person1.age)
  1. 使用回调函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import json # 导入库

class Person:
def __init__(self,d):
self.__dict__ = d

# 回调函数
def json_person(d):
return Person(d)

f = open('person.json','r')
read_data = f.read()
to_person2 = json.loads(read_data,object_hook=json_person) # object_hook参数改成回调函数
print(type(to_person2))
print("name=",to_person2.name)
print("age=",to_person2.age)

将类实例转换成JSON字符串

解决方案:利用dumps(将字典转换成字符串)

default关键字参数指定一个回调函数,这个回调函数会接收一个类实例

回调函数需要返回一个字典,最后,dumps函数会将字典转换成JSON字符串

过程为: object –> dict –> JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import json # 导入库

class Person:
def __init__(self,name,age):
self.name = name
self.age = age

# 回调函数
def Person_to_dict(obj):
return {
'name':obj.name,
'age':obj.age
}

P1 = Person('阿福',20)
json_P1 = json.dumps(P1,default=Person_to_dict,ensure_ascii=False) # 不使用ascii码
print(json_P1)

类实例列表与JSON字符串的转换

创建一个json文件

image-20220704083340552

  1. json文件转换成类实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import json # 导入库

class Person:
def __init__(self,d):
self.__dict__ = d

f = open('person.json','r',encoding= 'utf-8')
jsonStr = f.read()

persons_to_list = json.loads(jsonStr,object_hook=Person)
print(type(persons_to_list))
for P in persons_to_list:
print('name = ',P.name)
print('age = ',P.age)
print('sex = ', P.sex)
print('addr = ', P.addr)
  1. 类实例转换成json文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import json # 导入库

    class Person:
    def __init__(self,d):
    self.__dict__ = d

    f = open('person.json','r',encoding= 'utf-8')
    jsonStr = f.read()

    persons_to_list = json.loads(jsonStr,object_hook=Person)
    print(type(persons_to_list))
    for P in persons_to_list:
    print('name = ',P.name)
    print('age = ',P.age)
    print('sex = ', P.sex)
    print('addr = ', P.addr)

    # 逆过程
    def person_json(P):
    return {
    'name': P.name,
    'age':P.age,
    'sex':P.sex,
    'addr':P.addr
    }

    jsonStr = json.dumps(persons_to_list,default=person_json,ensure_ascii=False)
    print(jsonStr)

JSON转换成XML字符串

过程: json --> dict --> xml

1
2
3
4
5
6
7
8
9
10
import json # 导入库
import dicttoxml
f = open('../person.json','r',encoding='utf-8')
jsonStr = f.read()

d = json.loads(jsonStr) # 先转换成字典
print(d)
xmlStr = dicttoxml.dicttoxml(d).decode('utf-8')
print(xmlStr)
f.close()

我的json文件

image-20220704115559353

注意:json文件不要和对应的.py文件同在一个文件夹,不然会出问题,同时也建议本篇的博客都使用python3.9操作。

SQLite

未完待续

MySQL

未完待续

ORM

未完待续

非关系型数据库(NoSQL)(MongoDB)

未完待续