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()方法才能执行