繁体   English   中英

如何将文件中的字符串更改为列表中的字符串

[英]How to change a string in a file to strings froma a list

我是Python编程的新手,我在使用存储在列表中的字符串更改文本文件中的特定字符串时遇到了这个问题。

我正在研究媒体维基文档 - 将它们从.doc转换为维基代码。 转换后,所有图像都被标签[[Media:]]替换 - 我想用列表中存储的图片名称替换所有[[Media:]]标签。 例如,在转换后的文档中将有5个[[Media:]]标签,这意味着我有这样的列表:

li = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg"]

我想将文档中的第一个标记更改为用image1.jpg替换的bo,用image2.jpg在文档中找到的第二个标记等等。

这是一段代码,但我无法想象如何使迭代通过列表工作

li = ["image1.jpg ", "image2.jpg ", "image3.jpg ", "image4.jpg ", "image5.jpg "]
a = 0

src = open('sap.txt').readlines()
dest = open('cel.txt', 'w')

for s in src:
    a += 1
    dest.write(s.replace("[[Media:]]", li[a]))
dest.close()

我将不胜感激

一种简单但不是非常有效的方法是一次更换一个标签:

>>> li = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg"]
>>> s = "a tag [[Media:]] - I want to replace all [[Media:]] tags with a names of pictures stored in a list. For example in a converted document there will be 5 [[Media:]] tags d by a tag [[Media:]] - I want to replace all [[Media:]] tags"
>>> for item in li:
...    s = s.replace("[[Media:]]", item, 1)  # max. 1 replace per call
...
>>> s
'a tag image1.jpg  - I want to replace all image2.jpg  tags with a names of pictures stored in a list. For example in a converted document there will be 5 image3.jpg  tags d by a tag image4.jpg  - I want to replace all image5.jpg  tags'

更好的方法是一次构造字符串:

def interleave(original, tag, replacements):
    items = original.split(tag)
    return "".join((text+repl for text,repl in zip(items, replacements+[""])))

像这样使用它:

>>> interleave(s, "[[Media:]]", li)
'a tag image1.jpg  - I want to replace all image2.jpg  tags with a names of pictures stored in a list. For example in a converted document there will be 5 image3.jpg  tags d by a tag image4.jpg  - I want to replace all image5.jpg  tags'

如果您以后不需要使用li ,则可以执行以下操作:

li.reverse()
with open('sap.txt') as src:
    with open('cel.txt', 'w') as dest:
        for line in src:
            while "[[Media:]]" in line:
                line = line.replace("[[Media:]]", li.pop(), 1)
            dest.write(line)

当然,如果文件包含的实例"[[Media:]]"len(li)更多,则会使您对IndexError开放。

此外,如果使用re ,则可以使用line=re.sub("\\[\\[Media:\\]\\]", lambda m: li.pop(), line)替换while循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM