我的一些用户(都使用 Mac)已将 Excel 上传到我的应用程序中,但应用程序拒绝了它,因为该文件似乎是空的。经过一些调试后,我确定该文件是以 Strict Open XML Spreedsheet 格式保存的,并且 openpyxl (2.6.0) 不会发出错误,而是向 stderr 打印警告。
要重现,请打开一个文件,添加几行并保存为 Strict Open XML Spreedsheet (*.xlsx) 格式。
import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
workbook = openpyxl.load_workbook(filename=f)
Run Code Online (Sandbox Code Playgroud)
这将打印以下警告,但不会引发任何异常:
UserWarning: File contains an invalid specification for Sheet1. This will be removed
Run Code Online (Sandbox Code Playgroud)
此外,工作簿似乎没有工作表:
assert workbook.get_sheet_names() == []
Run Code Online (Sandbox Code Playgroud)
我现在已经有 3 位 Mac 用户遇到了这个问题。Mac 似乎有时会默认使用这种 Strict Open XML Spreedsheet 格式。如果这是正常情况,那么 openpyxl 应该能够处理它。否则,如果 openpyxl 只抛出异常那就太好了。作为解决方法,我似乎可以执行以下操作:
import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
workbook = openpyxl.load_workbook(filename=f)
if not workbook.get_sheet_names():
raise Exception("The Excel …Run Code Online (Sandbox Code Playgroud) 鉴于HBase是一个数据库,其文件存储在HDFS中,它如何能够随机访问HDFS中的单个数据?通过哪种方法完成了?
HBase内部将您的数据放在HDFS上存在的索引"StoreFiles"中,以进行高速查找.有关HBase如何实现其目标的更多信息,请参见第5章,数据模型和本章的其余部分.
扫描这两个章节并没有揭示这个问题的高级答案.
那么HBase如何实现对存储在HDFS中的文件的随机访问?
在Python模块happybase中,我可以检索具有以给定字符串开头的行键的所有行(即,使用部分行键进行搜索).
假设我有一个格式为(ID | TYPE | DATE)的rowkey,我可以通过以下方式找到ID为1且TYPE为A的所有行:
import happybase
connection = happybase.Connection('hmaster-host.com')
table = connection.table('table_name')
for key, data in table.scan(row_prefix="1|A|"):
print key, data
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是一个完全客户端的Java程序,适用于任何尝试使用Java HBase API进行基础操作的人,但我只能使用完整的行键搜索一行:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;
//class foo {
public static void main(String[] args) {
Configuration conf = new Configuration();
conf.addResource(new Path("C:\\core-site.xml"));
conf.addResource(new Path("C:\\hbase-site.xml"));
HTable table = new HTable(conf, "table_name");
Result row = table.get(new Get(Bytes.toBytes("1|A|2014-01-01 00:00")));
printRow(row);
}
public static void printRow(Result result) {
String …Run Code Online (Sandbox Code Playgroud) tl; dr一个装饰的方法route无法处理并发请求,而Flask是在多个工作线程和线程启动的gunicorn后面提供的,而两个不同的方法处理并发请求很好.为什么会这样,并且如何同时提供相同的路由?
我有这个简单的烧瓶应用程序:
from flask import Flask, jsonify
import time
app = Flask(__name__)
@app.route('/foo')
def foo():
time.sleep(5)
return jsonify({'success': True}), 200
@app.route('/bar')
def bar():
time.sleep(5)
return jsonify({'success': False}), 200
Run Code Online (Sandbox Code Playgroud)
如果我通过以下方式运行:
gunicorn test:app -w 1 --threads 1
Run Code Online (Sandbox Code Playgroud)
如果我在浏览器中快速打开/bar并/foo在两个不同的选项卡中,我先点击输入的选项卡将在5秒内加载,第二个选项卡将在10秒内加载.这是有道理的,因为gunicorn正在运行一个带有一个线程的worker.
如果我通过以下任一方式运行:
gunicorn test:app -w 1 --threads 2
gunicorn test:app -w 2 --threads 1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,打开/foo并/bar在两个不同的标签中都需要5秒钟.这是有道理的,因为gunicorn正在运行一个有两个线程的工人,或者两个工作者每个都有一个线程,并且可以同时为这两个路由提供服务.
但是,如果我同时打开两个/foo,无论gunicorn配置如何,第二个选项卡将始终需要10秒.
如何通过route服务并发请求获得相同的方法?
在python中,为了制作Type 5 UUID,我们可以简单地做到:
import uuid
print uuid.uuid5(uuid.NAMESPACE_URL, 'my string')
Run Code Online (Sandbox Code Playgroud)
通过java.util.UUID的java文档,我看不到如何做到这一点.首先,没有提到类型5.他们有3型,但签名是:
nameUUIDFromBytes(byte[] name)
Static factory to retrieve a type 3 (name based) UUID based on the specified byte array.
Run Code Online (Sandbox Code Playgroud)
我们如何在Java中创建Type 5 UUID?
我想在一个线程中运行一个进程(它在一个大型数据库表上进行迭代).线程正在运行时,我只想让程序等待.如果该线程花费的时间超过30秒,我想杀死该线程并执行其他操作.通过杀死线程,我的意思是我希望它停止活动并优雅地释放资源.
我想这样做是通过最好的方式Thread()的join(delay)和is_alive()功能,以及Event.使用join(delay)我可以让我的程序等待30秒以完成线程,并通过使用该is_alive()函数我可以确定线程是否已完成其工作.如果它尚未完成其工作,则设置该事件,并且线程知道在该点停止工作.
这种方法是否有效,这是解决我的问题陈述的最pythonic方式吗?
以下是一些示例代码:
import threading
import time
# The worker loops for about 1 minute adding numbers to a set
# unless the event is set, at which point it breaks the loop and terminates
def worker(e):
data = set()
for i in range(60):
data.add(i)
if not e.isSet():
print "foo"
time.sleep(1)
else:
print "bar"
break
e = threading.Event()
t = threading.Thread(target=worker, args=(e,))
t.start()
# wait 30 seconds …Run Code Online (Sandbox Code Playgroud) 我正在使用Python C Extension文档来定义新类型,并且刚刚完成了对数据属性提供更精细的控制部分.
在本节中,他们更改示例代码以确保结构的first和last属性Noddy永远不会NULL,例如通过将属性初始化为空字符串new并添加TypeError在用户尝试删除或以其他方式设置这些属性时引发的getter和setter 到Null.
此外(和我的问题点),笔者改变了所有的Py_XDECREF到Py_DECREF这些属性,指出:
通过这些更改,我们可以确保第一个和最后一个成员永远不会为NULL,因此我们几乎可以在所有情况下删除对NULL值的检查.这意味着大多数Py_XDECREF()调用都可以转换为Py_DECREF()调用.我们无法更改这些调用的唯一地方是在deallocator中,这些成员的初始化可能在构造函数中失败.
在我看来,使用它会更安全Py_XDECREF,因为它会Py_DECREF导致a segmentation fault传递一个NULL值.
使用Py_DECREF结束有Py_XDECREF什么好处?
我总是告诉新人,一种简单的方法来记住旧式的Oracle外连接语法就是这样
(+)标志位于您认为应该在的位置的另一侧.
左连接:
select * from foo, bar
where foo.id = bar.id(+)
Run Code Online (Sandbox Code Playgroud)
正确加入:
select * from foo, bar
where foo.id(+) = bar.id
Run Code Online (Sandbox Code Playgroud)
我相信我在大学里学到了这一点,但是在两边都有(+)标志的目的是什么?它是否只是表示"即使另一侧的那些行在这一侧也不匹配"?但那似乎太复杂了.选择"(+)"并将其放在没有匹配的一侧的目的是什么?
我有一个被许多客户使用的服务器。为了更轻松地查找日志条目,我希望允许客户端为每个请求提供一个 UUID,然后在请求期间在每个日志消息前面添加该 UUID。这样做的好处是,如果客户遇到一些错误,他们可以向我提供 ID,这样我就可以在日志中快速找到它。我认为这是相当标准的;在Python中有完成这个任务的惯用语吗?
我可以通过手动将 uuid 添加到每条日志消息中来天真地做到这一点:
import uuid
import logging
logger = logging.getLogger(__name__)
def request(*args, **kwargs):
_id = args.get("_id", str(uuid.uuid4()))
logger.info("{} - {}".format(_id, "Starting request"))
Run Code Online (Sandbox Code Playgroud)
我还可以为每个请求创建一个新的记录器,并更改formatter以照顾我的前缀:
import uuid
import logging
def build_logger(_id):
logger = logging.getLogger(_id)
# ...
formatter = logging.Formatter('%(name)s - %(message)s')
# ...
return logger
import uuid
def request(*args, **kwargs):
_id = args.get("_id", str(uuid.uuid4()))
logger = build_logger(_id)
Run Code Online (Sandbox Code Playgroud)
然后我想我也许可以创建一个代理类,它将拦截对 、 、 等的调用info,debug并exception在前面添加 uuid。就像是:
import uuid
import logging
logger = logging.getLogger(__name__)
class …Run Code Online (Sandbox Code Playgroud) 如何转义:传递给的字符串内部text()以防止 SQLAlchemy 将其视为绑定参数?
conn.execute(text("select 'My favorite emoticon is :p' from dual")).fetchone()
Run Code Online (Sandbox Code Playgroud)
将导致:
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'p'
(Background on this error at: http://sqlalche.me/e/14/cd3x)
Run Code Online (Sandbox Code Playgroud)
'
这有点令人困惑,因为从数据库中选择字符串的上下文来看,select 'foo :bar baz'绑定参数在这里没有多大意义。
看起来我可以使用 a\来逃避这个问题,但它说它已被弃用:
>>> conn.execute(text("select 'My favorite emoticon is \:p' from dual")).fetchone()
<stdin>:1: DeprecationWarning: invalid escape sequence \:
('My favorite emoticon is :p',)
Run Code Online (Sandbox Code Playgroud) python ×6
hbase ×2
java ×2
flask ×1
gunicorn ×1
hadoop ×1
hdfs ×1
logging ×1
openpyxl ×1
oracle ×1
python-3.x ×1
python-c-api ×1
sqlalchemy ×1
syntax ×1
uuid ×1