小编Mat*_*sen的帖子

openpyxl 无法读取严格的 Open XML 电子表格格式:用户警告:文件包含 Sheet1 的无效规范。这将被删除

我的一些用户(都使用 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)

python python-3.x openpyxl

13
推荐指数
1
解决办法
2万
查看次数

HBase如何启用随机访问HDFS?

鉴于HBase是一个数据库,其文件存储在HDFS中,它如何能够随机访问HDFS中的单个数据?通过哪种方法完成了?

Apache HBase参考指南:

HBase内部将您的数据放在HDFS上存在的索引"StoreFiles"中,以进行高速查找.有关HBase如何实现其目标的更多信息,请参见第5章,数据模型和本章的其余部分.

扫描这两个章节并没有揭示这个问题的高级答案.

那么HBase如何实现对存储在HDFS中的文件的随机访问?

hadoop hbase hdfs

10
推荐指数
1
解决办法
3378
查看次数

Hbase Java API:检索与部分行键匹配的所有行

在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)

java hbase

10
推荐指数
1
解决办法
2万
查看次数

如何让Flask/Gunicorn处理同一路由的并发请求?

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 flask gunicorn

10
推荐指数
1
解决办法
2167
查看次数

如何在Java中创建Type 5 UUID?

在python中,为了制作Type 5 UUID,我们可以简单地做到:

import uuid
print uuid.uuid5(uuid.NAMESPACE_URL, 'my string')
Run Code Online (Sandbox Code Playgroud)

通过java.util.UUIDjava文档,我看不到如何做到这一点.首先,没有提到类型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?

java uuid

10
推荐指数
1
解决办法
6170
查看次数

大多数Pythonic方式在一段时间后杀死一个线程

我想在一个线程中运行一个进程(它在一个大型数据库表上进行迭代).线程正在运行时,我只想让程序等待.如果该线程花费的时间超过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 multithreading

9
推荐指数
2
解决办法
1万
查看次数

对于Python C Extensions,使用Py_DECREF而不是Py_XDECREF有什么好处?

我正在使用Python C Extension文档来定义新类型,并且刚刚完成了对数据属性提供更精细的控制部分.

在本节中,他们更改示例代码以确保结构的firstlast属性Noddy永远不会NULL,例如通过将属性初始化为空字符串new并添加TypeError在用户尝试删除或以其他方式设置这些属性时引发的getter和setter 到Null.

此外(和我的问题点),笔者改变了所有的Py_XDECREFPy_DECREF这些属性,指出:

通过这些更改,我们可以确保第一个和最后一个成员永远不会为NULL,因此我们几乎可以在所有情况下删除对NULL值的检查.这意味着大多数Py_XDECREF()调用都可以转换为Py_DECREF()调用.我们无法更改这些调用的唯一地方是在deallocator中,这些成员的初始化可能在构造函数中失败.

在我看来,使用它会更安全Py_XDECREF,因为它会Py_DECREF导致a segmentation fault传递一个NULL值.

使用Py_DECREF结束有Py_XDECREF什么好处?

python python-c-api python-c-extension

9
推荐指数
1
解决办法
1376
查看次数

旧样式Oracle外连接语法 - 为什么在左外连接中找到等号右侧的(+)?

我总是告诉新人,一种简单的方法来记住旧式的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)

我相信我在大学里学到了这一点,但是在两边都有(+)标志的目的是什么?它是否只是表示"即使另一侧的那些行在这一侧也不匹配"?但那似乎太复杂了.选择"(+)"并将其放在没有匹配的一侧的目的是什么?

oracle syntax

8
推荐指数
1
解决办法
1万
查看次数

在某些请求期间将标识符添加到 python 记录器的惯用方法?

我有一个被许多客户使用的服务器。为了更轻松地查找日志条目,我希望允许客户端为每个请求提供一个 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)

然后我想我也许可以创建一个代理类,它将拦截对 、 、 等的调用infodebugexception在前面添加 uuid。就像是:

import uuid
import logging
logger = logging.getLogger(__name__)

class …
Run Code Online (Sandbox Code Playgroud)

python logging

8
推荐指数
1
解决办法
8700
查看次数

SQLAlchemy 如何转义 text() 内部的绑定参数?

如何转义:传递给的字符串内部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 sqlalchemy

8
推荐指数
1
解决办法
2036
查看次数