Google Cloud Storage gcsfs - 将 .tar 文件直接读入 python
Google Cloud Storage gcsfs - read a .tar file directly into python
我在 GCS 中有一个 .tar 文件,我希望能够直接将文件读入 python,而无需先在某处下载文件的中间步骤。
我在想这样的事情:
import gcsfs
fs = gcsfs.GCSFileSystem(project='my-google-project')
with fs.open('my_bucket/my_tar_file.tar', 'rb') as f:
tarfile.open(f)
但是 f
是一个已经打开的文件连接,因此当然 .open
再次不起作用。这可能吗?
tarfile.open
函数接受一个fileobj
参数:
If fileobj
is specified, it is used as an alternative to a file object opened in binary mode for name. It is supposed to be at position 0.
所以,这个解决方案应该有效:
import contextlib
import tarfile
import gcsfs
fs = gcsfs.GCSFileSystem(project="my-google-project")
with contextlib.closing(tarfile.open(fileobj=fs, mode='r:')) as f:
for entry in f:
...
别忘了关闭您的 fs
文件。
我使用了 tar 文件库,就像@LaurentLAPORTE 所做的那样,但以不同的方式实现了它。使用对象 fs
打开 tar 文件,然后使用 tarfile.open
的文件对象并循环遍历 tar 文件成员以获取文件的内容。
import tarfile
import gcsfs
fs = gcsfs.GCSFileSystem(project="your-project-here")
with fs.open('your-bucket/test.tar') as f:
tr = tarfile.open(fileobj=f, mode='r:')
for member in tr.getmembers():
f=tr.extractfile(member)
content=f.read()
print(content.decode('utf-8')) // add decode since output in bytes and not in utf-8 format
tr.close()
test.tar(也上传到我的存储桶)包含 sample_file.txt,其内容为:
测试运行:
我在 GCS 中有一个 .tar 文件,我希望能够直接将文件读入 python,而无需先在某处下载文件的中间步骤。
我在想这样的事情:
import gcsfs
fs = gcsfs.GCSFileSystem(project='my-google-project')
with fs.open('my_bucket/my_tar_file.tar', 'rb') as f:
tarfile.open(f)
但是 f
是一个已经打开的文件连接,因此当然 .open
再次不起作用。这可能吗?
tarfile.open
函数接受一个fileobj
参数:
If
fileobj
is specified, it is used as an alternative to a file object opened in binary mode for name. It is supposed to be at position 0.
所以,这个解决方案应该有效:
import contextlib
import tarfile
import gcsfs
fs = gcsfs.GCSFileSystem(project="my-google-project")
with contextlib.closing(tarfile.open(fileobj=fs, mode='r:')) as f:
for entry in f:
...
别忘了关闭您的 fs
文件。
我使用了 tar 文件库,就像@LaurentLAPORTE 所做的那样,但以不同的方式实现了它。使用对象 fs
打开 tar 文件,然后使用 tarfile.open
的文件对象并循环遍历 tar 文件成员以获取文件的内容。
import tarfile
import gcsfs
fs = gcsfs.GCSFileSystem(project="your-project-here")
with fs.open('your-bucket/test.tar') as f:
tr = tarfile.open(fileobj=f, mode='r:')
for member in tr.getmembers():
f=tr.extractfile(member)
content=f.read()
print(content.decode('utf-8')) // add decode since output in bytes and not in utf-8 format
tr.close()
test.tar(也上传到我的存储桶)包含 sample_file.txt,其内容为:
测试运行: