| 223 | |
| 224 | class CsvItemExporter(BaseItemExporter): |
| 225 | def __init__( |
| 226 | self, |
| 227 | file: BytesIO, |
| 228 | include_headers_line: bool = True, |
| 229 | join_multivalued: str = ",", |
| 230 | errors: str | None = None, |
| 231 | **kwargs: Any, |
| 232 | ): |
| 233 | super().__init__(dont_fail=True, **kwargs) |
| 234 | if not self.encoding: |
| 235 | self.encoding = "utf-8" |
| 236 | self.include_headers_line = include_headers_line |
| 237 | self.stream = TextIOWrapper( |
| 238 | file, |
| 239 | line_buffering=False, |
| 240 | write_through=True, |
| 241 | encoding=self.encoding, |
| 242 | newline="", # Windows needs this https://github.com/scrapy/scrapy/issues/3034 |
| 243 | errors=errors, |
| 244 | ) |
| 245 | self.csv_writer = csv.writer(self.stream, **self._kwargs) |
| 246 | self._headers_not_written = True |
| 247 | self._join_multivalued = join_multivalued |
| 248 | |
| 249 | def serialize_field( |
| 250 | self, field: Mapping[str, Any] | Field, name: str, value: Any |