【问题标题】:Can I loop through a text file when values are strings?当值是字符串时,我可以遍历文本文件吗?
【发布时间】:2016-10-04 09:50:23
【问题描述】:

我有一个问题,非常感谢您的帮助。

具体来说,我有一个巨大的文本文件;我需要用字典中的条目替换其中的特定字符串。有用的是,我需要替换的单词按顺序命名:'Word1'、'Word2'、...、'Wordn'。

现在,我想编写一个循环遍历文件的“for”循环,并将“Wordx”的所有实例替换为字典[x]。当然,问题在于 'Wordx' 需要 'x' 部分作为变量,(据我所知)不能在字符串中完成。

有人有解决方法吗?我尝试查看正则表达式,但没有发现任何明显的东西(可能是因为我也发现它有些混乱)。

(请注意,当我生成文本文件时,我可以完全控制要替换的单词可以采用的形式:即,它不必是“Word11”;它可以是“Wordeleven”或“wordXI”或任何ASCII码。)

编辑:根据要求添加更多详细信息:我的文本文件是调查文件背后的 javascript 的导出。最初的调查软件只允许我一次输入一个文本提示(而不是从 csv 管道输入),但我有数千个文本提示要输入(单词)。我的计划是手动输入大约 100 个单词('Word1, ..., 'Word100'),将调查 javascript 导出为文本文件,编写脚本用字典条目替换单词,导入结果文件,然后加入它们进入新的调查。

但是,问题仍然是我是否可以使用字符串的数字部分作为变量来循环

【问题讨论】:

  • 也许你需要展示更清晰的例子,更多关于你的文本文件,以及你想要什么
  • 这个“巨大”的文本文件有多大字节数?
  • 嗯,大小并不是我的意思:我说“巨大”只是为了传达它奖励编写一些代码,而不是一次“查找”“替换”一个词.

标签: python string loops text replace


【解决方案1】:
n = 1
while not done:
    replace_str = 'Word' + str(n)
    # find and replace all instances of replace_str in the file text
    # set variable done if finished
    n += 1

该框架能否解决您的需求?字符串不是变量:字符串是可以计算的值,而变量是名称,(通常)不计算。难度更大的还可以设置'WordEleven'之类的字符串。

【讨论】:

  • 为每个n 重复读取一个巨大的文件是一种非常昂贵的方法。最好将文件通读一次,然后在每一行进行所有替换。
  • 我同意这些担忧。我在回答中忽略了它们,因为最初写的问题提供的细节很少,我想专注于似乎是主要问题,“'Wordx' 需要 'x' 部分作为变量,它(所以据我所知)不能在字符串中完成”。
  • 对于它的价值,Rory Daulton 的建议确实以相当直接的方式捕捉到了我正在寻找的东西。其他建议也很好,但这提供了问题所需的解决方法。很可能是它的效率较低——尽管问题是一次性的。
【解决方案2】:

使用re.sub(),您可以传递一个函数而不是替换字符串。此功能可以从字典中查找替换。例如:

d = {'0': 'foo', '1': 'bar', '2': 'baz'}
re.sub(r'word(\d+)',
       lambda match: d[match.group(1)],
       "Hello word0, this is word2. How is word1?")

你好 foo,这是 baz。酒吧怎么样?

【讨论】:

  • 这很棒。我遇到的唯一问题是,如果代码遇到带有不在字典中的数字的单词,则会引发错误。鉴于作者真的只想替换在字典中找到整数的位置,而不是对文档中的所有整数做出反应,这似乎不是最佳选择。
  • 我不知道re.sub() 处理“巨大”文本文件作为输入的能力如何。
  • @Jason:当然可以,但这只需要对替换功能进行细微调整。但是,是什么让您认为文件中可能有“wordx”模式的单词不在字典中?根据给出的信息,OP 对文件有足够的控制权来防止这种情况的发生。
  • @Jasper 如果sub的性能是一个大字符串的问题,你可以逐行处理。
【解决方案3】:

我想你说的文本文件是这样的:

嗨!这是word1

我喜欢游泳,word2和word3 ....

如果是这样,那么您可以逐行读取,拆分行并用字典中的值替换单词,其键为 int(word[-1])

这是代码,

from __future__ import print_function

dict = {1: 'Aravind', 2: 'eat', 3:'play'}

def word_gen(file):
    for line in file:
        for word in line.split():

            if word[0:4] == 'word' and len(word) == 5:
                 print( dict[ int( word[-1] ) ], end=" " )  #remove int() if keys are are "chars" like {'1':'Mark',..}
                 #this------------------^

            else: print(word, end = " ")

        print("\r")


with open('re.txt', 'r') as f:
    word_gen(f)

现在直接终端输出到另一个文件

python replace.py > replaced.txt

希望有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2018-03-22
    相关资源
    最近更新 更多