各位大脑,如何把txt文件用黑马python培训班费用导入到mongoDB数据库里?txt里面字段是姓名学号成绩

记录自己学习python过程中的经验与心得
python使用pymongo访问MongoDB的基本操作,以及CSV文件导出
python使用pymongo访问MongoDB的基本操作,以及CSV文件导出
Python:3.6.1
Python IDE:pycharm
系统:win7
2. 简单示例
import pymongo
mongo_url = "127.0.0.1:27017"
client = pymongo.MongoClient(mongo_url)
DATABASE = "myDatabase"
db = client[DATABASE]
COLLECTION = "myCollection"
db_coll = db[COLLECTION ]
queryArgs = {'date':''}
search_res = db_coll.find(queryArgs).sort('age',-1)
for record in search_res:
print(f"_id = {record['_id']}, name = {record['name']}, age = {record['age']}")
针对读操作,进行数据统计,尽量使用多线程,节省时间,只是要注意线程数量,会大量吃内存。
4. mongoDB的数据类型
MongoDB支持许多数据类型,如下:
字符串 - 用于存储数据的最常用的数据类型。MongoDB中的字符串必须为UTF-8。
整型 - 用于存储数值。 整数可以是32位或64位,具体取决于服务器。
布尔类型 - 用于存储布尔值(true / false)值。
双精度浮点数 - 用于存储浮点值。
最小/最大键 - 用于将值与最小和最大BSON元素进行比较。
数组 - 用于将数组或列表或多个值存储到一个键中。
时间戳 - ctimestamp,当文档被修改或添加时,可以方便地进行录制。
对象 - 用于嵌入式文档。
对象 - 用于嵌入式文档。
Null - 用于存储Null值。
符号 - 该数据类型与字符串相同; 但是,通常保留用于使用特定符号类型的语言。
日期 - 用于以UNIX时间格式存储当前日期或时间。您可以通过创建日期对象并将日,月,年的 - 日期进行指定自己需要的日期时间。
对象ID - 用于存储文档的ID。
二进制数据 - 用于存储二进制数据。
代码 - 用于将JavaScript代码存储到文档中。
正则表达式 - 用于存储正则表达式。
不支持的数据类型:
python中的集合(set)
5. 对表(集合collection)的操作
import pymongo
mongo_url = "127.0.0.1:27017"
client = pymongo.MongoClient(mongo_url)
DATABASE = "amazon"
db = client[DATABASE]
COLLECTION = "galance"
db_coll = db[COLLECTION]
5.1. 查找记录:find
(5.1.1)指定返回哪些字段
searchRes = db_coll.find()
queryArgs = {}
projectionFields = {'_id':True, 'key':True}
searchRes = db_coll.find(queryArgs, projection = projectionFields)
queryArgs = {}
projectionFields = {'_id':False, 'key':False}
searchRes = db_coll.find(queryArgs, projection = projectionFields)
queryArgs = {}
projectionFields = ['key','date']
searchRes = db_coll.find(queryArgs, projection = projectionFields)
(5.1.2)指定查询条件
(5.1.2.1). 比较:=,!=,&, &, &=, &=
$ne:不等于(not equal)
$gt:大于(greater than)
$lt:小于(less than)
$lte:小于等于(less than equal)
$gte:大于等于(greater than equal)
queryArgs = {'key':'TV & Video'}
projectionFields = ['key','sales','date']
searchRes = db_coll.find(queryArgs, projection = projectionFields)
queryArgs = {'sales':{'$ne':0}}
projectionFields = ['key','sales','date']
searchRes = db_coll.find(queryArgs, projection = projectionFields)
queryArgs = {'sales':{'$gt':100}}
queryArgs = {'sales':{'$lt':100}}
queryArgs = {'sales':{'$gt':50, '$lt':100}}
queryArgs = {'sales':{'$gte':50, '$lte':100}}
(5.1.2.2). and
queryArgs = {'date':'', 'sales':100}
(5.1.2.3). or
queryArgs = {'$or':[{'date':''}, {'sales':100}]}
queryArgs = {'$or':[{'sales':100}, {'sales':120}]}
(5.1.2.4). in,not in,all
queryArgs = {'sales':{'$in':[100,120]}}
queryArgs = {'sales':{'$nin':[100,120]}}
queryArgs = {'sales':{'$all':[100,120]}}
queryArgs = {'sales':{'$all':[100,100]}}
(5.1.2.5). 字段是否存在
queryArgs = {'rank2':None}
projectionFields = ['key','sales','date', 'rank2']
searchRes = db_coll.find(queryArgs, projection = projectionFields)
db.categoryAsinSrc.find({'isClawered': true, 'avgCost': {$exists: false}})
queryArgs = {'rank2':{'$ne':None}}
projectionFields = ['key','sales','date','rank2']
searchRes = db_coll.find(queryArgs, projection = projectionFields).limit(100)
(5.1.2.6). 正则表达式匹配:$regex(SQL:like)
queryArgs = {'key':{'$regex':'.*audio.*'}}
(5.1.2.7). 数组中必须包含元素:$all
# 查询记录,linkNameLst是一个数组,指定linkNameLst字段必须包含 'Electronics, Computers & Office' 这个元素。
db.getCollection("").find({'linkNameLst': {'$all': ['Electronics, Computers & Office']}})
# 查询记录,linkNameLst是一个数组,指定linkNameLst字段必须同时包含 'Wearable Technology' 和 'Electronics, Computers & Office' 这两个元素。
db.getCollection("").find({'linkNameLst': {'$all': ['Wearable Technology', 'Electronics, Computers & Office']}})
(5.1.2.8). 按数组大小查询
两个思路:
第一个思路:使用$where(具有很大的灵活性,但是速度会慢一些)
# priceLst是一个数组, 目标是查询 len(priceLst) & 3
db.getCollection("").find({$where: "this.priceLst.length & 3"})
关于$where,请参考官方文档:。
第二个思路:判断数组中的某个指定索引的元素是否存在(会比较高效)
例如:如果要求 len(priceLst) & 3:就意味着 num[ 2 ]不存在
db.getCollection("").find({'priceLst.2': {$exists: 0}})
例如:如果要求 len(priceLst) & 3:就意味着 num[ 3 ]存在
db.getCollection("").find({'priceLst.3': {$exists: 1}})
(5.1.3)指定查询条件
(5.1.3.1). 限定数量:limit
queryArgs = {'key':'speakers'}
projectionFields = ['key','sales']
searchRes = db_coll.find(queryArgs, projection = projectionFields)
topSearchRes = searchRes.sort('sales',pymongo.DESCENDING).limit(100)
(5.1.3.2). 排序:sort
queryArgs = {'key':'speakers'}
projectionFields = ['key','sales','rank']
searchRes = db_coll.find(queryArgs, projection = projectionFields)
sortedSearchRes = searchRes.sort([('sales', pymongo.DESCENDING),('rank', pymongo.ASCENDING)])
(5.1.3.3). 统计:count
queryArgs = {'key':'speakers'}
searchResNum = db_coll.find(queryArgs).count()
5.2. 添加记录
5.2.1. 单条插入
ID = 'firstRecord'
insertDate = ''
count = 10
insert_record = {'_id':ID, 'endDate': insertDate, 'count': count}
insert_res = db_coll.insert_one(insert_record)
print(f"insert_id={insert_res.inserted_id}: {insert_record}")
insertDate = ''
count = 20
insert_record = {'endDate': insertDate, 'count': count}
insert_res = db_coll.insert_one(insert_record)
print(f"insert_id={insert_res.inserted_id}: {insert_record}")
5.2.2. 批量插入
insertRecords = [{'i':i, 'date':''} for i in range(10)]
insertBulk = db_coll.insert_many(insertRecords, ordered = True)
print(f"insert_ids={insertBulk.inserted_ids}")
5.3. 修改记录
updateFilter = {'_id': item['_id']}
updateRes = db_coll.update_one(filter = updateFilter,
update = {'$set': dict(item)},
upsert = True)
print(f"updateRes = matched:{updateRes.matched_count}, modified = {updateRes.modified_count}")
filterArgs = {'date':''}
updateArgs = {'$set':{'isUpdated':True, 'i':100}}
updateRes = db_coll.update_many(filter = filterArgs, update = updateArgs)
print(f"updateRes: matched_count={updateRes.matched_count}, "
f"modified_count={updateRes.modified_count} modified_ids={updateRes.upserted_id}")
5.4. 删除记录
5.4.1. 删除一条记录
queryArgs = {'endDate':''}
delRecord = db_coll.delete_one(queryArgs)
print(f"delRecord={delRecord.deleted_count}")
5.4.2. 批量删除
queryArgs = {'i':{'$gt':5, '$lt':8}}
delRecord = db_coll.delete_many(queryArgs)
print(f"delRecord={delRecord.deleted_count}")
6. 将数据库文档写入csv文件。
6.1. 标准代码
import csv
with open("phoneCount.csv", "r") as csvfile:
reader = csv.reader(csvfile)
for line in reader:
print(f"# line = {line}, typeOfLine = {type(line)}, lenOfLine = {len(line)}")
line = ['850', 'rest', '43', 'NN'], typeOfLine = &class 'list'&, lenOfLine = 4
line = ['9865', 'min', '1', 'CD'], typeOfLine = &class 'list'&, lenOfLine = 4
import pymongo
import csv
mongo_url = "127.0.0.1:27017"
DATABASE = "databaseName"
TABLE = "tableName"
client = pymongo.MongoClient(mongo_url)
db_des = client[DATABASE]
db_des_table = db_des[TABLE]
with open(f"{DATABASE}_{TABLE}.csv", "w", newline='') as csvfileWriter:
writer = csv.writer(csvfileWriter)
fieldList = [
"itemType",
"field_1",
"field_2",
"field_3",
writer.writerow(fieldList)
allRecordRes = db_des_table.find()
for record in allRecordRes:
print(f"record = {record}")
recordValueLst = []
for field in fieldList:
if field not in record:
recordValueLst.append("None")
recordValueLst.append(record[field])
writer.writerow(recordValueLst)
except Exception as e:
print(f"write csv exception. e = {e}")
6.2. 可能出现的问题以及解决方案
6.2.1. 写csv文件编码问题
参考文章:Python UnicodeEncodeError: ‘gbk’ codec can’t encode character 解决方法 :
重要点:目标文件的编码是导致标题所指问题的罪魁祸首。如果我们打开一个文件,在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。 解决的办法就是,改变目标文件的编码。
解决方案:
with open(f"{DATABASE}_{TABLE}.csv", "w", newline='', encoding='utf-8') as csvfileWriter:
6.2.2. 写csv文件出现空白行(存在一行间一行)
python2.x 版本
描述及解决方案,请参考:
在read/write csv 文件是要以binary的方式进行。
with open('result.csv','wb') as cf:
writer = csv.writer(cf)
writer.writerow(['shader','file'])
for key , value in result.items():
writer.writerow([key,value])
python2.x要用‘wb’模式写入的真正原因:
python2.x中写入CSV时,CSV文件的创建必须加上‘b’参数,即open('result.csv','wb'),不然会出现隔行的现象。原因是:python正常写入文件的时候,每行的结束默认添加'n’,即0x0D,而 writerow 命令的结束会再增加一个0x0D0A,因此对于windows系统来说,就是两行,而采用’ b'参数,用二进制进行文件写入,系统默认是不添加0x0D的
而且在python2.x中,str和bytes是存在很多隐性转换的,所以虽然CSV是文本文件,也是可以正常写入。
python3 版本
在python3中,str和bytes有了清晰的划分,也没有任何隐性的转换,csv 是文本格式的文件,不支持二进制的写入,所以不要用二进制模式打开文件,数据也不必转成bytes。
描述及解决方案,请参考:
with open('result.csv', 'w', newline='') as csvfile:
总结一下:出现空白行的根本原因是Python版本问题,解决方案上python2.x中要求用‘wb’,python3.x中要求用 ‘w’ 和newline参数。
拓展:关于python3中bytes和string之间的互相转换:
python之PyMongo使用总结
pymongo 介绍和使用示例
使用python语言操作MongoDB
Python-MongoDB连接搭建(二):Python连接MongoDB
Python开发-pymongo的基本使用-mongoDB的操作
Python与Mongodb数据库之间的操作
Python操作MongoDB数据库 - pymongo库的基本用法
Python 使用pymongo操作mongodb库
pymongo的一个注意点
JSON 的正确用法:Python、MongoDB、JavaScript与Ajax
没有更多推荐了,spark处理mongodb数据(python版)
mongodb是一种文档型数据库,作为一个适用于敏捷开发的数据库,mongodb的数据模式可以随着应用程序的发展而灵活地更新。但是mongodb适合一次查询的需求,对于统计、分析(尤其是在需要跨表、跨库的情况下)并不是太方便,我们可以用spark来处理mongodb数据。架构图如下:
我使用的spark版本是spark-1.6.2,mongodb版本是3.2。我主要接触了以下两种连接器:
1、mongodb官方连接器
github地址:
mongodb官方文档:
api文档(java版):
加载mongodb数据的方式如下:
from pyspark import SparkConf, SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
sc = SparkContext()
ctx = SQLContext(sc)
test_collection = ctx.read.format("com.mongodb.spark.sql").options(uri="mongodb://192.168.0.1:27017", database="test_db", collection="test_collection").load()这样就把指定的mongodb实例中的test_db库中的test_collection表加载到了spark中。可以使用以下代码查看表的格式,查看第一行数据:
test_collection.printSchema()
test_collection.first()
上面的这种方式加载时间较长,因为spark需要判断各个字段的类型,需要抽取部分数据判断(或者扫描整个表,我没有具体的研究过,总之比较慢)。而且这种方式会将所有的数据加载进来,有些字段我并不需要获取到。可以用下面的代码改进:
fields_list = "name age sex grade exp"
fields = [StructField(field_name, StringType(), True) for field_name in fields_list.split()]
schema = StructType(fields)
test_collection = job_ctx.read.schema(schema).format("com.mongodb.spark.sql").options(uri="mongodb://192.168.0.1:27017", database="test_db", collection="test_collection").load()首先选择了需要加载的字段(字段的顺序可以随意排列,也可以加上mongodb中不存在的字段),然后指定这些字段的类型,上面代码都指定为了spark中的stringtype类型。
test_collection变量是spark中的dataframe类型数据,就可以使用spark
sql处理数据:
test_collection.registerTempTable("Account")
sql = "select * from Account where age & '18'"
result = ctx.sql(sql)
result也是dataframe类型数据,也可以继续像上面这样的处理方式处理。
如果有的需求不能通过spark sql实现,也可以使用下面代码转化成rdd格式数据,然后用map、reduce等函数处理。
test_rdd = test_collection.rdd
在数据通过sql或者自己写map、reduce函数处理完之后需要将数据保存到mongodb中。如果数据是dataframe格式:
result.write.format("com.mongodb.spark.sql").mode("overwrite").options(uri="mongodb://192.168.0.1:27017", database="test_db", collection="test_collection_out").load()
其中的mode中填写写数据的模式,官方的连接器提供了四种模式:overwrite ignore
errorifexists append,本来以为这些模式是针对行级别的,后来看了源代码发现是针对collection级别的,官方代码如下:
override def createRelation(sqlContext: SQLContext, mode: SaveMode, parameters: Map[String, String], data: DataFrame): BaseRelation = {
val writeConfig = WriteConfig(sqlContext.sparkContext.getConf, parameters)
val mongoConnector = MongoConnector(writeConfig.asOptions)
lazy val collectionExists: Boolean = mongoConnector.withDatabaseDo(
writeConfig, { db =& db.listCollectionNames().asScala.toList.contains(writeConfig.collectionName) }
mode match {
case Append =& MongoSpark.save(data, writeConfig)
case Overwrite =&
mongoConnector.withCollectionDo(writeConfig, { collection: MongoCollection[Document] =& collection.drop() })
MongoSpark.save(data, writeConfig)
case ErrorIfExists =&
if (collectionExists) {
throw new UnsupportedOperationException("MongoCollection already exists")
MongoSpark.save(data, writeConfig)
case Ignore =&
if (!collectionExists) {
MongoSpark.save(data, writeConfig)
createRelation(sqlContext, parameters ++ writeConfig.asOptions, Some(data.schema))
代码链接:
从代码中可以看出,overwrite就是先删除mongodb中指定的表,然后把数据写到这个表中;ignore就是如果mongodb中有这个表,就不写数据了,且不会报错;errorifexists就是如果mongodb中存在这个表就报错,如果不存在就正常写入;append就是不管mongodb中这个表存不存在直接往里写数据。分这么多模式其实没啥大用,如果不看代码容易理解出现偏差。
如果是rdd类型的数据就需要先转化成dataframe格式再保存到mongodb中,例如:
fields_list = "name age sex grade exp"
fields = [StructField(field_name, StringType(), True) for field_name in fields_list]
schema = StructType(fields)
df = ctx.createDataFrame(result, schema=schema)
df.write.format("com.mongodb.spark.sql").mode("overwrite").options(uri="mongodb://192.168.0.1:27017", database="test_db", collection="test_collection_out").load()
2、第三方连接器
github地址:
这个连接器的使用方式基本上和官方连接器一样,获取数据的代码如下:
test_collection = ctx.read.schema(schema).format("com.stratio.datasource.mongodb").options(host="192.168.0.1:27017", database="test", collection="test_collection").load()可以看出,只是format做了改变,options中的uri改成了host。
写数据到mongodb的方法和官方连接器也差不多:
result.write.format("com.stratio.datasource.mongodb").mode("append").options(host="192.168.0.1:27017", database="test", collection="test_collection_out", updateFields='name').save()这个第三方连接器再写入数据到mongodb时的功能比官方连接器要好很多,它也提供了overwrite ignore
errorifexists append这四种模式,可以通过下面这些连接器的源代码看出它的处理方式:mode match{
case Append
=& mongodbRelation.insert(data, overwrite = false)
case Overwrite
=& mongodbRelation.insert(data, overwrite = true)
case ErrorIfExists
=& if(mongodbRelation.isEmptyCollection) mongodbRelation.insert(data, overwrite = false)
else throw new UnsupportedOperationException("Writing in a non-empty collection.")
case Ignore
=& if(mongodbRelation.isEmptyCollection) mongodbRelation.insert(data, overwrite = false)
}def insert(data: DataFrame, overwrite: Boolean): Unit = {
if (overwrite) {
usingMongoClient(MongodbClientFactory.getClient(config.hosts, config.credentials, config.sslOptions, config.clientOptions).clientConnection) { mongoClient =&
dbCollection(mongoClient).dropCollection()
data.saveToMongodb(config)
}def saveToMongodb(config: Config, batch: Boolean = true): Unit = {
val schema = dataFrame.schema
dataFrame.foreachPartition(it =& {
val writer =
if (batch) new MongodbBatchWriter(config)
else new MongodbSimpleWriter(config)
writer.saveWithPk(
it.map(row =& MongodbRowConverter.rowAsDBObject(row, schema)))
}private[mongodb] class MongodbBatchWriter(config: Config) extends MongodbWriter(config) {
private val IdKey = "_id"
private val bulkBatchSize = config.getOrElse[Int](MongodbConfig.BulkBatchSize, MongodbConfig.DefaultBulkBatchSize)
private val pkConfig: Option[Array[String]] = config.get[Array[String]](MongodbConfig.UpdateFields)
override def save(it: Iterator[DBObject], mongoClient: MongoClient): Unit = {
it.grouped(bulkBatchSize).foreach { group =&
val bulkOperation = dbCollection(mongoClient).initializeUnorderedBulkOperation
group.foreach { element =&
val query = getUpdateQuery(element)
if (query.isEmpty) bulkOperation.insert(element)
else bulkOperation.find(query).upsert().replaceOne(element)
bulkOperation.execute(writeConcern)
可以看出,这四种模式的功能总体上是和官方连接器一致的,但是在写入mongodb时处理方式不同。在这里可以使用一个updateFields参数,这个参数表示以这个参数的值为key,如果查询到mongodb的表中已经有相同key的数据,会替换掉这行数据,如果没有则直接写入。在很多业务场景下,只需要在原表的基础上更新一部分数据,用这个第三方连接器就非常方便。
3、连接器的选择
在获取数据时,官方连接器的性能似乎比第三方连接器的好一点,官方连接器有一个条件下推的原则。我们知道spark的算子分为两种:Transformation和Action,只有遇到Action算子才会触发作业的提交。比如在后续的一些Transformation算子中对数据有一定的数据过滤条件,官方连接器会把过滤条件下推到MongoDB去执行,这样可以保证从MongoDB取出来、经过网络传输到Spark计算节点的数据确实都是用得着的。第三方连接器似乎会把所有数据加载到spark后再过滤(没有仔细求证)。
在写数据到mongodb时,通过上面贴出来的代码可以看出,第三方连接器的功能比官方连接器的要好一点,支持在原有表的基础上做更新。
4、连接器的使用
首先要安装spark(如果不需要把数据保存到hdfs、不需要使用yarn,可以不安装hadoop),在spark目录下的bin目录下会有一个spark-submit可执行文件。
例如把代码保存在test.py中,如果使用官方连接器,运行:
spark-submit --packages org.mongodb.spark:mongo-spark-connector_2.10:1.1.0 test.py
如果使用的是第三方连接器,运行:
spark-submit --packages com.stratio.datasource:spark-mongodb_2.10:0.11.2
第一次执行时会下载相应的工具包,国内网络可能下载不下来,我上传到了csdn,可以到下面连接下载:
解压后将cache、jar目录拷贝到~/.ivy2目录下即可。
参考文档:
文章中出现错误欢迎指正。
Mongodb学习笔记 --- python读取mongodb数据
spark源码阅读一-spark-mongodb代码分析
从零到一spark进阶之路(三) pyspark 处理movies数据集(整理ING6-20)
PySpark 学习笔记五
spark读取mongodb(maven)
Spark - 利用 Spark SQL +
MongoDB 对PandaTV主播进行等级分类
Spark读取mongoDB数据写入Hive普通表和分区表
Spark日志清洗一般流程(Python版)
没有更多推荐了,
(window.slotbydup=window.slotbydup || []).push({
id: '5865575',
container: s,
size: '300,250',
display: 'inlay-fix'python连接mongodb操作数据示例(mongodb数据库配置类)
&更新时间:日 14:45:57 & 作者:
这篇文章主要介绍了python连接mongodb操作数据示例,主要包括插入数据、更新数据、查询数据、删除数据等
一、相关代码数据库配置类 MongoDBConn.py
代码如下:#encoding=utf-8'''Mongo Conn连接类'''import pymongoclass DBConn:&&& conn = None&&& servers = "mongodb://localhost:27017"&&& def connect(self):&&&&&&& self.conn = pymongo.Connection(self.servers)&&& def close(self):&&&&&&& return self.conn.disconnect()&&& def getConn(self):&&&&&&& return self.conn
MongoDemo.py 类
代码如下:#encoding=utf-8'''Mongo操作DemoDone:'''import MongoDBConndbconn = MongoDBConn.DBConn()conn = Nonelifeba_users = Nonedef process():&&& #建立连接&&& dbconn.connect()&&& global conn&&& conn = dbconn.getConn()&&& #列出server_info信息&&& print conn.server_info()&&& #列出全部数据库&&& databases = conn.database_names()&&& print databases&&& #删除库和表&&& dropTable()&&& #添加数据库lifeba及表(collections)users&&& createTable()&&& #插入数据&&& insertDatas()&&& #更新数据&&& updateData()&&& #查询数据&&& queryData()&&& #删除数据&&& deleteData()&&& #释放连接&&& dbconn.close()def insertDatas():&&& datas=[{"name":"steven1","realname":"测试1","age":25},&&&&&&&&&& {"name":"steven2","realname":"测试2","age":26},&&&&&&&&&& {"name":"steven1","realname":"测试3","age":23}]&&& lifeba_users.insert(datas)def updateData():&&& '''只修改最后一条匹配到的数据&&&&&&&&&& 第3个参数设置为True,没找到该数据就添加一条&&&&&&&&&& 第4个参数设置为True,有多条记录就不更新&&& '''&&& lifeba_users.update({'name':'steven1'},{'$set':{'realname':'测试1修改'}}, False,False)def deleteData():&&& lifeba_users.remove({'name':'steven1'})def queryData():&&& #查询全部数据&&& rows = lifeba_users.find()&&& printResult(rows)&&& #查询一个数据&&& print lifeba_users.find_one()&&& #带条件查询&&& printResult(lifeba_users.find({'name':'steven2'}))&&& printResult(lifeba_users.find({'name':{'$gt':25}}))def createTable():&&& '''创建库和表'''&&& global lifeba_users&&& lifeba_users = conn.lifeba.usersdef dropTable():&&& '''删除表'''&&& global conn&&& conn.drop_database("lifeba")def printResult(rows):&&& for row in rows:&&&&&&& for key in row.keys():#遍历字典&&&&&&&&&&& print row[key], #加, 不换行打印&&&&&&& print ''if __name__ == '__main__':&&& process()
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 python导入其他文件的函数 的文章

 

随机推荐