class InputStream(object): """ FCGI_STDIN or FCGI_DATA stream. Uses temporary file to store received data once max_mem bytes have been received. """ def __init__(self, max_mem=1024): self._file = SpooledTemporaryFile(max_mem) self._eof_received = Event() def feed(self, data): if self._eof_received.is_set(): raise IOError('Feeding file beyond EOF mark') if not data: # EOF mark self._file.seek(0) self._eof_received.set() else: self._file.write(data) def __iter__(self): self._eof_received.wait() return iter(self._file) def read(self, size=-1): self._eof_received.wait() return self._file.read(size) def readlines(self, sizehint=0): self._eof_received.wait() return self._file.readlines(sizehint) @property def eof_received(self): return self._eof_received.is_set()
def from_csv( cls, db: Session, title: str, course_id: int, csv_file: SpooledTemporaryFile, ) -> "Lesson": slug = slug_from_title(title) csv_file.seek(0) lines = [ line.decode("utf-8").replace(r"\n", "") for line in csv_file.readlines() ] entries = list( DictReader( lines, delimiter=";", fieldnames=["target", "source", "hint"], )) errors = [ index for index, row in enumerate(entries) if row["target"] is None or row["source"] is None ] if errors: raise HTTPException( status_code=400, detail=f"csv file malformatted at row(s) {errors}.", ) db_lesson = Lesson(title=title, slug=slug, course_id=course_id) db.add(db_lesson) db.commit() db.refresh(db_lesson) for entry in entries: source = list(map(lambda x: x.strip(), entry["source"].split("|"))) target = list(map(lambda x: x.strip(), entry["target"].split("|"))) hint = entry["hint"] vocab = Vocab(lesson_id=db_lesson.id, source=source, target=target, hint=hint) db.add(vocab) db.commit() db.refresh(db_lesson) return db_lesson
class InputStream(object): """ FCGI_STDIN or FCGI_DATA stream. Uses temporary file to store received data once max_mem bytes have been received. """ def __init__(self, max_mem=1024): self._file = SpooledTemporaryFile(max_mem) self._eof_received = Event() def __del__(self): self._file.close() def feed(self, data): if self._eof_received.is_set(): raise IOError('Feeding file beyond EOF mark') if not data: # EOF mark self._file.seek(0) self._eof_received.set() else: if isinstance(data, six.text_type): data = data.encode("ISO-8859-1") self._file.write(data) def __iter__(self): self._eof_received.wait() return iter(self._file) def read(self, size=-1): self._eof_received.wait() return self._file.read(size) def readline(self, size=-1): self._eof_received.wait() return self._file.readline(size) def readlines(self, sizehint=0): self._eof_received.wait() return self._file.readlines(sizehint) @property def eof_received(self): return self._eof_received.is_set()
from tempfile import SpooledTemporaryFile f = SpooledTemporaryFile(max_size=1024) f.write("Hello") f.seek(0) print(f.readlines()) f.close()