繁体   English   中英

替换 a.nfo 文件中的文本

[英]Replacing text in a .nfo file

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

有一些我不知道如何处理的 ascii 符号。 每次我用 file.open 加载并替换变量并将其写入新文件时,都会出现奇怪的迹象并且模板被破坏。

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

这是要处理的上传文件: 点击下载——希望没问题。 否则我会删除!

希望你能理解问题。 想用例如“BLACKGREY”、“REDWHITE”...替换“%REPLACE1%”、“%REPLACE2%”和“%REPLACE3%”。

  • 尝试使用 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"))

Output:

ÛÛ³    [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      │██

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

这里有两个问题

  1. 正确读取和写入数据
  2. 保留结构

读写

根据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 将其解码为“带有 CIRCUMFLEX 的拉丁大写字母 U”(Û),从而破坏了问题中所见的数据。

保留结构

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

target = '%REPLACE1%'
replacement = 'BLACKGREY'

delta = len(target) - len(replacement)

padding = ' ' * abs(delta)
if delta > 0:
    replacement += padding
else:
    target += padding

解决方案

这是一个完整的脚本。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM