我认为这可能是一件简单的事情,但经过一个小时的搜索,我没有运气弄清楚我做错了什么.
我正在使用以下代码来读取CSV文件 - 我在读取文件时没有问题,但是当一行包含双引号的字段因为它包含分隔符时,CSV阅读器会忽略双引号并解析字段分为2个单独的字段.
这是我正在使用的代码:
myReader = csv.reader(open(inPath, 'r'), dialect='excel', delimiter=',', quotechar='"')
for row in myReader:
print row,
print len(row)
Run Code Online (Sandbox Code Playgroud)
我的意见:
hello, this is row 1, foo1
hello, this is row 2, foo2
goodbye, "this, is row 3", foo3
Run Code Online (Sandbox Code Playgroud)
这给了我:
['hello', ' this is row 1', ' foo1'] 3
['hello', ' this is row 2', ' foo2'] 3
['goodbye', ' "this', ' is row 3"', ' foo3'] 4
Run Code Online (Sandbox Code Playgroud)
我需要更改什么才能将双引号字段识别为一个字段?我正在使用python 2.6.1版.
谢谢!
当我解释问题时,请耐心等待我,我是如何解决这个问题的,最后我的问题是如何改进它.
我有一个来自离线批处理作业的100,000行csv文件,我需要将其作为正确的模型插入到数据库中.通常,如果这是一个相当直接的加载,只需将CSV文件重新设置为适合模式即可轻松加载; 但是,我不得不做一些需要查询的外部处理,使用SQLAlchemy生成我想要的数据会更方便.
我想要的数据是3个模型,它们代表数据库中3个预先存在的表,每个后续模型都依赖于以前的模型.例如:
Model C --> Foreign Key --> Model B --> Foreign Key --> Model A
Run Code Online (Sandbox Code Playgroud)
因此,模型必须按照A,B和C的顺序插入.我想出了一个生产者/消费者的方法:
- instantiate a multiprocessing.Process which contains a
threadpool of 50 persister threads that have a threadlocal
connection to a database
- read a line from the file using the csv DictReader
- enqueue the dictionary to the process, where each thread creates
the appropriate models by querying the right values and each
thread persists the models in the appropriate order
Run Code Online (Sandbox Code Playgroud)
这比非线程读取/持久化更快,但它比将文件批量加载到数据库中要慢.大约 …
我们正在使用SQLAlchemy声明基础,我有一个方法,我想隔离事务级别.为了解释,有两个进程同时写入数据库,我必须让它们在事务中执行它们的逻辑.默认事务隔离级别是READ COMMITTED,但我需要能够使用SERIALIZABLE隔离级别执行一段代码.
这是如何使用SQLAlchemy完成的?现在,我基本上在我们的模型中有一个方法,它继承自SQLAlchemy的声明性基础,基本上需要以事务方式调用.
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED
from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE
class OurClass(SQLAlchemyBaseModel):
@classmethod
def set_isolation_level(cls, level=ISOLATION_LEVEL_SERIALIZABLE):
cls.get_engine().connect().connection.set_isolation_level(level)
@classmethod
def find_or_create(cls, **kwargs):
try:
return cls.query().filter_by(**kwargs).one()
except NoResultFound:
x = cls(**kwargs)
x.save()
return x
Run Code Online (Sandbox Code Playgroud)
我这样做是为了使用事务隔离级别来调用它,但它没有按照我的预期进行.隔离级别仍然是我在postgres日志中看到的READ COMMITTED.有人可以帮助确定我做错了什么吗?
我正在使用SQLAlchemy 0.5.5
class Foo(OurClass):
def insert_this(self, kwarg1=value1):
# I am trying to set the isolation level to SERIALIZABLE
try:
self.set_isolation_level()
with Session.begin():
self.find_or_create(kwarg1=value1)
except Exception: # if any exception is thrown...
print "I caught an expection."
print sys.exc_info()
finally:
# Make …Run Code Online (Sandbox Code Playgroud) 我很好奇其他人如何在没有DBA的情况下解决了许多(10+)开发人员维护和同步数据库更改的问题?我的意思是,基本上,如果有人想要对数据库进行更改,那么采取哪些策略呢?(即我已经创建了一个'Car'模型,现在我想将适当的DDL应用于数据库等.)
我们主要是一个Python商店,我们的ORM是SQLAlchemy.以前,我们用这样的方式编写了我们的模型来使用我们的ORM创建模型,但是我们最近放弃了这个模型,因为:
我们解决这个问题的方法是基本上有一个"看门人",他会检查数据库中的每个更改,并将所有接受的数据库更改应用到accepted_db_changes.sql文件中,从而需要进行任何数据库更改的开发人员将他们的请求放入proposed_db_changes.sql文件中.我们检查这个文件,并且,当它更新时,我们都将更改应用到我们的开发机器上的个人数据库.我们不在模型上创建索引或约束,它们明确地应用于数据库.
我想知道维护数据库模式的一些策略是什么,如果我们看起来合理的话.
谢谢!
首先,版本:
我们最近升级了在gunicorn后面运行的服务器,以使用gevent异步工作程序而不仅仅是普通的同步工作程序.一切都很好,但我们现在遇到一个问题,试图通过http访问第三方服务,我只是不知道如何追踪可能是什么问题.
简短的堆栈跟踪如下所示:
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/sessions.py", line 295, in post
return self.request('post', url, data=data, **kwargs)
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/sessions.py", line 252, in request
r.send(prefetch=prefetch)
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/models.py", line 625, in send
raise ConnectionError(sockerr)
ConnectionError: [Errno 66] unknown
Run Code Online (Sandbox Code Playgroud)
另一个不同的堆栈跟踪但我们认为它是同一个问题:
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 94, in connect
sock = socket.create_connection((self.host, self.port), self.timeout)
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/gevent/socket.py", line 637, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/home/deploy/.virtualenvs/bapp/lib/python2.7/site-packages/gevent/socket.py", line 769, in getaddrinfo
raise
DNSError: [Errno 66] unknown
Run Code Online (Sandbox Code Playgroud)
起初,我以为这可能是潜在的东西相关的libevent-dns …
目前,我们以及大多数Web框架的序列化工作方式是某种类型的方法调用,它将模型转换为某种类型的格式.在我们的例子中,我们to_dict()在每个模型上都有一个方法,它构造并返回一个键值字典,其中键是字段名,值是实例变量.
在我们的代码中,我们都有以下代码片段:json.dumps(**some_model_object.to_dict())将序列化为some_model_objectjson.最近,我们决定向用户公开一些内部资源,但是如果请求用户不是超级用户,则其中一些资源具有我们不希望在序列化期间传回的特定私有实例值.
我试图想出一个简洁的设计,允许更容易的序列化,以及允许我们序列化为json以外的格式.我认为这是面向方面设计/编程的一个非常好的用例,其中方面尊重请求访问控制并基于请求用户的持久性来序列化对象.
这是类似于我现在的东西:
from framework import current_request
class User(SQLAlchemyDeclarativeModel):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
first_name = Column(Unicode(255))
last_name = Column(Unicode(255))
private_token = Column(Unicode(4096))
def to_dict(self):
serialized = dict((column_name, getattr(self, column_name))
for column_name in self.__table__.c.keys())
# current request might not be bound yet, could be in a unit test etc.
if current_request and not current_request.user.is_superuser():
# we explicitly define the allowed items because if we accidentally add
# a private variable to …Run Code Online (Sandbox Code Playgroud) 我正在努力让厨师执行以下操作:
我知道你可以这样做:
remote_file "some remote file" do
...
not_if "apt-cache search 'mypackage'"
end
Run Code Online (Sandbox Code Playgroud)
但是,我尝试过:
ruby_block "Attempting to install #{node[:bact][:application_name]}" do
block do
cmd = Chef::ShellOut.new("apt-get install -y --force-yes #{node[:bact][:application_name]}")
exec_result = cmd.run_command
if exec_result.exitstatus != 0
Chef::Log.info 'Go grab some coffee, this might be a while....'
resources("execute[install-#{node[:bact][:application_name]}-via-pip]").run_action(:run)
end
end
action :create
end
Run Code Online (Sandbox Code Playgroud)
有没有更简单,更简单的方法来做到这一点?
基本上,我理想的做法是:
begin
package 'some-package-name' do
action :install
done
rescue Chef::Exception
# Do something here
end
Run Code Online (Sandbox Code Playgroud) from bottle import get, post, request
#@route('/login')
@get('/login')
def login_form():
return '''<form method="POST">
<input name="name" type="text" />
<input name="password" type="password" />
</from>'''
#@route('/login', method='POST')
@post('/login')
def login_submit():
name = request.forms.get('name')
password = request.forms.get('password')
if check_login(name, password):
return "<p>Your login was correct</p>"
else:
return "<p>Login failed</p>"
Run Code Online (Sandbox Code Playgroud) python ×7
sqlalchemy ×3
postgresql ×2
aop ×1
apt ×1
bottle ×1
bulkinsert ×1
chef-infra ×1
chef-recipe ×1
csv ×1
database ×1
exception ×1
gevent ×1
gunicorn ×1
orm ×1
performance ×1
transactions ×1