【问题标题】:Mass editing grouped list of codes to concatenate common code with each individual one批量编辑代码的分组列表,以将公共代码与每个单独的代码连接起来
【发布时间】:2015-03-06 04:04:47
【问题描述】:

我想在 Python 中尝试一些实用且具体的东西,我意识到我在玩 Pokemon 时浪费了插入代码的时间。有一个代码文本文件,其中代码看起来像这样:

在最顶端(82003884)

0001 = 大师球
...

82003884 代码是基本代码,XXXX 代码 (masterball = 0001) 被添加到末尾以获得特定项目。

我想修改文本文件中的所有代码,以便将第一个和第二个代码连接在一起。问题是,我还不知道如何处理它。我的第一反应是搜索所有 4 个字符的“单词”并将其替换为以主代码开头的新单词。但我真的不明白 Python 如何解释像“0001 = Master Ball”这样的行,以及如何将较长的主代码与 4 字符 (XXXX) 代码连接起来。

此外,我不知道基于 4 字符标准的查找替换是否具有足够的选择性以将过程仅限于代码本身(并且不会影响像“巢”这样的奇数 4 字符描述词等)。

它是这样的:

0001 = Master Ball
0002 = Ultra Ball
0003 = Great Ball
0004 = Poke Ball
0005 = Safari Ball
0006 = Net Ball

...

【问题讨论】:

  • Master Ball 的代码是 82003885(底数加 1)还是 820038840001(串联)?
  • 这不是为它工作本身,尽管我明白你为什么会这样想。这是关于获得这些想法可能需要的任何个人辅导与互联网上的任何其他随机人员稍后可能需要的任何个人辅导之间的共性。具体来说,可能很少有宝贵的东西。这是一个问题,因为 SE 都是关于常见问题的,即使“常见”在某些情况下意味着“五个人”。也就是说,我有一个如何转换它的想法。让我们看看。
  • 它的连接(我相信这是正确的术语)。不涉及数学谢谢

标签: python text replace


【解决方案1】:

您描述它的方式是只有一个基本代码。在这种情况下,您可以读取文件的第一行,并将该行的内容放在其他每一行的前面。

但是,如果有多个基本代码(这似乎更有可能),您必须决定您作为人类将如何决定某物是否是基本代码。有白线吗?基本代码总是包含 8 位数字的字符串吗?一旦你知道了,你就可以把它翻译成 Python 或任何其他语言都能理解的规则。

编辑

由于只有一个基本码,下面的脚本已经可以了。

pokemon.txt

12345678
0001 = Master Ball
0002 = Ultra Ball
0003 = Great Ball
0004 = Poke Ball
0005 = Safari Ball
0006 = Net Ball

prepend.py

def prepend_header(file_in, file_out):
    with (open(file_in, 'r')) as f:
        base_code = f.readline()[:-1]  # -1 to strip newline character
        new_string = ''
        for line in f:
            new_string += base_code + line
        print (new_string)

    with (open(file_out, 'w')) as f:
        f.write(new_string)

if __name__ == '__main__':
    prepend_header('pokemon.txt', 'pokemon_new.txt')

pokemon_new.txt

123456780001 = Master Ball
123456780002 = Ultra Ball
123456780003 = Great Ball
123456780004 = Poke Ball
123456780005 = Safari Ball
123456780006 = Net Ball

【讨论】:

  • 没有白线,这是我描绘它的基本方式。如果有帮助,我编辑在我的帖子底部添加了一个更好的示例。这听起来很完美,但是,关于“读取文件的第一行......”,我将如何系统地进行呢?
  • 您仍然只提供输入文本文件的一部分。给出更详细的部分,包括基本代码。
  • 只有一个基本代码 (82003884)。我一次只发布了几行最近的行,因为它们实际上都是这样的,而且我在这里的格式化速度并不完全(它不是实际的“代码”,但希望被格式化)。
【解决方案2】:

你想要的是正则表达式,或正则表达式:正则表达式。它们是速度的通配符。在这里,您需要一个匹配主代码,这将是 ^\d{8}$^\(\d{8}\)$,具体取决于文件中是否存在这些括号。然后将其保存在一个变量中,并将其添加到后面的每一行,然后再将所有行保存到文件中。

Python 3.4 中的示例,假设文件名为“pokemon_codes.txt”并且在当前目录中等等:

import re   # for regular expressions
import os   # for renaming/deleting files

# open the file line by line, updating into temp file then overwriting
with open('pokemon_codes.txt', mode='r') as f_codes:
with open('pokemon_codes.out', mode='w') as f_out:
    for line in f_codes:
      if re.match('^\d{8}$', line):
        master = line.rstrip()          # now we know what the current master code is
      else:
        f_out.write(master + line)      # update with the master code/current code combination followed by the description, if any
os.remove('pokemon_codes.txt')
os.rename('pokemon_codes.out', 'pokemon_codes.txt')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    相关资源
    最近更新 更多