adbapi查询语句 -- python3

李魔佛 发表了文章 • 0 个评论 • 20 次浏览 • 2018-08-12 19:40 • 来自相关话题

Introduction to Twisted Enterprise
Abstract

Twisted is an asynchronous networking framework, but most database API implementations unfortunately have blocking interfaces -- for this reason, twisted.enterprise.adbapi was created. It is a non-blocking interface to the standardized DB-API 2.0 API, which allows you to access a number of different RDBMSes.

What you should already know

Python :-)
How to write a simple Twisted Server (see this tutorial to learn how)
Familiarity with using database interfaces (see the documentation for DBAPI 2.0 or this article by Andrew Kuchling)

Quick Overview

Twisted is an asynchronous framework. This means standard database modules cannot be used directly, as they typically work something like:# Create connection... db = dbmodule.connect('mydb', 'andrew', 'password') # ...which blocks for an unknown amount of time # Create a cursor cursor = db.cursor() # Do a query... resultset = cursor.query('SELECT * FROM table WHERE ...') # ...which could take a long time, perhaps even minutes.Those delays are unacceptable when using an asynchronous framework such as Twisted. For this reason, twisted provides twisted.enterprise.adbapi, an asynchronous wrapper for any DB-API 2.0-compliant module. It is currently best tested with the pyPgSQL module for PostgreSQL.

enterprise.adbapi will do blocking database operations in seperate threads, which trigger callbacks in the originating thread when they complete. In the meantime, the original thread can continue doing normal work, like servicing other requests.

How do I use adbapi?

Rather than creating a database connection directly, use the adbapi.ConnectionPool class to manage a connections for you. This allows enterprise.adbapi to use multiple connections, one per thread. This is easy:# Using the "dbmodule" from the previous example, create a ConnectionPool from twisted.enterprise import adbapi dbpool = adbapi.ConnectionPool("dbmodule", 'mydb', 'andrew', 'password')Things to note about doing this:

There is no need to import dbmodule directly. You just pass the name to adbapi.ConnectionPool's constructor.
The parameters you would pass to dbmodule.connect are passed as extra arguments to adbapi.ConnectionPool's constructor. Keyword parameters work as well.
You may also control the size of the connection pool with the keyword parameters cp_min and cp_max. The default minimum and maximum values are 3 and 5.

So, now you need to be able to dispatch queries to your ConnectionPool. We do this by subclassing adbapi.Augmentation. Here's an example:class AgeDatabase(adbapi.Augmentation): """A simple example that can retrieve an age from the database""" def getAge(self, name): # Define the query sql = """SELECT Age FROM People WHERE name = ?""" # Run the query, and return a Deferred to the caller to add # callbacks to. return self.runQuery(sql, name) def gotAge(resultlist, name): """Callback for handling the result of the query""" age = resultlist[0][0] # First field of first record print "%s is %d years old" % (name, age) db = AgeDatabase(dbpool) # These will *not* block. Hooray! db.getAge("Andrew").addCallbacks(gotAge, db.operationError, callbackArgs=("Andrew",)) db.getAge("Glyph").addCallbacks(gotAge, db.operationError, callbackArgs=("Glyph",)) # Of course, nothing will happen until the reactor is started from twisted.internet import reactor reactor.run()This is straightforward, except perhaps for the return value of getAge. It returns a twisted.internet.defer.Deferred, which allows arbitrary callbacks to be called upon completion (or upon failure). More documentation on Deferred is available here.

Also worth noting is that this example assumes that dbmodule uses the qmarks paramstyle (see the DB-API specification). If your dbmodule uses a different paramstyle (e.g. pyformat) then use that. Twisted doesn't attempt to offer any sort of magic paramater munging -- runQuery(query, params, ...) maps directly onto cursor.execute(query, params, ...).

And that's it!

That's all you need to know to use a database from within Twisted. You probably should read the adbapi module's documentation to get an idea of the other functions it has, but hopefully this document presents the core ideas. 查看全部
Introduction to Twisted Enterprise
Abstract

Twisted is an asynchronous networking framework, but most database API implementations unfortunately have blocking interfaces -- for this reason, twisted.enterprise.adbapi was created. It is a non-blocking interface to the standardized DB-API 2.0 API, which allows you to access a number of different RDBMSes.

What you should already know

Python :-)
How to write a simple Twisted Server (see this tutorial to learn how)
Familiarity with using database interfaces (see the documentation for DBAPI 2.0 or this article by Andrew Kuchling)

Quick Overview

Twisted is an asynchronous framework. This means standard database modules cannot be used directly, as they typically work something like:# Create connection... db = dbmodule.connect('mydb', 'andrew', 'password') # ...which blocks for an unknown amount of time # Create a cursor cursor = db.cursor() # Do a query... resultset = cursor.query('SELECT * FROM table WHERE ...') # ...which could take a long time, perhaps even minutes.Those delays are unacceptable when using an asynchronous framework such as Twisted. For this reason, twisted provides twisted.enterprise.adbapi, an asynchronous wrapper for any DB-API 2.0-compliant module. It is currently best tested with the pyPgSQL module for PostgreSQL.

enterprise.adbapi will do blocking database operations in seperate threads, which trigger callbacks in the originating thread when they complete. In the meantime, the original thread can continue doing normal work, like servicing other requests.

How do I use adbapi?

Rather than creating a database connection directly, use the adbapi.ConnectionPool class to manage a connections for you. This allows enterprise.adbapi to use multiple connections, one per thread. This is easy:# Using the "dbmodule" from the previous example, create a ConnectionPool from twisted.enterprise import adbapi dbpool = adbapi.ConnectionPool("dbmodule", 'mydb', 'andrew', 'password')Things to note about doing this:

