我知道这看起来很容易,我想问题是我只是没有清楚地理解所有这些字节-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对象作为参数,我不能想到的呈现方式str为bytes,因为如果我试图建立一个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()所以我看不出它会有什么帮助. …
我有白色背景和简单形状的图像(每个图像有一个形状).我想确定某个点(x,y)是否在形状内部.我怎么能用opencv做到这一点?
我遇到的实际问题是我想(float, str)在RAM中存储一个长排序的元组列表.普通列表不适合我的4Gb RAM,所以我想我可以使用两个numpy.ndarray.
数据源是可重复的2元组.numpy有fromiter功能,但我怎么用呢?迭代中的项目数是未知的.由于内存限制,我无法首先将其消耗到列表中.我想到了itertools.tee,但这似乎增加了很多内存开销.
我想我能做的就是以块的形式使用迭代器并将它们添加到数组中.然后我的问题是,如何有效地做到这一点?我应该制作2个2D阵列并为它们添加行吗?(然后我需要将它们转换为1D).
或者可能有更好的方法?我真正需要的是通过对数时间内相应数字的值搜索字符串数组(这就是我想按浮点值排序的原因)并尽可能保持紧凑.
PS迭代没有排序.
我注意到在尝试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 + test1用p += 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]
价值不同的原因是什么?
我需要在一年中的所有日子生成字符串
例如:
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) 我用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) 我想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) 我正在编写针对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
我有一个使用file.read(len)方法处理来自文件的二进制数据的函数。但是,我的文件很大,被切成许多小文件,每个文件 50 MB。是否有一些包装类可以将许多文件馈送到缓冲流中,并提供 read() 方法?
类fileinput.FileInput可以做这样的事情,但它只支持逐行读取(readline()没有参数的方法)并且没有read(len)指定要读取的字节数。
我想为一些将文件作为第一个参数的函数编写装饰器.装饰器必须实现上下文管理器协议(即将包装函数转换为上下文管理器),所以我想我需要用类包装函数.
我对装饰模式并不熟悉,之前从未实现过上下文管理器,但是我写的内容在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)