郭炜老师mooc第八章读写文件(python操作数据库)

 

目录

读写文件

文本文件读写概述

创建文件并写入内容:

读取现有文件:

文本文件的编码

try - except:如果要读取的文件不存在会引发异常:

 添加文件内容:

文件路径:

相对文件路径:

 绝对路径

文件夹操作:

OS模块

使用命令行窗口(终端)运行python程序

 命令行参数:

用python来操作数据库

 建立数据库,新建表,插入:

select查询 

 修改查询:

设置blob字段(二进制字段) (picture)的值

设置blob字段(二进制字段) (picture)的值:

 读取blob字段(二进制字段)的值,;另存在.jpg格式在桌面上

 另存结果:


读写文件

文本文件读写概述

  • open函数打开文件,将返回值放入一个变量,例如 f
  • f.write函数写入文件
  • f.readlines()函数读取全部文件内容
  • f.readline()函数读取文件一行
  • f.close()函数关闭文件
  • f.read()读取全部文件内容。返回一个字符串,包含文件全部内容

 文件打开模式

  • "r" : 文本文件读
  • "rb": 二进制文件读
  • "w" :文本文件写
  • "wb" :二进制文件写
  • "r+": 文本文件既读又写
  • "rb+": 二进制文件既读又写

创建文件并写入内容:

  • 以写方式打开文件时,如果原本不存在该文件,会根据您的指定路径新建一个文件,反之打开原本存在的文件,"w"表示写入,用此种方式打开文件,若文件本来存在,就会被覆盖
# 创建文件并写入内容:

a = open("D:\\桌面\\t.txt","w")
# 以写方式打开文件时,如果原本不存在该文件,会根据您的指定路径新建一个文件,反之打开原本存在的文件
#"w"表示写入,用此种方式打开文件,若文件本来存在,就会被覆盖
a.write("good\n")
a.write("好啊\n")
a.close()

读取现有文件:

# 读取现有文件:

f = open("D:\\桌面\\t.txt", "r") #"r"表示读取
lines = f.readlines() #每一行都带结尾的换行符"\n"
f.close() #lines是个字符串列表,每个元素是一行
for x in lines:
    print(x,end="")

文本文件的编码

常见编码有 gbk和utf-8两种。打开文件时如果编码不对,则不能正确读取文件.
ANSI对应 gbk写入文件时,如果不指定编码,则用操作系统的缺省编码Windows: gbk,可能
从win10开始是 utf-8;
Linux,MacOs: utf-8

# 读取现有文件:

#不用readlines也行
f = open("D:\\桌面\\t.txt", "r", encoding="gbk")
for x in f:
    print(x,end="")
    
f.close()

 

#使用utf-8提示错误,说明我的操作系统的缺省编码Windows: gbk编码

try - except:如果要读取的文件不存在会引发异常:

# 如果要读取的文件不存在会引发异常:

def read_file():
    path = input("请输入文件路径:")
    try:
        f = open(path,"r")
    #若文件不存在,会产生异常,跳到 except后面执行
        lines = f.readlines()
        f.close()
        for x in lines:
            print(x,end="")
    except Exception as e:
        print(e) #打印错误信息
    
read_file()

 添加文件内容:

# 添加文件内容:

f = open("D:\\桌面\\t.txt","a")
#"a"要打开文件添加内容。若文件本来不存在,就创建文件
f.write("新增行\n")
f.write("ok\n")
f.close()

文件路径:

相对文件路径:

 

程序运行时,会有一个“当前文件夹”,open打开文件时,如果文件名不是绝对路径形式,则都是相对于当前文件夹的。
一般情况下,.py文件所在的文件夹,就是程序运行时的当前文件夹。在Pycharm和jupyter里面运行程序,就是如此。

 

 

 绝对路径

绝对路径形式: 文件名包含盘符
open("d:/tmp/test/readme.txt" ,"r")

文件夹操作:

OS模块

[我写的另外一个OS模块博客链接]
OS模块常用函数-CSDN博客
 

使用命令行窗口(终端)运行python程序

