{"record":{"id":"7f2df9658417178b","repo":"apache/beam","slug":"invalid-file-open-mode-s-blobstorageio","errorCode":null,"errorMessage":"Invalid file open mode: %s.","messagePattern":"Invalid file open mode: (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/io/azure/blobstorageio.py","lineNumber":158,"sourceCode":"\n    Returns:\n      Azure Blob Storage file object.\n    Raises:\n      ValueError: Invalid open file mode.\n    \"\"\"\n    if mode == 'r' or mode == 'rb':\n      downloader = BlobStorageDownloader(\n          self.client, filename, buffer_size=read_buffer_size)\n      return io.BufferedReader(\n          DownloaderStream(\n              downloader, read_buffer_size=read_buffer_size, mode=mode),\n          buffer_size=read_buffer_size)\n    elif mode == 'w' or mode == 'wb':\n      uploader = BlobStorageUploader(self.client, filename, mime_type)\n      return io.BufferedWriter(\n          UploaderStream(uploader, mode=mode), buffer_size=128 * 1024)\n    else:\n      raise ValueError('Invalid file open mode: %s.' % mode)\n\n  @retry.with_exponential_backoff(\n      retry_filter=retry.retry_on_beam_io_error_filter)\n  def copy(self, src, dest):\n    \"\"\"Copies a single Azure Blob Storage blob from src to dest.\n\n    Args:\n      src: Blob Storage file path pattern in the form\n           azfs://<storage-account>/<container>/[name].\n      dest: Blob Storage file path pattern in the form\n            azfs://<storage-account>/<container>/[name].\n\n    Raises:\n      TimeoutError: on timeout.\n    \"\"\"\n    src_storage_account, src_container, src_blob = parse_azfs_path(\n        src, get_account=True)\n    dest_container, dest_blob = parse_azfs_path(dest)","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/io/azure/blobstorageio.py#L140-L176","documentation":"BlobStorageIO.open() only supports read ('r'/'rb') and write ('w'/'wb') modes for Azure Blob Storage. Any other mode string (e.g. 'a', 'x', 'r+') reaches the final else branch and raises ValueError. The library deliberately restricts modes because Azure blob access is mapped to either a downloader or an uploader stream.","triggerScenarios":"Calling client.open(path, mode='a'), mode='x', mode='ab', or any mode with '+' (read-write) on an azure.BlobStorageIO client; also passing a mode from misconfigured pipeline options.","commonSituations":"Porting code written for local files or GCS that appends to logs ('a'); typo in mode string like 'w+'; generic file-helper utilities that pass through arbitrary modes.","solutions":["Use mode 'r' or 'rb' for reading and 'w' or 'wb' for writing only","For append semantics, read the blob fully, then rewrite it in 'w' mode with concatenated content","Validate/normalize the mode string before calling open()"],"exampleFix":"// before\nwith client.open('gs-like/path/blob.txt', 'a') as f:\n    f.write('more')\n// after\nexisting = client.open('path/blob.txt', 'r').read() if client.exists('path/blob.txt') else ''\nwith client.open('path/blob.txt', 'w') as f:\n    f.write(existing + 'more')","handlingStrategy":"validation","validationCode":"def valid_mode(mode):\n    return mode in ('r', 'rb', 'w', 'wb')\nif not valid_mode(mode):\n    raise ValueError(f'mode must be r/rb/w/wb, got {mode}')","typeGuard":"def is_supported_mode(mode):\n    return isinstance(mode, str) and mode in {'r', 'rb', 'w', 'wb'}","tryCatchPattern":"try:\n    f = client.open(path, mode)\nexcept ValueError:\n    logging.error('unsupported open mode %r for Azure blob', mode)\n    raise","preventionTips":["Restrict file helpers to r/rb/w/wb when targeting Beam filesystems","Never append to blobs; rewrite whole objects instead","Add a mode assertion before any Beam filesystem open"],"tags":["azure","file-io","invalid-argument"],"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-20T03:17:13.778Z"}