A batch job in another language integrated through a shared schema couples the two deployments; integrated through a file it does not.
PHP writes a CSV to object storage, emits an event.
Python reads it, writes a result file, emits an event.
PHP reads the result.
what this avoids:
a shared schema, and a migration that breaks both
an ORM model maintained twice
a deployment order between them
what it costs:
latency, and a format nobody owns unless somebody does.
A file with a documented schema is a weaker coupling than a shared table and is much easier to reason about during an incident, because the artefact can be inspected. The failure mode is the format drifting silently, so a header check on read is worth the six lines — and naming an owner for the format is what stops it drifting at all.