[英]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.