【问题标题】:Extracting strings from a directory full of files从充满文件的目录中提取字符串
【发布时间】:2020-07-11 02:32:14
【问题描述】:

问题: 我有一个包含 7000 多个文件的目录(有时更多,有时更少。) 这些文件都没有文件扩展名。 每个文件都有一个未知的编码(很可能是二进制文件),但如果我向文件添加扩展名,我似乎可以用基本代码读取一个文件。由于它不是 ANSI 或 UTF-8 编码的,因此 Replace 和 Strip 函数不适用于空格。此模块现在适用于单个文件。(感谢 AKX)

代码:

# OPEN FILES
import re
f = open('berlin_floors_metal_catwalk1.txt','r')
filecontent = f.read()

# ---SPECULAR---
# FIND SPECULAR NAME
identifiers = re.findall("([~_a-z0-9]{3,})", filecontent, flags=re.I)
specfname = identifiers[identifiers.index('envMapParms') - 1]
specular = specfname + '.png'
#---- THE FINAL VARIABLE
print(specular)
# --------------

# ---NORMAL---
# FIND NORMAL NAME
identifiers = re.findall("([~_a-z0-9]{3,})", filecontent, flags=re.I)
normalfname = identifiers[identifiers.index('specularMap') - 1]
normal = normalfname + '.png'
#---- THE FINAL VARIABLE
print(normal)
# --------------

# ---DIFFUSE COLORMAP---
# FIND COLORMAP NAME
identifiers = re.findall("([~_a-z0-9]{3,})", filecontent, flags=re.I)
colorfname = identifiers[identifiers.index('colorMap') - 1]
colormap = colorfname + '.png'
#---- THE FINAL VARIABLE
print(colormap)
# --------------

f.close()

输入: ² Ï
@ Ð p   @ d î Ï ÷ , S ÍÌL?ÍÌL@ ˆÀ ?_ €? €? €? €?i €? €?l_sm_t0c0n0s0_sco berlin_floors_metal_catwalk1 berlin_floors_metal_catwalk1_c colorMap normalMap berlin_floors_metal_catwalk1_n specularMap ~berlin_floors_metal_catwalk1~f0baafa8 envMapParms colorTint dynamicFoliageSunDiffuseMinMax

输出:

~berlin_floors_metal_catwalk1~f0baafa8.png
berlin_floors_metal_catwalk1_n.png
berlin_floors_metal_catwalk1_c.png

【问题讨论】:

  • 您是否尝试过以 csv 格式打开文件?第一个角色是制造问题
  • 不,我还没有。
  • 我认为您实际上是在尝试读取恰好包含这些纹理文件名引用的二进制文件。您将有更好的时间为二进制格式编写真正的解析器。这些文件实际上来自哪里,您实际上想做什么?
  • 来自使命召唤系列游戏。使命召唤 4、战争世界和黑色行动 1。这些是资产编辑器在您设置图像后吐出的材质文件。不幸的是,这些与 Black Ops 3 不交叉兼容。我认为该文件可能是二进制文件,但到目前为止,一切都很好。我正在做的是创建 3 个变量以插入到模板中以输出一个新的(兼容的)GDT 材质文件以用于 Black Ops 3。

标签: python string file split


【解决方案1】:

此代码现已完成,代码已更新以反映更改。 非常感谢AKX

【讨论】:

    【解决方案2】:

    虽然我仍然坚持我的意见,即您应该弄清楚文件的二进制格式,但在这种特殊情况下,一个正则表达式可以找到所有足够长(这里是 3 个以上字符)的类似标识符的字符串.我已经从您的帖子中嵌入了data,但您也可以从文件中读取它:

    import re
    
    data = """
    ®   Î       @           P    ˆ
             @   d   ð     Î   ù       %   1  X  ÍÌL?ÍÌL@  ˆÀ   ?d    €?  €?  €?  €?n        €?      €?l_sm_r0c0n0s0 okinawa_ceiling_concrete_bunker okinawa_ceiling_concrete_bunker_c colorMap normalMap okinawa_ceiling_concrete_bunker_n specularMap ~okinawa_floor_concrete_spott~c12191f9 envMapParms colorTint dynamicFoliageSunDiffuseMinMax
    
    ²   Ï
    """
    
    identifiers = re.findall("([~_a-z0-9]{3,})", data, flags=re.I)
    
    print(identifiers)
    

    输出

    [
        "l_sm_r0c0n0s0",
        "okinawa_ceiling_concrete_bunker",
        "okinawa_ceiling_concrete_bunker_c",
        "colorMap",
        "normalMap",
        "okinawa_ceiling_concrete_bunker_n",
        "specularMap",
        "~okinawa_floor_concrete_spott~c12191f9",
        "envMapParms",
        "colorTint",
        "dynamicFoliageSunDiffuseMinMax",
    ]
    

    【讨论】:

    • 我希望我知道如何阅读二进制格式,但培训根本不存在。我花了 3 天时间在网上搜索我所拥有的东西。 (尤其是这里)。您所做的可能在一定程度上起作用,正如您在我的业余代码中看到的那样,我将 specfname、normfname 和 colorfname 作为三个最终变量名。我不确定如何使用您的代码将每个文件分配到正确的行,因为所有文件的长度都不同,并且文件名可能最终出现在不同的行上。
    • 看起来,无论出于何种原因,在这个特定的文件中,颜色图文件名在colorMap之前,所以你可以使用identifiers.index('colorMap')找到colorMap,然后减去一个; colorfname = identifiers[identifiers.index('colorMap') - 1] 等。我担心这不会是防弹的。
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 2014-05-20
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多