替换.nfo文件中的文本

我有一个 colors.nfo 文件,我想替换变量并获得一个新生成的 nfo 文件,而不会丢失模板。

我有一个 colors.nfo 文件,我想替换变量并获得一个新生成的 nfo 文件,而不会丢失模板。

每次我加载 file.open 并替换变量并将其写入新文件时,都会出现奇怪的迹象,模板被。

这是文件的图像:https://i.imgur.com/8lqqXpg.png

这里是上传的文件处理:Click to download-希望它的好。否则我会删除!

希望您理解这个问题。想将“% REPLACE1%”,“% REPLACE2%”和“% REPLACE3%”替换为例如“BLACKGREY”,“REDWHITE...”。

试图用 f.open 将其加载到字符串中

在我用 string.replace 替换它之后(“% REPLACE1”,“BLACKGREY”)

在我用 f.write 写一个新文件之后

文件被,ASCII 符号不可读,模板不像以前

代码示例:

replaceString = []
f = open("colors.nfo")
for line in f:
    replaceString.append(line.rstrip())
f.close()
replaceColors = "\n".join(replaceString)
print(replaceColors.replace("%REPLACE1%", "BLACKGREY"))

输出:

ÛÛ³    [x] Yellow      [ ] Yellow       [ ] Yellow      ³ÛÛ
ÛÛ³    [x] Pink        [ ] Pink         [ ] %REPLACE3%  ³ÛÛ
ÛÛ³    [ ] Green       [ ] green        [ ] Green       ³ÛÛ
ÛÛ³    [ ] Red         [ ] red          [ ] Red         ³ÛÛ
ÛÛ³    [ ] Blue        [ ] blue         [ ] Blue        ³ÛÛ
ÛÛ³    [ ] Black       [ ] %REPLACE2%   [ ] black       ³ÛÛ
ÛÛ³    [ ] White       [ ] white        [ ] white       ³ÛÛ
ÛÛ³    [ ] grey        [ ] grey         [ ] grey        ³ÛÛ
ÛÛ³    [ ] brown       [ ] brown        [ ] brown       ³ÛÛ
ÛÛ³    [ ] BLACKGREY  [ ] orange       [ ] orange      ³ÛÛ
ÛÛ³    [ ] purple      [ ] purple       [ ] purple      ³ÛÛ

它应该如何:

██│    [x] Yellow      [ ] Yellow       [ ] Yellow      │██
██│    [x] Pink        [ ] Pink         [ ] %REPLACE3%  │██
██│    [ ] Green       [ ] green        [ ] Green       │██
██│    [ ] Red         [ ] red          [ ] Red         │██
██│    [ ] Blue        [ ] blue         [ ] Blue        │██
██│    [ ] Black       [ ] %REPLACE2%   [ ] black       │██
██│    [ ] White       [ ] white        [ ] white       │██
██│    [ ] grey        [ ] grey         [ ] grey        │██
██│    [ ] brown       [ ] brown        [ ] brown       │██
██│    [ ] BLACKGREY   [ ] orange       [ ] orange      │██
██│    [ ] purple      [ ] purple       [ ] purple      │██

我不希望在我的新创建的文件中出现这些“红框”。我想在屏幕上有“黑盒”。替换不是问题。问题是将文件加载到字符串后的结构。当我将这些字符串写入新文件时,模板看起来不像在所示的屏幕中。

0

这里有两个问题

正确读取和写入数据

保存结构

读写

根据Wikipedia,此类型的.nfo 文件使用 cp437 文本编码进行编码。因此,在读取和写入文件时必须指定此编码。

with open('colors.nfo', 'r', encoding='cp437') as f:
    ...
with open('colors.nfo', 'w', encoding='cp437') as f:
    ...

或者,可以以二进制模式打开文件,并且使用字节而不是文本来执行所有操作。

with open('colors.nfo', 'rb') as f:
    ...

如果未指定编码,则 Python 使用系统默认值,在这种情况下可能是 cp1252。像 cp1252 这样的 8 位编码能够解码该文件,但是 cp437 将b'\xdb'解码为“FULL BLOCK”(█),cp1252 将其解码为“LATIN CAPITAL LETTER U WITH CIRCUMFLEX”。

保存结构

数据具有固定宽度的格式,因此在替换文本时必须注意目标和替换字符串的长度相等,否则列将无确对齐。

target = '%REPLACE1%'
replacement = 'BLACKGREY'
delta = len(target) - len(replacement)
padding = ' ' * abs(delta)
if delta > 0:
    replacement += padding
else:
    target += padding
Solutions

这是一个完整的脚本。

replacements = { 
        '%REPLACE1%': 'BLACKGREY',
        '%REPLACE2%': 'REDWHITE',
}   
with open('colors.nfo', encoding='cp437') as f:
    data = f.read()
for target, replacement in replacements.items():
    delta = len(target) - len(replacement)
    padding = ' ' * abs(delta)
    if delta > 0:
        replacement += padding
    else:
        target += padding
    data = data.replace(target, replacement)
with open('new-colors.nfo', 'w', encoding='cp437') as f:
    f.write(data)

作为二进制数据的处理是相同的,除了文件以二进制模式打开和关闭,并且字符串被声明为bytes而不是str

replacements = { 
        b'%REPLACE1%': b'BLACKGREY',
        b'%REPLACE2%': b'REDWHITE',
}   
with open('colors.nfo', 'rb') as f:
    data = f.read()
for target, replacement in replacements.items():
    delta = len(target) - len(replacement)
    padding = b' ' * abs(delta)
    if delta > 0:
        replacement += padding
    else:
        target += padding
    data = data.replace(target, replacement)
with open('new-colors.nfo', 'wb') as f:
    f.write(data)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(362)
STM32 HID键盘
上一篇
圣人的符号数学:( a* x* y+z).subs( x+ y= = b)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(26条)