[英]Replacing text in a .nfo file
我有一个 colors.nfo 文件,我想在其中替换变量并获取新生成的 nfo 文件而不丢失模板。
有一些我不知道如何处理的 ascii 符号。 每次我用 file.open 加载并替换变量并将其写入新文件时,都会出现奇怪的迹象并且模板被破坏。
这是文件的图像: https://i.imgur.com/8lqqXpg.png
这是要处理的上传文件: 点击下载——希望没问题。 否则我会删除!
希望你能理解问题。 想用例如“BLACKGREY”、“REDWHITE”...替换“%REPLACE1%”、“%REPLACE2%”和“%REPLACE3%”。
代码示例:
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 │██
我不希望在新创建的文件中出现这些“ÛÛ”。 我想在屏幕上有“黑匣子”。 更换不是问题。 问题是将文件加载到字符串后的结构。 当我将这些字符串写入新文件时,模板看起来不像显示的屏幕。
这里有两个问题
读写
根据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.