There is no need to import dbmodule directly. You just pass the name to adbapi.ConnectionPool's constructor.
The parameters you would pass to dbmodule.connect are passed as extra arguments to adbapi.ConnectionPool's constructor. Keyword parameters work as well.
You may also control the size of the connection pool with the keyword parameters cp_min and cp_max. The default minimum and maximum values are 3 and 5.

So, now you need to be able to dispatch queries to your ConnectionPool. We do this by subclassing adbapi.Augmentation. Here's an example:class AgeDatabase(adbapi.Augmentation): """A simple example that can retrieve an age from the database""" def getAge(self, name): # Define the query sql = """SELECT Age FROM People WHERE name = ?""" # Run the query, and return a Deferred to the caller to add # callbacks to. return self.runQuery(sql, name) def gotAge(resultlist, name): """Callback for handling the result of the query""" age = resultlist[0][0] # First field of first record print "%s is %d years old" % (name, age) db = AgeDatabase(dbpool) # These will *not* block. Hooray! db.getAge("Andrew").addCallbacks(gotAge, db.operationError, callbackArgs=("Andrew",)) db.getAge("Glyph").addCallbacks(gotAge, db.operationError, callbackArgs=("Glyph",)) # Of course, nothing will happen until the reactor is started from twisted.internet import reactor reactor.run()This is straightforward, except perhaps for the return value of getAge. It returns a twisted.internet.defer.Deferred, which allows arbitrary callbacks to be called upon completion (or upon failure). More documentation on Deferred is available here.

Also worth noting is that this example assumes that dbmodule uses the qmarks paramstyle (see the DB-API specification). If your dbmodule uses a different paramstyle (e.g. pyformat) then use that. Twisted doesn't attempt to offer any sort of magic paramater munging -- runQuery(query, params, ...) maps directly onto cursor.execute(query, params, ...).

And that's it!

That's all you need to know to use a database from within Twisted. You probably should read the adbapi module's documentation to get an idea of the other functions it has, but hopefully this document presents the core ideas.

python判断身份证的合法性

李魔佛 发表了文章 • 0 个评论 • 40 次浏览 • 2018-08-10 13:56 • 来自相关话题

输入身份证号码, 判断18位身份证号码是否合法, 并查询信息(性别, 年龄, 所在地)

验证原理

将前面的身份证号码17位数分别乘以不同的系数, 从第一位到第十七位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
将这17位数字和系数相乘的结果相加.
用加出来和除以11, 看余数是多少?
余数只可能有<0 1 2 3 4 5 6 7 8 9 10>这11个数字, 其分别对应的最后一位身份证的号码为<1 0 X 9 8 7 6 5 4 3 2>.
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2.

例如: 某男性的身份证号码是34052419800101001X, 我们要看看这个身份证是不是合法的身份证.

首先: 我们得出, 前17位的乘积和是189.

然后: 用189除以11得出的余数是2.

最后: 通过对应规则就可以知道余数2对应的数字是x. 所以, 这是一个合格的身份证号码.
 
代码如下:
#!/bin/env python
# -*- coding: utf-8 -*-

from sys import platform
import json
import codecs

with codecs.open('data.json', 'r', encoding='utf8') as json_data:
city = json.load(json_data)

def check_valid(idcard):
# 城市编码, 出生日期, 归属地
city_id = idcard[:6]
print(city_id)
birth = idcard[6:14]

city_name = city.get(city_id,'Not found')

# 根据规则校验身份证是否符合规则
idcard_tuple = [int(num) for num in list(idcard[:-1])]
coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
sum_value = sum([idcard_tuple[i] * coefficient[i] for i in range(17)])

remainder = sum_value % 11

maptable = {0: '1', 1: '0', 2: 'x', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}

if maptable[remainder] == idcard[17]:
print('<身份证合法>')
sex = int(idcard[16]) % 2
sex = '男' if sex == 1 else '女'
print('性别:' + sex)
birth_format="{}年{}月{}日".format(birth[:4],birth[4:6],birth[6:8])
print('出生日期:' + birth_format)
print('归属地:' + city_name)
return True
else:
print('<身份证不合法>')
return False


if __name__=='__main__':
idcard = str(input('请输入身份证号码:'))
check_valid(idcard)

github源码:https://github.com/Rockyzsu/IdentityCheck
  查看全部
输入身份证号码, 判断18位身份证号码是否合法, 并查询信息(性别, 年龄, 所在地)

验证原理

将前面的身份证号码17位数分别乘以不同的系数, 从第一位到第十七位的系数分别为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
将这17位数字和系数相乘的结果相加.
用加出来和除以11, 看余数是多少?
余数只可能有<0 1 2 3 4 5 6 7 8 9 10>这11个数字, 其分别对应的最后一位身份证的号码为<1 0 X 9 8 7 6 5 4 3 2>.
通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2.

例如: 某男性的身份证号码是34052419800101001X, 我们要看看这个身份证是不是合法的身份证.

首先: 我们得出, 前17位的乘积和是189.

然后: 用189除以11得出的余数是2.

最后: 通过对应规则就可以知道余数2对应的数字是x. 所以, 这是一个合格的身份证号码.
 
代码如下:
#!/bin/env python
# -*- coding: utf-8 -*-

from sys import platform
import json
import codecs

with codecs.open('data.json', 'r', encoding='utf8') as json_data:
city = json.load(json_data)

