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

这里有两个问题
正确读取和写入数据
保存结构
读写
根据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)
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(71条)