簡體   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