def check_valid(idcard):
# 城市编码, 出生日期, 归属地
city_id = idcard[:6]
print(city_id)
birth = idcard[6:14]

city_name = city.get(city_id,'Not found')

# 根据规则校验身份证是否符合规则
idcard_tuple = [int(num) for num in list(idcard[:-1])]
coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
sum_value = sum([idcard_tuple[i] * coefficient[i] for i in range(17)])

remainder = sum_value % 11

maptable = {0: '1', 1: '0', 2: 'x', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}

if maptable[remainder] == idcard[17]:
print('<身份证合法>')
sex = int(idcard[16]) % 2
sex = '男' if sex == 1 else '女'
print('性别:' + sex)
birth_format="{}年{}月{}日".format(birth[:4],birth[4:6],birth[6:8])
print('出生日期:' + birth_format)
print('归属地:' + city_name)
return True
else:
print('<身份证不合法>')
return False


if __name__=='__main__':
idcard = str(input('请输入身份证号码:'))
check_valid(idcard)


github源码:https://github.com/Rockyzsu/IdentityCheck
 

python sqlalchemy ORM 添加注释

李魔佛 发表了文章 • 0 个评论 • 139 次浏览 • 2018-06-25 16:17 • 来自相关话题

需要更新sqlalchemy到最新版本,旧版本会不支持。
 
在定义ORM对象的时候,
class CreditRecord(Base):
__tablename__ = 'tb_PersonPunishment'

id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(180),comment='名字')
添加一个comment参数即可。
 
  查看全部
需要更新sqlalchemy到最新版本,旧版本会不支持。
 
在定义ORM对象的时候,
class CreditRecord(Base):
__tablename__ = 'tb_PersonPunishment'

id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(180),comment='名字')

添加一个comment参数即可。
 
 

windows 7 python3 安装MySQLdb 库

李魔佛 发表了文章 • 0 个评论 • 164 次浏览 • 2018-06-20 18:04 • 来自相关话题

python3下没有MySQLdb的库,可以直接到这里下载mysqlclient库来替代。https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
 
python3下没有MySQLdb的库,可以直接到这里下载mysqlclient库来替代。https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient
 

python3中定义抽象类的方法在python2中不兼容

李魔佛 发表了文章 • 0 个评论 • 228 次浏览 • 2018-06-10 20:54 • 来自相关话题

在python3中新式的定义抽象类的方法如下:from abc import ABCMeta,abstractmethod

class Server(metaclass=ABCMeta):

@abstractmethod
def __init__(self):
pass

def __str__(self):
return self.name

@abstractmethod
def boot(self):
pass

@abstractmethod
def kill(self):
pass
 
但是这个方法在python2中会提示语法错误。
 
在python2中只能像下面这种方式定义抽象类:
 from abc import ABCMeta,abstractmethod

class Server(object):
__metaclass__=ABCMeta
@abstractmethod
def __init__(self):
pass

def __str__(self):
return self.name

@abstractmethod
def boot(self):
pass

@abstractmethod
def kill(self):
pass
这种方式不仅在python2中可以正常运行,在python3中也可以。但是python3的方法只能兼容python3,无法在python2中运行。
 
原创地址:
http://30daydo.com/article/326
欢迎转载,请注明出处。 查看全部
在python3中新式的定义抽象类的方法如下:
from abc import ABCMeta,abstractmethod

class Server(metaclass=ABCMeta):

@abstractmethod
def __init__(self):
pass

def __str__(self):
return self.name

@abstractmethod
def boot(self):
pass

@abstractmethod
def kill(self):
pass

 
但是这个方法在python2中会提示语法错误。
 
在python2中只能像下面这种方式定义抽象类:
 
from abc import ABCMeta,abstractmethod

class Server(object):
__metaclass__=ABCMeta
@abstractmethod
def __init__(self):
pass

def __str__(self):
return self.name

@abstractmethod
def boot(self):
pass

@abstractmethod
def kill(self):
pass

这种方式不仅在python2中可以正常运行,在python3中也可以。但是python3的方法只能兼容python3,无法在python2中运行。
 
原创地址:
http://30daydo.com/article/326
欢迎转载,请注明出处。

numpy数组四舍五入

李魔佛 发表了文章 • 0 个评论 • 443 次浏览 • 2018-05-21 09:17 • 来自相关话题

numpy.around(nlist, number)
传入一个np的数组和需要保留的位数作为参数
 
例子:import numpy as np
x = np.arange(10)
x=x/77.0
print x
输出结果为:[b][0. 0.01298701 0.02597403 0.03896104 0.05194805 0.06493506
0.07792208 0.09090909 0.1038961 0.11688312][/b] [b]np.around(x, 3) #保存为3位小数[/b]
array([0. , 0.013, 0.026, 0.039, 0.052, 0.065, 0.078, 0.091, 0.104, 0.117]) 查看全部
numpy.around(nlist, number)
传入一个np的数组和需要保留的位数作为参数
 
例子:
import numpy as np
x = np.arange(10)
x=x/77.0
print x

输出结果为:
[b][0.         0.01298701 0.02597403 0.03896104 0.05194805 0.06493506
0.07792208 0.09090909 0.1038961 0.11688312][/b]
 
[b]np.around(x, 3)   #保存为3位小数[/b]

array([0. , 0.013, 0.026, 0.039, 0.052, 0.065, 0.078, 0.091, 0.104, 0.117])

抄底?还是跳入火坑

绫波丽 发表了文章 • 0 个评论 • 259 次浏览 • 2018-04-27 20:54 • 来自相关话题

