当前位置: 首页 > 知识库问答 >
问题:

过滤GCS bucket文件夹中的文件,并删除带有数据流的0字节文件

唐涛
2023-03-14

我目前正在尝试删除谷歌云存储桶中所有0字节的文件。我希望能够用apache beam和一个将在谷歌云项目上运行的数据流运行器来做到这一点。我现在有的是这个(我用< code >隐藏了一些细节

import apache_beam as beam
import apache_beam.io.gcp.gcsfilesystem as gcs
from apache_beam.options.pipeline_options import PipelineOptions

class DetectEmpty(beam.DoFn):
    def process(self, file_path):
        if gfs.size(file_path) == 0:
            yield file_path

def run(argv=None):

    parser = argparse.ArgumentParser()
    parser.add_argument('--input', dest='input', default=<***>, help='<***>')

    options = PipelineOptions()
    google_cloud_options = options.view_as(GoogleCloudOptions)
    google_cloud_options.project = '<***>'
    google_cloud_options.job_name = '<***>'
    options.view_as(StandardOptions).runner = 'DataflowRunner'

    gfs = gcs.GCSFileSystem(pipeline_options)
    p = beam.Pipeline(options=pipeline_options)

    images = p | 'read directory' >> ReadFromText(known_args.input)
    empty_images = images | 'discover empty files' >> beam.ParDo(DetectEmpty())

    p.run()

我的一些问题是:

  • 这是完成这项任务的正确方法吗
  • 如何传递<code>apache_beam.io.gcp.gcsfilesystem。GCSFileSystem到DoFn
  • 此外,我想删除所有只包含0字节文件的文件夹。我该怎么办

共有1个答案

毕浩渺
2023-03-14

您无需实际读取文件即可检测空文件,只需直接使用FileSystem对象即可检查文件大小并根据需要删除。match() 函数返回的“文件元数据”对象包括文件的大小。

像这样的东西

class DeleteEmpty(beam.DoFn):
  def __init__(self, gfs):
    self.gfs = gfs

  def process(self, file_metadata):
    if file_metadata.size_in_bytes == 0:
      gfs.delete([file_metadata.path])

files = p | 'Filenames' >> beam.Create(gfs.match([<directory glob pattern>]).metadata_list)
          | 'Reshuffle' >> beam.Reshuffle() # this allows the downstream code to be parallelized after the Create
          | 'Delete empty files' >> beam.ParDo(DeleteEmpty(gfs))

GCS实际上没有文件夹;它们只是在使用UI或gsutil时添加的便利。当文件夹中没有对象时,该文件夹就不存在。看见https://cloud.google.com/storage/docs/gsutil/addlhelp/HowSubdirectoriesWork

 类似资料:
  • 有关删除数据的Firebase文档中说: 删除数据 删除数据的最简单方法是对数据位置的引用调用remove()。 还可以通过将null指定为另一个写入操作(如set()或update())的值来删除。您可以将此技术与update()结合使用,在单个API调用中删除多个子项。 有谁能解释一下,我认为最后一行可以帮助我删除firebase文件夹中的所有文件是什么意思?

  • 问题内容: 我一直在使用一段特定的代码从文件夹中删除文件,但是事实证明这是非常有问题的,因为也许我忘记了关闭一个或两个InputStream。我拥有的代码是如此之大,以至于我无法看到所有尚未关闭的Inputstreams。有没有打开InputStream的删除文件的方法? 这是我一直在使用的代码; 我已经编辑了代码。此版本有效。 问题答案: 提供的代码块中没有InputStream实例。 为了不编

  • 我想从名为"fajlovi"的文件夹中删除文件。多个和单个删除应该工作。但是它会删除文件夹中的第一个文件(文件夹中文件数组中的0位置)。如果我检查任何文件,它将删除前4个文件,而不是我检查的文件。下面是代码: 1.这是页面的截图: 2.然后我检查要删除的图像: 4.再次进入页面后,我们可以看到错误的图像被删除:

  • 问题内容: 我使用以下代码删除所有文件: 它将删除false 文件夹所在的位置。 我想删除文件夹及其所有子文件。 我该如何修改? 问题答案: 最简单的方法是使用Apache Commons IO库中的FileUtils.deleteDirectory。 请记住,这还将删除包含目录。 在gradle文件中添加此行以使用Apache

  • 我有一个目录,它是在执行应用程序后创建的。在使用应用程序的过程中,它充满了一些图片,这些图片是ComboBox的ItemsSource。在关闭应用程序之前,我试图通过设置new()或NULL来清除ItemsSource并删除该目录。如果目录为空,则会正常删除。但除此之外——什么都没有发生,也没有例外。我做错了什么? 创建目录并将路径值分配给“FeedBackScreenshotsPath” 删除

  • 问题内容: 我正在尝试编写python脚本来删除X天之前的文件夹中的所有文件。这是我到目前为止所拥有的: 运行脚本时,我得到: , 并给出文件名。我究竟做错了什么? 问题答案: 返回裸文件名列表。它们没有完整的路径,因此您需要将其与包含目录的路径合并。您在删除文件时执行此操作,但在文件删除时(或在执行任一操作时)则不执行此操作。 最简单的解决方案是在循环的顶部执行一次: 现在是文件的完整路径,您可