Lendo objetos semelhantes a arquivos Python em C | Python
Escrever código de extensão C que consome dados de qualquer objeto semelhante a arquivo Python (por exemplo, arquivos normais, objetos StringIO, etc.). read()
O método deve ser chamado repetidamente para consumir dados em um objeto semelhante a um arquivo e executar etapas para decodificar adequadamente os dados resultantes.
A seguir, é fornecida uma função de extensão C que apenas consome todos os dados em um objeto semelhante a um arquivo e os despeja na saída padrão.
#define CHUNK_SIZE 8192
static
PyObject* py_consume_file(PyObject* self, PyObject* args)
{
PyObject* obj;
PyObject* read_meth;
PyObject* result = NULL;
PyObject* read_args;
if
(!PyArg_ParseTuple(args,
"O"
, &obj)) {
return
NULL;
}
if
((read_meth = PyObject_GetAttrString(obj,
"read"
)) == NULL) {
return
NULL;
}
read_args = Py_BuildValue(
"(i)"
, CHUNK_SIZE);
while
(1) {
PyObject* data;
PyObject* enc_data;
char
* buf;
Py_ssize_t len;
if
((data = PyObject_Call(read_meth, read_args, NULL)) == NULL) {
goto
final;
}
if
(PySequence_Length(data) == 0) {
Py_DECREF(data);
break
;
}
if
((enc_data = PyUnicode_AsEncodedString(data,
"utf-8"
,
"strict"
)) == NULL) {
Py_DECREF(data);
goto
final;
}
PyBytes_AsStringAndSize(enc_data, &buf, &len);
write(1, buf, len);
Py_DECREF(enc_data);
Py_DECREF(data);
}
result = Py_BuildValue(
""
);
final:
Py_DECREF(read_meth);
Py_DECREF(read_args);
return
result;
}
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva