Lesen von Python File-ähnlichen Objekten aus C | Python
Schreiben von C-Erweiterungscode, der Daten von einem Python-dateiähnlichen Objekt (z. B. normalen Dateien, StringIO-Objekten usw.) verwendet. read()
Die Methode muss wiederholt aufgerufen werden, um Daten für ein dateiähnliches Objekt zu verbrauchen und Schritte zu unternehmen, um die resultierenden Daten ordnungsgemäß zu dekodieren.
Im Folgenden wird eine C-Erweiterungsfunktion angegeben, die lediglich alle Daten eines dateiähnlichen Objekts verbraucht und auf die Standardausgabe ausgibt.
#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;
}