对于抄底,个人的态度是谨慎的。 尽量不会去参与。 因为很多看起来的底,很有可能只是个下跌中继,下面还有地下室,地下车库,十八层地狱。尤其是那些经历多个缩量跌停的个股。 在趋势面前,没有人能够凭借一己之力扭转。

截几个图给大家看看:





富控互动(点击查看大图)

如果你去抄底了,在图示2的位置买入,假如你买入1W快,那么到今天(2018-04-27)如果没及时止损割肉,那么现在就剩6900.
而如果是从1的位置买入一直持有到现在,那么现在就剩4000元。





顺威股份(点击大图)

如果你在2位置抄底,那么现在会亏损40%

同样,如果你在2位置去抄底神雾







那么到现在你会亏损51%,而在3位置去抄底,那么你到现在会亏损31%,所以抄底过程中,如果你没有做好马上捞一笔就跑的习惯,还是不要去参与。参与了,就要跑的快,不论盈利或者亏损。 不然后面的都是深渊。
 
  查看全部
对于抄底,个人的态度是谨慎的。 尽量不会去参与。 因为很多看起来的底,很有可能只是个下跌中继,下面还有地下室,地下车库,十八层地狱。尤其是那些经历多个缩量跌停的个股。 在趋势面前,没有人能够凭借一己之力扭转。

截几个图给大家看看:

抄底.PNG

富控互动(点击查看大图)

如果你去抄底了,在图示2的位置买入,假如你买入1W快,那么到今天(2018-04-27)如果没及时止损割肉,那么现在就剩6900.
而如果是从1的位置买入一直持有到现在,那么现在就剩4000元。

顺威.PNG

顺威股份(点击大图)

如果你在2位置抄底,那么现在会亏损40%

同样,如果你在2位置去抄底神雾


神雾.PNG


那么到现在你会亏损51%,而在3位置去抄底,那么你到现在会亏损31%,所以抄底过程中,如果你没有做好马上捞一笔就跑的习惯,还是不要去参与。参与了,就要跑的快,不论盈利或者亏损。 不然后面的都是深渊。
 
 

pandas中diff控制移动方向,向上移动

李魔佛 发表了文章 • 0 个评论 • 385 次浏览 • 2018-04-25 20:39 • 来自相关话题

初始化一个dataframe
 
然后使用默认的diff(periods=1)





行的索引不变,数据被往下拉了一行。当然你也可以使用periods=2 ,那么数据整体会往下移2格。
 
如果要往上移动,只要把periods的值设为负的就可以了。





  查看全部
diff.PNG

初始化一个dataframe
 
然后使用默认的diff(periods=1)

shift.PNG

行的索引不变,数据被往下拉了一行。当然你也可以使用periods=2 ,那么数据整体会往下移2格。
 
如果要往上移动,只要把periods的值设为负的就可以了。
shift2.PNG


 

python安装mpl_finance [finance模块已经从matplotlib2.0.2中脱离出来]

李魔佛 发表了文章 • 0 个评论 • 2596 次浏览 • 2018-04-23 23:17 • 来自相关话题

最新的matplotlib中已经把其中的finance库脱离出来,目前还没有放入PIP的仓库中,所以使用pip install mpl_finance会提示找不到所需要的库.
 
解决办法:
到官方github中下载源码,然后在本地安装即可。 目前的mpl_finance的版本还是dev版,不过用起来也没什么大问题。
 
git clone git@github.com:matplotlib/mpl_finance.git
 
等待下载后,进入该目录, sudo python setup.py install
 
OK
  查看全部
最新的matplotlib中已经把其中的finance库脱离出来,目前还没有放入PIP的仓库中,所以使用pip install mpl_finance会提示找不到所需要的库.
 
解决办法:
到官方github中下载源码,然后在本地安装即可。 目前的mpl_finance的版本还是dev版,不过用起来也没什么大问题。
 
git clone git@github.com:matplotlib/mpl_finance.git
 
等待下载后,进入该目录, sudo python setup.py install
 
OK
 

python取出两个两个同样表结构的MySQL数据库中不同的行

李魔佛 发表了文章 • 0 个评论 • 305 次浏览 • 2018-04-14 11:11 • 来自相关话题

因为平时有本地数据库和远程数据库,本地的时候是离线的时候看的。 有时候因为修改代码的缘故,导致远程数据和本地数据有不一样的地方,那么可以使用python+pandas很简单的筛选出不同的行。
 
df_new[~(df_new['URL'].isin(df_old['URL'].values))]
 
其中df_old 为本地的数据库读取的dataframe数据,而df_new 为远程的数据,通过判断唯一的key URL的值来筛选出不同的数据行 查看全部
因为平时有本地数据库和远程数据库,本地的时候是离线的时候看的。 有时候因为修改代码的缘故,导致远程数据和本地数据有不一样的地方,那么可以使用python+pandas很简单的筛选出不同的行。
 
df_new[~(df_new['URL'].isin(df_old['URL'].values))]
 
其中df_old 为本地的数据库读取的dataframe数据,而df_new 为远程的数据,通过判断唯一的key URL的值来筛选出不同的数据行

urlparse中defrag函数的用法

李魔佛 发表了文章 • 0 个评论 • 359 次浏览 • 2018-03-11 17:59 • 来自相关话题

urlparse.urldefrag(url)¶

If url contains a fragment identifier, returns a modified version of url with no fragment identifier, and the fragment identifier as a separate string. If there is no fragment identifier in url, returns url unmodified and an empty string.

官网的解释如上,作用就是把url中的fragment标识符去掉。What ?
fragment标识符是url中#号的部分。
比如  http://www.example.com/index.html#print
 
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。
 
就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name="print"></a>,二是使用id属性,比如<div id="print" >。
 
 
所以:
url='http://www.example.com/index.html#print'
url=urlparse.defrag(url)
那么返回的url是http://www.example.com/index.html,因为这两个页面实际是同一个url,在爬虫程序中可以用来过滤同一个页面 查看全部


urlparse.urldefrag(url)¶

If url contains a fragment identifier, returns a modified version of url with no fragment identifier, and the fragment identifier as a separate string. If there is no fragment identifier in url, returns url unmodified and an empty string.


官网的解释如上,作用就是把url中的fragment标识符去掉。What ?
fragment标识符是url中#号的部分。
比如  http://www.example.com/index.html#print
 
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。
 
就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

为网页位置指定标识符,有两个方法。一是使用锚点,比如<a name="print"></a>,二是使用id属性,比如<div id="print" >。
 
 
所以:
url='http://www.example.com/index.html#print'
url=urlparse.defrag(url)
那么返回的url是http://www.example.com/index.html,因为这两个页面实际是同一个url,在爬虫程序中可以用来过滤同一个页面

strptime修改默认年份,datetime - strptime默认值为 1900

李魔佛 发表了文章 • 0 个评论 • 559 次浏览 • 2018-03-07 08:42 • 来自相关话题

