小编Lev*_*sky的帖子

解码python 3中的base64字符串(带或不带lxml)

我知道这看起来很容易,我想问题是我只是没有清楚地理解所有这些字节-str-unicode(和编码解码,坦率地说)的东西.

我一直在努力让我的工作代码在Python 3上运行.我坚持使用的部分是当我解析XML lxml并解码XML中的base64字符串时.

代码现在以下列方式工作:

我使用XPath查询检索二进制数据'.../binary/text()'.这将生成包含lxml.etree._ElementUnicodeResult对象的单元素列表.然后,使用python 2,我能够做到:

decoded = source.decode('base64')
Run Code Online (Sandbox Code Playgroud)

最后

output = numpy.frombuffer(decoded)
Run Code Online (Sandbox Code Playgroud)

但是,在python 3上,我收到一条错误消息

AttributeError: 'lxml.etree._ElementUnicodeResult' object has no attribute 'decode'
Run Code Online (Sandbox Code Playgroud)

这并不令人惊讶,因为它lxml.etree._ElementUnicodeResult是一个子类str.

另一种方法是str使用相同的数据获得真实

 binary = tree.xpath('//binary')[0]
 binary_string = binary.text
Run Code Online (Sandbox Code Playgroud)

那基本上是一样的.那么我该怎么做才能从base64解码呢?我已经看过了base64模块,但它需要一个bytes对象作为参数,我不能想到的呈现方式strbytes,因为如果我试图建立一个bytes对象,Python会编码字符串,这我不不需要.

谷歌搜索进一步,我遇到了binascii模块(base64无论如何我都是间接调用的,如果我没有弄错的话),但是调用binascii.b2a_base64()我的字符串会产生

TypeError: 'str' does not support the buffer interface
Run Code Online (Sandbox Code Playgroud)

PS我甚至找到了一个关于如何在Python 3中解码十六进制字符串的问题,但这是通过专用方法完成的,bytes.fromhex()所以我看不出它会有什么帮助. …

python base64 lxml python-3.x

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

使用opencv确定点是在形状的内部还是外部

我有白色背景和简单形状的图像(每个图像有一个形状).我想确定某个点(x,y)是否在形状内部.我怎么能用opencv做到这一点?

opencv

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

如何从单个迭代的元组中填充两个(或更多)numpy数组?

我遇到的实际问题是我想(float, str)在RAM中存储一个长排序的元组列表.普通列表不适合我的4Gb RAM,所以我想我可以使用两个numpy.ndarray.

数据源是可重复的2元组.numpyfromiter功能,但我怎么用呢?迭代中的项目数是未知的.由于内存限制,我无法首先将其消耗到列表中.我想到了itertools.tee,但这似乎增加了很多内存开销.

我想我能做的就是以块的形式使用迭代器并将它们添加到数组中.然后我的问题是,如何有效地做到这一点?我应该制作2个2D阵列并为它们添加行吗?(然后我需要将它们转换为1D).

或者可能有更好的方法?我真正需要的是通过对数时间内相应数字的值搜索字符串数组(这就是我想按浮点值排序的原因)并尽可能保持紧凑.

PS迭代没有排序.

python arrays iteration numpy

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

使用+和+ =在python中添加列表之间的区别

我注意到在尝试p= p+i不同的列表时, p += i 例如:

test = [0, 1, 2, 3,]
p = test
test1 = [8]
p = p + test1
print test
Run Code Online (Sandbox Code Playgroud)

在上面的代码中test打印出原始值[0, 1, 2, 3,]

但是如果我在下面p = p + test1p += test1As 切换

test = [0, 1, 2, 3,]
p = test
test1 = [8]

p += test1

print test
Run Code Online (Sandbox Code Playgroud)

test 现在等于 [0, 1, 2, 3, 8]

价值不同的原因是什么?

python list

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

如何在bash上生成随机数据的日期范围

我需要在一年中的所有日子生成字符串

例如:

MIN_DATE=01.01.2012

MAX_DATE=31.12.2012

for date in {1...366..1}
 do
 echo ...
done
Run Code Online (Sandbox Code Playgroud)

bash datetime date

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

g ++与python.h,如何编译

我用g ++编译一个测试代码没有任何问题.

#include "Python.h"  

int main(int argc, char** argv)  
{  
    Py_Initialize();  
    PyRun_SimpleString("import pylab");  
    PyRun_SimpleString("pylab.plot(range(5))");  
    PyRun_SimpleString("pylab.show()");  
    Py_Exit(0);  
} 
Run Code Online (Sandbox Code Playgroud)

g++ -o test test.cpp -I/usr/include/python2.7/ -lpython2.7 工作正常,运行.

但是当我尝试将此代码嵌入到另一个项目中时,它会失败.这真让我困惑.

Makefile如下所示.

CXX=g++  
CXXFLAGS=-DIB_USE_STD_STRING -Wall -Wno-switch -g  
ROOT_DIR=..  
BASE_SRC_DIR=${ROOT_DIR}/PosixSocketClient  
INCLUDES=-I${ROOT_DIR}/Shared/ -I${BASE_SRC_DIR} -I/usr/include/python2.7  
LIBRARY=-L/usr/lib/python2.7/config  
TARGET=eu  