每次运行Python程序,都要从Pycharm里运行,显然不方便。
因此有时需要以命令行方式(命令脚本方式)运行python程序
具体做法:
在命令行窗口(mac叫“终端”)敲:

  • python xxx.py

就能运行xxx.py

 

 命令行参数:

sys.argv[]是一个列表
sys.argv[0]是被调用的脚本文件名或全路径
sys.argv[1:]之后的元素就是我们从程序外部输入的,而非代码本身的,想要看到它的效果,就要将程序保存,从外部运行程序并给参数,这也是我们在cmd里面运行的原因。

“sys” 是 “system”,是一个系统模块,该模块提供了一些接口,用户访问python解释器自身使用和维护的变量,同时模块中还提供了一些函数,而 argv 就是其中一个函数。

“argv” 即 “argument value” 是一个列表对象,其中存储的是在命令行调用 python 脚本是提供的 “命令行参数”。

参考文章:Python 中 sys.argv 用法详解-CSDN博客

命令行参数.py 源文件:

import sys

for x in sys.argv:
    print(x)

print("sys.argv[0]", sys.argv[0])


 在命令行窗口输入以下命令:

python "E:\python_projects\读写文件\命令行参数.py" this is 命令行参数

输出结果:

C:\Users\DELL>python "E:\python_projects\读写文件\命令行参数.py" this is 命令行参数
E:\python_projects\读写文件\命令行参数.py
this
is
命令行参数
sys.argv[0] E:\python_projects\读写文件\命令行参数.py

 

用python来操作数据库

 建立数据库,新建表,插入:

  • SQLite是C库,提供一个基于磁盘的轻量级的数据库,允许使用非标准的SQL查询语言访问数据库,不需要一个单独的服务进程。一些程序可以使用SQLite作为内部数据存储。
  • commit()方法提交当前的事务。如果没有调用commit()方法,数据库的操作对于其他数据库连接不可见。
  • close()方法用于关闭数据库连接,close()方法不会自动调用commit()方法提交。
# 建立数据库,新建表,插入:

import sqlite3
db = sqlite3.connect("E:\jupyter_projects\python_projects\DataBase\stu.db") #连接数据库,若不存在则自动创建
cur = db.cursor() #获取光标,要操作数据库一般要通过光标进行

sql = "DROP TABLE IF EXISTS students"
cur.execute(sql)
db.commit()

sql = '''CREATE TABLE if not exists students (id integer primary key,
name text, gpa real, birthday date, age integer, picture blob)''' #如果表 students 不存在就创建它
cur.execute(sql) #执行SQL命令

sql = '''select 1600, '张三', 3.81, '2000-09-12', 18,null from students 
            where not exists (select * from students where id = 1600)''' 
cur.execute('''select 1600, '张三', 3.81, '2000-09-12', 18,null from students 
            where not exists (select * from students where id = 1600)''') #插入一个记录
x = cur.fetchone()
print(x)

# cur.execute('''insert into students (id, name, gpa, birthday, age, picture) ( select 1600, '张三', 3.81, '2000-09-12', 18,null from students 
#             where not exists (select * from students where id = 1600))''') #插入一个记录

cur.execute("insert into students values(1600, '张三', 3.81, '2000-09-12', 18,null)") #插入一个记录
mylist = [(1700, '李四', "3.25", "2001-12-01", 17, None),
          (1800, '王五', "3.35",'1999-01-01',19, None)]

for s in mylist: #依次插入mylist中的每个记录
    cur.execute('INSERT INTO students VALUES(?,?,?,?,?,?)',(s[0], s[1], s[2],s[3],s[4],s[5])) # ?对应于后面某项

db.commit() #真正写入,写入操作都需要这个
cur.close() #关闭光标
db.close() #关闭数据库

select查询 

# select查询

import sqlite3
db = sqlite3.connect("E:\jupyter_projects\python_projects\DataBase\stu.db")
cur = db.cursor()

sql = "select 8, 'wang' from students where true"
cur.execute(sql)
x = cur.fetchone()
print(x)

sql = 'select * from students'
cur.execute(sql)
x = cur.fetchone()
print(x)
print(x[1])

