{"record":{"id":"2b9a6daf56c9e19e","repo":"apache/beam","slug":"delimiter-must-be-a-non-empty-bytes-sequence","errorCode":null,"errorMessage":"Delimiter must be a non-empty bytes sequence.","messagePattern":"Delimiter must be a non-empty bytes sequence\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/io/textio.py","lineNumber":164,"sourceCode":"        compression_type=compression_type,\n        validate=validate)\n\n    self._strip_trailing_newlines = strip_trailing_newlines\n    self._compression_type = compression_type\n    self._coder = coder\n    self._buffer_size = buffer_size\n    if skip_header_lines < 0:\n      raise ValueError(\n          'Cannot skip negative number of header lines: %d' % skip_header_lines)\n    elif skip_header_lines > 10:\n      _LOGGER.warning(\n          'Skipping %d header lines. Skipping large number of header '\n          'lines might significantly slow down processing.')\n    self._skip_header_lines = skip_header_lines\n    self._header_matcher, self._header_processor = header_processor_fns\n    if delimiter is not None:\n      if not isinstance(delimiter, bytes) or len(delimiter) == 0:\n        raise ValueError('Delimiter must be a non-empty bytes sequence.')\n      if self._is_self_overlapping(delimiter):\n        raise ValueError('Delimiter must not self-overlap.')\n    self._delimiter = delimiter\n    if escapechar is not None:\n      if not (isinstance(escapechar, bytes) and len(escapechar) == 1):\n        raise ValueError(\n            \"escapechar must be bytes of size 1: '%s'\" % escapechar)\n    self._escapechar = escapechar\n\n  def display_data(self):\n    parent_dd = super().display_data()\n    parent_dd['strip_newline'] = DisplayDataItem(\n        self._strip_trailing_newlines, label='Strip Trailing New Lines')\n    parent_dd['buffer_size'] = DisplayDataItem(\n        self._buffer_size, label='Buffer Size')\n    parent_dd['coder'] = DisplayDataItem(self._coder.__class__, label='Coder')\n    return parent_dd\n","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/io/textio.py#L146-L182","documentation":"In _TextSource.__init__, a custom record delimiter passed to a text-based I/O transform must be a non-empty bytes object. The library throws ValueError immediately at construction when delimiter is not bytes or is empty, because delimiters are used in binary scanning of file data.","triggerScenarios":"Passing delimiter='' to ReadFromText/WriteToText, or passing a str like ',' instead of b',', or any non-bytes sequence such as a list.","commonSituations":"Copy-pasting examples with string delimiters in Python 3 (where str != bytes), or trying to disable delimiter handling by passing an empty string.","solutions":["Pass a bytes value, e.g. delimiter=b'\\n' or delimiter=b','","Use a non-empty bytes delimiter; to disable delimiter handling pass delimiter=None","Encode your string delimiter: delimiter=my_str.encode('utf-8')"],"exampleFix":"// before\nReadFromText('gs://bucket/file', delimiter=',')\n// after\nReadFromText('gs://bucket/file', delimiter=b',')","handlingStrategy":"validation","validationCode":"if delimiter is not None and (not isinstance(delimiter, bytes) or len(delimiter) == 0):\n    raise ValueError('delimiter must be a non-empty bytes object, got %r' % (delimiter,))","typeGuard":"def is_valid_delimiter(d) -> bool:\n    return d is None or (isinstance(d, bytes) and len(d) > 0)","tryCatchPattern":"try:\n    src = ReadFromText(path, delimiter=delim)\nexcept ValueError as e:\n    if 'Delimiter' in str(e):\n        delim = delim.encode('utf-8') if isinstance(delim, str) else None\n        src = ReadFromText(path, delimiter=delim)\n    else:\n        raise","preventionTips":["Always use bytes literals (b',', b'\\t') for delimiters in Python 3","Remember delimiter=None disables custom delimiters — don't pass ''","Unit-test I/O transforms construction with the exact args used in production"],"tags":["python","beam","io","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}