比如
s='03-06 18:36'
news_time_f=datetime.datetime.strptime(s,%m-%d %H:%M')
print news_time_f
 
返回来的结果是datetime类型,但是年份是1900年。
1900-03-06 18:36:00
 
有两种办法:
1. 在日期格式前人为添加年份
news_time_f=datetime.datetime.strptime(''s,'%Y-%m-%d %H:%M')
 
2.使用自带的replace函数
s='03-06 18:36'
news_time_f=datetime.datetime.strptime(s,%m-%d %H:%M')
news_time_f=news_time_f.replace(2018)
 
上面两种方法都可以把03-06 18:36
转换为2018-03-06 18:36:00的datetime类型 查看全部
比如
s='03-06 18:36'
news_time_f=datetime.datetime.strptime(s,%m-%d %H:%M')
print news_time_f
 
返回来的结果是datetime类型,但是年份是1900年。
1900-03-06 18:36:00
 
有两种办法:
1. 在日期格式前人为添加年份
news_time_f=datetime.datetime.strptime(''s,'%Y-%m-%d %H:%M')
 
2.使用自带的replace函数
s='03-06 18:36'
news_time_f=datetime.datetime.strptime(s,%m-%d %H:%M')
news_time_f=news_time_f.replace(2018)
 
上面两种方法都可以把03-06 18:36
转换为2018-03-06 18:36:00的datetime类型

Pycharm控制台窗口怎样可以显示不同程序的运行结果

李魔佛 发表了文章 • 0 个评论 • 1480 次浏览 • 2018-01-27 20:31 • 来自相关话题

默认情况下,每次运行会把之前的那个结果给清理掉。 有时候运行多个程序像对比结果,不太方便。
可以在pycharm的控制台那里点击右键,在弹出的菜单中,选择“Pin Tab”,那么当前的控制台就不会被清掉啦,它可以一直保留着,自带你自己手动去关闭它。
默认情况下,每次运行会把之前的那个结果给清理掉。 有时候运行多个程序像对比结果,不太方便。
可以在pycharm的控制台那里点击右键,在弹出的菜单中,选择“Pin Tab”,那么当前的控制台就不会被清掉啦,它可以一直保留着,自带你自己手动去关闭它。

scipy.misc.lena AttributeError: 'module' object has no attribute 'lena'

李魔佛 发表了文章 • 0 个评论 • 2649 次浏览 • 2018-01-03 19:42 • 来自相关话题

在数据可视化的那本书上看到的demo,不过运行不通过,然后出现上面的那个错误,lena函数看起来被移除了。
 
import scipy.misc
lena=scipy.misc.lena()
plt.gray()
plt.imshow(lena)
plt.colorbar()
plt.show()
Error:
lena=scipy.misc.lena()
AttributeError: 'module' object has no attribute 'lena'
  
定位到scipy包的位置
/usr/local/lib/python2.7/dist-packages/scipy/misc
然后根据文本查找一下: find -name '*.py' | xargs grep 'lena'
 
果然,没有返回相关的字段。 看样子在scipy 1.0.0版本上已经移除了lena图的数据了。 
 
不过替换了一张其他的图片。 在misc目录下看到一个叫ascent的data, 替换这个函数后: 
scipy.misc.ascent()
后,显示一个楼梯的图片。只能凑合着用吧。 lena图自己上网找一张然后数字化就好了。
 
  查看全部
在数据可视化的那本书上看到的demo,不过运行不通过,然后出现上面的那个错误,lena函数看起来被移除了。
 
	import scipy.misc
lena=scipy.misc.lena()
plt.gray()
plt.imshow(lena)
plt.colorbar()
plt.show()

Error:
lena=scipy.misc.lena()
AttributeError: 'module' object has no attribute 'lena'
  
定位到scipy包的位置
/usr/local/lib/python2.7/dist-packages/scipy/misc
然后根据文本查找一下: find -name '*.py' | xargs grep 'lena'
 
果然,没有返回相关的字段。 看样子在scipy 1.0.0版本上已经移除了lena图的数据了。 
 
不过替换了一张其他的图片。 在misc目录下看到一个叫ascent的data, 替换这个函数后: 
scipy.misc.ascent()
后,显示一个楼梯的图片。只能凑合着用吧。 lena图自己上网找一张然后数字化就好了。
 
 

ubuntu python matplotlib绘图不显示图形

李魔佛 发表了文章 • 0 个评论 • 995 次浏览 • 2017-12-25 16:37 • 来自相关话题

版本信息: ubuntu16
python 2.7
matplotlib (最新,通过pip安装的)
 
绘制任何图形都会输出下面的错误:
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
 
cairo这个依赖库我已经通过apt安装的了。
 
通过调试,最后发现需要安装这个库: 
    sudo apt-get install python-gi-cairo
 
安装后就可以看到图像能够正常显示了。(不然会显示一片空白,其实如果你选择保存的话,然后打开图像,是可以看到绘制出来的图像的) 查看全部
版本信息: ubuntu16
python 2.7
matplotlib (最新,通过pip安装的)
 
绘制任何图形都会输出下面的错误:
TypeError: Couldn't find foreign struct converter for 'cairo.Context'
 
cairo这个依赖库我已经通过apt安装的了。
 
通过调试,最后发现需要安装这个库: 
    sudo apt-get install python-gi-cairo
 
安装后就可以看到图像能够正常显示了。(不然会显示一片空白,其实如果你选择保存的话,然后打开图像,是可以看到绘制出来的图像的)

python多线程出现错误 thread.error: can't start new thread

李魔佛 发表了文章 • 0 个评论 • 1207 次浏览 • 2017-12-14 17:58 • 来自相关话题

原因是线程数太多,没有退出,导致正在运行的线程数超过系统的限制。(win7 64bit貌似支持1000多个python线程同时运行)。
 
解决办法就是加锁或者合理退出一些占用资源的线程。
原因是线程数太多,没有退出,导致正在运行的线程数超过系统的限制。(win7 64bit貌似支持1000多个python线程同时运行)。
 
解决办法就是加锁或者合理退出一些占用资源的线程。

matplotlib pie饼图 lable设置中文乱码 解决办法

李魔佛 发表了文章 • 0 个评论 • 823 次浏览 • 2017-11-03 17:10 • 来自相关话题

X=[1,1,1,1,1,1,1]
labels = [u'百度',u'京东',u'陆金所',u'工行',u'招行',u'华泰',u'国金',u'广发',u'QQ']
plt.figure()
p = plt.pie(X,labels=labels) 





(实际X的数据为其他数据,这里只是简单的设为1的列表)
 
google了些资料,找到以下可行的解决办法:
 
找一个系统自带的中文字体文件的路径
比如这一个:C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf
 
把路径拷贝下来。
 
然后在代码中设置: for front in p[1]:
front.set_fontproperties(mpl.font_manager.FontProperties(
fname='C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf'))
 
把 p中的font属性强制改为指向我们想要的字体路径,这样就可以达到修改饼图上的中文乱码问题了。
 





 
正常显示中文了。
 
在linux下同理,只需要下载一个字体文件,放在某个目录,然后在代码中指定字体的位置。
字体文件下载: https://fontzone.net/download/simhei
然后运行: $locate -b '\mpl-data'
看看mpl目录的位置,把字体文件放到fonts/ttf这个目录下面,
如果使用代码设定,如下:#!/usr/bin/env python
#coding:utf-8
"""a demo of matplotlib"""
import matplotlib as mpl
from matplotlib import pyplot as plt
mpl.rcParams[u'font.sans-serif'] = ['simhei']
mpl.rcParams['axes.unicode_minus'] = False
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10289.7, 14958.3]
#创建一副线图,x轴是年份,y轴是gdp
plt.plot(years, gdp, color='green', marker='o', linestyle='solid')
#添加一个标题
plt.title(u'名义GDP')
#给y轴加标记
plt.ylabel(u'十亿美元')
plt.show()
 
PS:
在树莓派上回出现的问题:
UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sanspi@raspb DejaVu Sans^CserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to
 
这个时候只要安装一个font-manager就可以了:
sudo apt install font-manager
 
OK ! 查看全部
    X=[1,1,1,1,1,1,1]
labels = [u'百度',u'京东',u'陆金所',u'工行',u'招行',u'华泰',u'国金',u'广发',u'QQ']
plt.figure()
p = plt.pie(X,labels=labels)
 

matplot_乱码.png

(实际X的数据为其他数据,这里只是简单的设为1的列表)
 
google了些资料,找到以下可行的解决办法:
 
找一个系统自带的中文字体文件的路径
比如这一个:C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf
 
把路径拷贝下来。
 
然后在代码中设置:
    for front in p[1]:
front.set_fontproperties(mpl.font_manager.FontProperties(
fname='C:\Windows\winsxs\amd64_microsoft-windows-font-truetype-simfang_31bf3856ad364e35_6.1.7600.16385_none_e417159f3b4eb1b7\simfang.ttf'))

 
把 p中的font属性强制改为指向我们想要的字体路径,这样就可以达到修改饼图上的中文乱码问题了。
 

matplot_乱码2.png

 
正常显示中文了。
 
在linux下同理,只需要下载一个字体文件,放在某个目录,然后在代码中指定字体的位置。
字体文件下载: https://fontzone.net/download/simhei
然后运行: $locate -b '\mpl-data'
看看mpl目录的位置,把字体文件放到fonts/ttf这个目录下面,
如果使用代码设定,如下:
#!/usr/bin/env python
#coding:utf-8
"""a demo of matplotlib"""
import matplotlib as mpl
from matplotlib import pyplot as plt
mpl.rcParams[u'font.sans-serif'] = ['simhei']
mpl.rcParams['axes.unicode_minus'] = False
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10289.7, 14958.3]
#创建一副线图,x轴是年份,y轴是gdp
plt.plot(years, gdp, color='green', marker='o', linestyle='solid')
#添加一个标题
plt.title(u'名义GDP')
#给y轴加标记
plt.ylabel(u'十亿美元')
plt.show()

 
PS:
在树莓派上回出现的问题:
UserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to DejaVu Sanspi@raspb DejaVu Sans^CserWarning: findfont: Font family [u'sans-serif'] not found. Falling back to
 
这个时候只要安装一个font-manager就可以了:
sudo apt install font-manager
 
OK !

You must either define the environment variable DJANGO_SETTINGS_MODULE

李魔佛 发表了文章 • 0 个评论 • 565 次浏览 • 2017-10-08 12:41 • 来自相关话题

代码如下:
from django import template
def template_usage():
t = template.Template('My name is {{ name }}')
c = template.Context({'name':'Rocky'})
print t.render(c)

template_usage()
就出错了。
 
这个原因一般就是直接使用python或者ipython交互解析器造成的。
 
你需要切换到你的django目录,然后使用python manager.py shell 运行, 然后执行上面的函数或者代码, 就不会再出现这个错误了
 
django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
 
  查看全部
代码如下:
from django import template
def template_usage():
t = template.Template('My name is {{ name }}')
c = template.Context({'name':'Rocky'})
print t.render(c)

template_usage()

就出错了。
 
这个原因一般就是直接使用python或者ipython交互解析器造成的。
 
你需要切换到你的django目录,然后使用python manager.py shell 运行, 然后执行上面的函数或者代码, 就不会再出现这个错误了
 
django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
 
 

30天学会django

李魔佛 发表了文章 • 0 个评论 • 670 次浏览 • 2017-09-17 23:40 • 来自相关话题

没错,最近30天开始要折腾这玩意。
 
先放个标题出来。 每天不定时更新。
 
 
我用的视频教程是cstv的那一个系列教程。
 
不推荐那个django中文手册的,因为文档比较旧,很多命令或者代码是无法再新版的django上运行通过的。 这个会比较打击人。
 

  查看全部
没错,最近30天开始要折腾这玩意。
 
先放个标题出来。 每天不定时更新。
 
 
我用的视频教程是cstv的那一个系列教程。
 
不推荐那个django中文手册的,因为文档比较旧,很多命令或者代码是无法再新版的django上运行通过的。 这个会比较打击人。
 

 

mongodb中$sum:1 后面的1是什么意思

李魔佛 发表了文章 • 0 个评论 • 1520 次浏览 • 2017-09-05 23:32 • 来自相关话题

源数据:
{
"_id" : "GuqXmAkkARqhBDqhy",
"beatmapset_id" : "342537",
"version" : "MX",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "3.5552737712860107"
}
{
"_id" : "oHLT7KqsB7bztBGvu",
"beatmapset_id" : "342537",
"version" : "HD",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "2.7515676021575928"
}
{
"_id" : "GbotZfrPEwW69FkGD",
"beatmapset_id" : "342537",
"version" : "NM",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "0"
}
 然后运行以下的命令:
 
db.getCollection('dup_case').aggregate(
[
{$group:{
_id:{diff_approach:'$diff_approach'},
count:{$sum:2}
}},
{$match:{count:{$gt:1}}}
]

 
返回的count是6
 
所以
$sum:1 的含义:
如果前面的情况出现一次,就加1, 如果后面$sum:2 那么每次前面条件满足一次就加2
  查看全部
源数据:
{
"_id" : "GuqXmAkkARqhBDqhy",
"beatmapset_id" : "342537",
"version" : "MX",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "3.5552737712860107"
}
{
"_id" : "oHLT7KqsB7bztBGvu",
"beatmapset_id" : "342537",
"version" : "HD",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "2.7515676021575928"
}
{
"_id" : "GbotZfrPEwW69FkGD",
"beatmapset_id" : "342537",
"version" : "NM",
"diff_approach" : "5",
"artist" : "Yousei Teikoku",
"title" : "Kokou no Sousei",
"difficultyrating" : "0"
}

 然后运行以下的命令:
 
db.getCollection('dup_case').aggregate(
[
{$group:{
_id:{diff_approach:'$diff_approach'},
count:{$sum:2}
}},
{$match:{count:{$gt:1}}}
]
)
 
 
返回的count是6
 
所以
$sum:1 的含义:
如果前面的情况出现一次,就加1, 如果后面$sum:2 那么每次前面条件满足一次就加2
 

python print 打印 % 百分号

李魔佛 发表了文章 • 0 个评论 • 1099 次浏览 • 2017-09-05 21:27 • 来自相关话题

记得以前困扰过自己的一个问题.
当时的解决方式是这样的:
 

a = 1
print "a values is ", a, "%"
 
把百分号切割开来.
 
后来才知道,正确显示百分号的方法:
 
 print 'a values is %d%%' %a
 用2个百分号来标示.
 
 
  查看全部
记得以前困扰过自己的一个问题.
当时的解决方式是这样的:
 

a = 1
print "a values is ", a, "%"
 
把百分号切割开来.
 
后来才知道,正确显示百分号的方法:
 
 
print 'a values is %d%%' %a

 用2个百分号来标示.
 
 
 

Python 学习笔记1.2——第三方库安装

sicily02 发表了文章 • 0 个评论 • 528 次浏览 • 2017-08-27 18:23 • 来自相关话题

电脑配置:windows 64位
python版本:3.6.0
 
一、前往第三方网站下载所需要的包
 
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 
 
二、使用pip安装
 
pip install xxx




  查看全部
电脑配置:windows 64位
python版本:3.6.0
 
一、前往第三方网站下载所需要的包
 
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 
 
二、使用pip安装
 
pip install xxx
5.png

 

python redis 笔记

李魔佛 发表了文章 • 0 个评论 • 475 次浏览 • 2017-08-24 20:33 • 来自相关话题

刚接触redis,难免会有那么一些坑,新人一定会踩到的。 把自己的坑写出来,让以后新人少踩点吧。 
踩坑也不是什么坏事,不过浪费点时间而已。
 
1. 配置文件redis.config
 
如果你要远程访问你的redis服务器,那么里面有一行你一定要注释掉:

# bind 127.0.0.1
 
 
解释:

#  指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
 
 
当时调了半天没连上去,就是被这个参数给害的。
 
2. redis-cli 连接本地redis服务器。 本地服务器端口已经改变。
开始使用redis-cli 127.0.0.1:8888 结果是一直都出错。
然后在某个配置文档看到测试本地端口,使用的命令是 redis-cli -p 8888
不然上面的永远都会连着6379.
 
待续。 不定期更新。 
 
 
 
 
 
 
 
 
  查看全部
刚接触redis,难免会有那么一些坑,新人一定会踩到的。 把自己的坑写出来,让以后新人少踩点吧。 
踩坑也不是什么坏事,不过浪费点时间而已。
 
1. 配置文件redis.config
 
如果你要远程访问你的redis服务器,那么里面有一行你一定要注释掉:

# bind 127.0.0.1
 
 
解释:

#  指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
 
 
当时调了半天没连上去,就是被这个参数给害的。
 
2. redis-cli 连接本地redis服务器。 本地服务器端口已经改变。
开始使用redis-cli 127.0.0.1:8888 结果是一直都出错。
然后在某个配置文档看到测试本地端口,使用的命令是 redis-cli -p 8888
不然上面的永远都会连着6379.
 
待续。 不定期更新。 
 
 
 
 
 
 
 
 
 

修改python的默认最大递归层数

李魔佛 发表了文章 • 0 个评论 • 741 次浏览 • 2017-08-10 16:00 • 来自相关话题

python里面为了性能,默认的递归次数不能超过1000次。
 
运行下面的代码:
def recursion(n):
if(n <= 0):
print n
return
print n
recursion(n - 1)

if __name__ == "__main__":
recursion(1200)
返回下面的错误:
 
  File "C:/Git/base_function/resursion_usage.py", line 7, in recursion
    recursion(n - 1)
RuntimeError: maximum recursion depth exceeded
 
解决办法: 修改python默认的递归层数。
在程序开头的地方添加以下语句:
 
import sys
sys.setrecursionlimit(1500)
然后再次运行,就不会有上面的错误信息了。
  查看全部
python里面为了性能,默认的递归次数不能超过1000次。
 
运行下面的代码:
def recursion(n): 
if(n <= 0):
print n
return
print n
recursion(n - 1)

if __name__ == "__main__":
recursion(1200)

返回下面的错误:
 
  File "C:/Git/base_function/resursion_usage.py", line 7, in recursion
    recursion(n - 1)
RuntimeError: maximum recursion depth exceeded
 
解决办法: 修改python默认的递归层数。
在程序开头的地方添加以下语句:
 
import sys
sys.setrecursionlimit(1500)

然后再次运行,就不会有上面的错误信息了。
 

python matplotlib 中的plot legend的用法

李魔佛 发表了文章 • 0 个评论 • 1971 次浏览 • 2017-07-13 11:59 • 来自相关话题

官方有链接说明:https://matplotlib.org/users/legend_guide.html
不过对于大部分人来说,英文教程,加上上面的例子有点晦涩。
 
所以以个人的理解,简单地用代码介绍下。 import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
print x
fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
#ax.plot(x, i * x, label='y=%dx' %i)
ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend()

plt.show()
 
运行上面的代码后,得到的结果是:
 





 
如果把那句legend() 的语句去掉,那么图形上的图例也就会消失了。
 
所以legend()的主要只用就是用于在图上标明一个图例,用于说明每条曲线的文字显示。 你也可以把图例控制在左边,右边,底下等等。
 
 
实际使用中,legend()有一个loc参数,用于控制图例的位置。 比如 plot.legend(loc=2) , 这个位置就是4象项中的第二象项,也就是左上角。 loc可以为1,2,3,4 这四个数字。
原文连接:
http://30daydo.com/article/215
转载请注明出处 查看全部
官方有链接说明:https://matplotlib.org/users/legend_guide.html
不过对于大部分人来说,英文教程,加上上面的例子有点晦涩。
 
所以以个人的理解,简单地用代码介绍下。
    import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)
print x
fig = plt.figure()
ax = plt.subplot(111)

for i in xrange(5):
#ax.plot(x, i * x, label='y=%dx' %i)
ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend()

plt.show()

 
运行上面的代码后,得到的结果是:
 

legend.PNG

 
如果把那句legend() 的语句去掉,那么图形上的图例也就会消失了。
 
所以legend()的主要只用就是用于在图上标明一个图例,用于说明每条曲线的文字显示。 你也可以把图例控制在左边,右边,底下等等。
 
 
实际使用中,legend()有一个loc参数,用于控制图例的位置。 比如 plot.legend(loc=2) , 这个位置就是4象项中的第二象项,也就是左上角。 loc可以为1,2,3,4 这四个数字。
原文连接:
http://30daydo.com/article/215
转载请注明出处