# 首先fetchone()函数它的返回值是单个的元组,也就是一行记录,如果没有结果,那就会返回null
# 其次是fetchall()函数,它的返回值是多个元组,即返回多个行记录,如果没有结果,返回的是()

for ele in cur.fetchall():
    print(ele[:-2])
cur.execute("select * from students where name = 'Jack'")
x = cur.fetchone()
if x == None:
    print("cann't find Jack")
    
db.commit()
cur.close()
db.close()

 修改查询:

# 修改查询:

import sqlite3
db = sqlite3.connect("E:\jupyter_projects\python_projects\DataBase\stu.db")
cur = db.cursor()

sql = 'select * from students'
cur.execute(sql)
for ele in cur.fetchall():
    print(ele[:-2])
    
sql = 'UPDATE students SET gpa = ?, age = ? WHERE name = ?'
cur.execute(sql,(4.0, 20, '李四')) #元组三个元素分别对应三个 ?
#修改 李四 的gpa和年龄 。若李四不存在,则无效果

sql = 'select * from students'
cur.execute(sql)
for ele in cur.fetchall():
    print(ele[:-2])
    
db.commit()
cur.close()
db.close()

注意:

  • 对于修改表的操作,如插入,删除,更新,关闭数据库前不要忘了 commit,否则可能无效
  • 必要时用 try...except语句来避免数据库不存在,表不存在时的导致的 runtime error

设置blob字段(二进制字段) (picture)的值

先将图片二进制写入数据库中,在对数据库进行查询,将图片二进制另存为.jpg格式,这样就可以查看图片了。

设置blob字段(二进制字段) (picture)的值:


requests之stream分析:
当stream=True时,后边需要自己执行Response.close0操作进行关闭结束,否则只有所有的响应体数据被读取完毕连接才会被释放,
用with即可以不用close()。

当stream=True时,如果是下载大的文件时,用True,可以先对请求的类型进行判断,如果是大文件,可以中止请求,而不用浪费大流量开销。

当stream:=False时,如果是请求的大文件,其当其会进入内存并进行下载,消费大量的内存和流量。

# 设置blob字段(二进制字段)的值:

import sqlite3
import requests
f = open("E:\\jupyter_projects\\python_projects\\图片\\小猫\\6.jpg", 'rb') #二进制方式打开图片
img = f.read()
f.close()
db = sqlite3.connect("E:\jupyter_projects\python_projects\DataBase\stu.db")
cur = db.cursor()
sql = "UPDATE students SET picture=? WHERE name = '李四'"
cur.execute(sql,(img,)) #设置李四的照片。 img对应于 ?

imgUrl ="https://pic.dmjnb.com/pic/1acd0011f2666adf28f97f6f609bee47" #从网络获取图片
imgStream = requests.get(imgUrl,stream=True)
"""
requests之stream分析:
当stream=True时,后边需要自己执行Response.close0操作进行关闭结束,否则只有所有的响应体数据被读取完毕连接才会被释放,
用with即可以不用close()。

当stream=True时,如果是下载大的文件时,用True,可以先对请求的类型进行判断,如果是大文件,可以中止请求,而不用浪费大流量开销。

当stream:=False时,如果是请求的大文件,其当其会进入内存并进行下载,消费大量的内存和流量。
"""
sql = "UPDATE students SET picture=? WHERE name = '张三'"
cur.execute(sql,(imgStream.content,)) #设置张三的照片。
#imgStream.content 对应于 ?

db.commit()
cur.close()
db.close()

 读取blob字段(二进制字段)的值,;另存在.jpg格式在桌面上

# 读取blob字段(二进制字段)的值:

import sqlite3
import requests
db = sqlite3.connect("E:\jupyter_projects\python_projects\DataBase\stu.db")
cur = db.cursor()
sql = "select name,picture from students WHERE name = '张三' or name= '李四'"
cur.execute(sql)
x = cur.fetchall()
for r in x: # r[0]是姓名,r[1]是图片文件数据
    f = open("D:\\桌面\\" + r[0] + ".jpg","wb") #照片写入 张三.jpg和李四.jpg
    f.write(r[1])
    f.close()
cur.close()
db.close()

 另存结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值