文件存储 + Python操作MySQL数据库

 TXT存储

r:以只读方式打开文件。
rb:以二进制只读方式打开文件。
w:以写入方式打开文件。若该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
wb:以二进制写入方式打开文件。若该文件已存在,则将其覆盖。如果该文件不存在,则创建新文件。
a:以追加方式打开文件。若该文件已存在,文件指针将会放在文件结尾。也就是说,新的内容将会被写到已有内容后。如果该文件不存在,则创建新的文件来写入。
ab:以二进制追加方式打开文件。如果该文件已存在,则文件指针将会放在文件结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,则创建新文件来写入。

r+(读写)/rb+(二进制读写)  

 w+(写读。打开创建新文件并写入数据,如果文件已存在,则覆盖写)/wb+     

a+(追加读写。打开文件方式与写入方式和'a'一样,但是可以读)/ab+

注释:若刚用‘a+’打开一个文件,一般不能直接读取,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置

创建新文件并写入一些内容,

运行结果如下:

读取文件中的内容

以另外一种方式读取文件,最后一句的含义,是输入文件类型,最后返回str字符串类型

下面这个以数组方式读,,当把readlines改成readline即只读出第一行

 

CSV存储

CSV和excel的区别:
1.CSV是纯文本文件,excel不是纯文本,excel包含很多格式信息在里面。
2.CSV文件的体积会更小,创建分发读取更加方便,适合存放结构化信息

比如一些数据在Excel表中和csv表中看起来是相同的,但是以记事本的方式打开,左图是csv的效果,而Excel打开则是一堆乱码。。

csv与TXT也有一种不同是要先导入,否则无法运行,

单行写入/多行写入:

看到下面的结果可能会觉得输入出来的信息不太美观,中间有空行,,

在写入后面加上newline=‘ ’,能有效避免这种情况。。

读取csv文件内容,能够有效的读取,,

字典式的写入

 

先定义3个字段,用fieldnames表示,然后将其传给DictWriter来初始化一个字典写入对象,接着可以调用writeheader()方法先写入头信息,然后再调用writerow()方法传入相应字典

进程线程协程

进程:系统正在执行的程序,在一个进程中有多个线程,但是一个线程只能属于一个进程

能够声明对象创建多线程,

创建类时需要继承threading.Thread父类,并重写__init__方法和run方法:
通过调用函数创建
threading.Thread(target=‘调用的函数名’, args=(调用函数的参数, ))
注释:如果函数只有一个参数,则需要在参数后面加逗号(,)

协程:又称微线程,线程是系统级别的,它们由操作系统调度,而协程则是程序级别的,由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程中可以中断去执行别的子程序,而别的子程序也可以中断回来继续执行之前的子程序,这个过程就称为协程

上面这些线程进程协程的内容有点不太懂,下去还要多了解了解。。

Python操作MySQL数据库

先导入:

import pymysql
连接数据库:
     db = pymysql.connect(host='localhost', user='root', password='root', port=3306)
获得操作数据库的游标:
     cursor = db.cursor()

connect()方法声明一个MySQL连接对象db,需要传入MySQL运行的host(即IP地址)

user为用户名,password为密码,port为端口(默认为3306),

通过调用cursor()方法获得MySQL的操作游标,再利用游标来执行SQL语句

创建数据库
    cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")
    db.close()

execute():  执行sql语句。
spiders为数据库名,为UTF-8默认编码

创建数据表
     sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255)       NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
     cursor.execute(sql)

students :表名
id /name /age :字段名(表头)
PRIMARY KEY :主键,唯一地标识表中的每一行

#插入数据
name = 'xaocai'
sex = 'girl'
number = 2019
# gender = 'man'

db = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='spiders')
sql = 'INSERT INTO students(name, sex, number) values(%s, %s, %s)'
try:
    cursor.execute(sql, (name, sex, number))
    db.commit()
    print('插入数据成功')
except:
    print('数据插入失败')
    db.rollback()

执行失败,将调用rollback()执行数据回滚,相当于什么都没有发生过

# 查找数据
sql = 'SELECT * FROM students WHERE age >= 20'
try:
    cursor.execute(sql)
    print('Count:', cursor.rowcount)        
    one = cursor.fetchone()     
    print('One:', one)
    results = cursor.fetchall()
    print('Results:', results)
    for row in results:
        print(row)
except:
    print('Error')

cursor.rowcount调用cursor的rowcount属性获取查询结果的条数

fetchone(),获取结果的第一条数据,返回结果是元组形式,元组的元素顺序跟字段一一对应

调用了fetchall(),可以得到结果的所有数据。然后将其结果和类型打印出来

# 更新数据
sql = 'UPDATE students SET age = %s WHERE id = %s'
try:
   cursor.execute(sql, (25, '20120004'))
   db.commit()
except:
   db.rollback()

更新数据和改写数据类似,执行commit()方法执行操作

# 删除数据
table = 'name'
condition = 'number > 20'

sql = 'DELETE FROM  {table} WHERE {condition}'.format(table=table, condition=condition)
try:
    cursor.execute(sql)
    db.commit()
    print('删除数据成功')
except:
    db.rollback()
    print('删除数据失败!!')
db.close()

删除数据和改写不同的是需要使用db的commit()方法才能执行

猜你喜欢

转载自blog.csdn.net/qq_44832048/article/details/97813572