$(TARGET):  
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o EClientSocketBase.o -c   $(BASE_SRC_DIR)/EClientSocketBase.cpp  
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o EPosixClientSocket.o -c   $(BASE_SRC_DIR)/EPosixClientSocket.cpp  
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o PosixTestClient.o -c PosixTestClient.cpp  
    $(CXX) $(CXXFLAGS) $(INCLUDES) -o Main.o -c Main.cpp
    $(CXX) $(LIBRARY) -lpython2.7 -o $@ EClientSocketBase.o EPosixClientSocket.o PosixTestClient.o Main.o 

clean:  
    rm -f $(TARGET) …
Run Code Online (Sandbox Code Playgroud)

c++ python makefile

7
推荐指数
1
解决办法
9637
查看次数

使用multiprocessing.Manager.list而不是真实列表会使计算花费很长时间

我想multiprocessing从这个例子开始尝试不同的使用方法:

$ cat multi_bad.py 
import multiprocessing as mp
from time import sleep
from random import randint

def f(l, t):
#   sleep(30)
    return sum(x < t for x in l)

if __name__ == '__main__':
    l = [randint(1, 1000) for _ in range(25000)]
    t = [randint(1, 1000) for _ in range(4)]
#   sleep(15)
    pool = mp.Pool(processes=4)
    result = pool.starmap_async(f, [(l, x) for x in t])
    print(result.get())
Run Code Online (Sandbox Code Playgroud)

这里l是一个列表,当生成4个进程时,它会被复制4次.为避免这种情况,文档页面提供了使用队列,共享数组或代理对象multiprocessing.Manager.对于最后一个,我改变了以下定义l:

$ diff multi_bad.py multi_good.py 
10c10,11
<     l …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

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

使用callable(x)vs.hasattr(x,"__ call__")

我正在编写针对3.2及更高版本的Python.看起来使用内置函数callable是最简单有效的方法.我见过的建议hasattr(x, "__call__"),collections.Callable(x)以及只使用try/except周围尝试的呼叫.

我已经测试了可调用的项目(类和函数),使用timeit100,000次迭代; 在两种情况下,使用callable只需要检查属性的大约75%的时间.当项目不可调用(整数和字符串)时,使用与类或函数相同的可调用停留时,检查属性的价格比类或函数贵2.3倍.我没想到会有这种差异,但它也倾向于采用简洁明了的callable(x)方法.

但我相对较新的Python而且没有专家,所以我不知道我应该使用hasattr方法或其他方法吗?

FWIW,各种时间的结果如下.第一个字符只是t表示timeit,第二个字符表示被测对象的类型(c = class,f = function,i = integer,s = string),其余表示方法(attr-check属性, call - use callable,try - use try/except).

tcattr 0.03665385400199739
tccall 0.026238360142997408
tctry 0.09736267629614304
tfattr 0.03624538065832894
tfcall 0.026362861895904643
tftry 0.032501874250556284
tiattr 0.08297350149314298
ticall 0.025826044152381655
titry 0.10657657453430147
tsattr 0.0840187013927789
tscall 0.02585409547373274
tstry 0.10742772077628615

python callable python-3.x

7
推荐指数
3
解决办法
1226
查看次数

将多个文件流式传输到 Python 中的可读对象中

我有一个使用file.read(len)方法处理来自文件的二进制数据的函数。但是,我的文件很大,被切成许多小文件,每个文件 50 MB。是否有一些包装类可以将许多文件馈送到缓冲流中,并提供 read() 方法?

fileinput.FileInput可以做这样的事情,但它只支持逐行读取(readline()没有参数的方法)并且没有read(len)指定要读取的字节数。

python file-io python-2.7

7
推荐指数
3
解决办法
4886
查看次数

functools.wraps不允许我用Python 3中的类包装函数

我想为一些将文件作为第一个参数的函数编写装饰器.装饰器必须实现上下文管理器协议(即将包装函数转换为上下文管理器),所以我想我需要用类包装函数.

我对装饰模式并不熟悉,之前从未实现过上下文管理器,但是我写的内容在Python 2.7中有效,如果我注释掉它,它也适用于Python 3.3 wraps.

from functools import wraps
def _file_reader(func):
    """A decorator implementing the context manager protocol for functions
    that read files."""
#   @wraps(func)
    class CManager:
        def __init__(self, source, *args, **kwargs):
            self.source = source
            self.args = args
            self.kwargs = kwargs
            self.close = kwargs.get('close', True)

        def __enter__(self):
            # _file_obj is a little helper that opens the file for reading
            self.fsource = _file_obj(self.source, 'r') 
            return func(self.fsource, *self.args, **self.kwargs)

        def __exit__(self, exc_type, exc_value, traceback):
            if self.close:
                self.fsource.close()
            return False …
Run Code Online (Sandbox Code Playgroud)

python decorator contextmanager python-3.x functools

6
推荐指数
1
解决办法
2256
查看次数