【问题标题】:printing files based on character基于字符打印文件
【发布时间】:2021-09-08 09:13:32
【问题描述】:

我有一个包含数千个文件的目录(data)。每次我想选择仅相差一个字符的three 文件AB[C,D,E] 并想对选定的三个文件执行一些计算稍后。

我的文件在目录中如下所示

DT.ABC.2007.182.144018.txt
DT.ABD.2007.182.144018.txt
DT.ABE.2007.182.144018.txt

DT.ABC.2001.005.1444.txt
DT.ABD.2001.005.1444.txt
DT.ABE.2001.005.1444.txt

DT.ABC.2003.005.1244.txt
DT.ABD.2003.005.1244.txt
DT.ABE.2003.005.1244.txt

一开始我想打印

    DT.ABC.2007.182.144018.txt
    DT.ABD.2007.182.144018.txt
    DT.ABE.2007.182.144018.txt

然后

DT.ABC.2001.005.1444.txt
DT.ABD.2001.005.1444.txt
DT.ABE.2001.005.1444.txt

同样的过程会一直持续到完成目录中所有文件的读取。

我尝试了下面的代码:

import glob
for file in glob.glob('/data/*.txt'):
    print(st)

但它随机打印所有文件而不是打印相同的三个(仅由[C,D,E]字符不同。希望专家能帮助我。提前谢谢。

【问题讨论】:

  • 前缀是否始终与示例中的相同?如果是这样,您可以提取后缀并按此分组
  • 是 DT.AB?它总是一样的
  • 请不要破坏您的帖子。通过在 Stack Exchange 网络上发布,您已授予 SE 分发该内容的不可撤销的权利(在 CC BY-SA 4.0 license 下)。根据 SE 政策,任何破坏行为都将被撤销。
  • 这里真正的问题是您的问题不清楚。 glob 不会产生随机结果,它会按字母顺序准确返回与您指定的模式匹配的文件。如果您想要一个更受约束的模式,则需要在调用中指定它(或者可能在 print 周围添加一个条件以跳过您不想要的那些,如果为您想要的内容表达一个 glob 模式比简单的 glob 模式允许)。

标签: python pandas linux bash numpy


【解决方案1】:

这是一个简单的函数,它列出文件并按文件名的第一和第三部分对它们进行分组。

def groupfiles(pattern):
    files = glob.glob(pattern)
    filedict = defaultdict(list)
    for file in files:
        parts = file.split(".")
        filedict[".".join([parts[0], parts[2]])].append(file)
    for filegroup in filedict.values():
        yield filegroup

这会组合在一起并一次返回一个文件列表(yield 是一个产生生成器的关键字;但您可以将其视为return 的替代品,只有函数从它离开的地方继续在上一次调用后关闭,而不是在下次调用时从头开始运行),因此不会硬编码一次三个文件的限制。

演示:https://ideone.com/w2Sf80

【讨论】:

  • 不,它只是打印所有文件,我的文件保存在一个目录中。文件不按组分隔。
  • 该演示使用您作为示例提供的名称。如果您的真实文件有不同的名称,请分享它们。
  • ok,如何分享,可以发个链接吗
  • 答案的最后一行是demo的链接。您可以轻松地对其进行分叉并使用不同的文件名填充它,如果您愿意,可以在评论中分享链接。
  • 我不会下载一些随机的 zip 文件。给我看几个你的实际文件名。
猜你喜欢
  • 2021-02-13
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多