1

首先介绍一下背景:是的,我是 python 新手,但我喜欢涉猎和学习。

目标是这样的:我在这里有一个 Intranet 网站在工作,他们让我们在一个静态服务器上,不允许服务器端脚本,这意味着没有 PHP。因此,当我添加新页面时,我必须使用新链接更新每个怪异页面的菜单。幸运的是,我的计算机上安装了一个名为 ArcGIS 的应用程序,并安装了 python。所以我想把一个脚本放在一起会很好标签,如<!--begin menu--><!--end menu-->,带有“menu.txt”中的文本

所以我开始寻找并找到了这段代码:

with open('menu.txt', 'r') as f:
    # read entire file into file1
    # ASSUMING 'file1.txt' is relatively small...
    file1 = f.read()

with open('test.html', 'r') as f:
    # ASSUMING 'file2.txt' is relatively small...
    file2 = f.read()    # read file into file2

# index() will raise an error if not found...
f1_start = file1.index('<!--123-->')
f1_end = file1.index('<!--321-->', f1_start)     # look for '//end' after '//start'

f2_start = file2.index('<!--123-->')
f2_end = file2.index('<!--321-->', f2_start)

# replace file2 lines with proper file1 lines
file2[f2_start:f2_end] = file1[f1_start:f1_end]

with open('test.html', 'w') as f:
    f.write(file2)

我也看到了很多使用re,replace等的例子,但似乎没有什么与我需要的有关。无论如何,现在我只是在同一目录中的一个文件上尝试它,但是当我在我的 linux 机器或 windows python shell 上运行它时,我得到:

Traceback (most recent call last):
  File "P:\webpages\filereplace.py", line 18, in <module>
    file2[f2_start:f2_end] = file1[f1_start:f1_end]
TypeError: 'str' object does not support item assignment

我认为问题可能是with open部分,但我不知道。

在这种情况下,menu.txt 的内容本质上是一个开始注释标记<!--123-->,然后是所有的<div id=menu>blah blah blah</div>,然后是一个结束注释标记<!--321-->。在我的 html 文件中,我使用了相同的注释标签,你得到了图片......

有什么建议么?

4

2 回答 2

3

您正在尝试就地修改字符串。这在 python 中是不可能的,因为字符串是不可变的。

要实现您想要的,您需要从现有两个字符串的部分创建一个新字符串:

# replace file2 lines with proper file1 lines
new_f = file2[:f2_start] + file1[f1_start:f1_end] + file2[f2_end:]

之后,将内容写入文件,如下所示:

with open('test.html', 'w') as f:
    f.write(new_f)

另外,请注意变量名称file1file2此处有点误导,因为它们不是类似文件的对象,而是字符串。

于 2013-04-22T17:49:21.757 回答
0

大多数时候,在处理文件的就地编辑时,我会求助于fileinput模块:

import os
import fileinput

if __name__ == '__main__':
    # Menu should not have any marker, just pure contents
    with open('menu.txt') as f:
        menu_contents = f.read()

    # Initialize a few items
    start_marker = '<!--123-->'
    end_marker   = '<!--321-->'
    file_list = ['index.html', 'foo.html']
    found_old_contents = False

    # Loop to replace text in place
    for line in fileinput.input(file_list, inplace=True):
        line = line.rstrip()

        if line == start_marker:
            found_old_contents = True
            print line
            print menu_contents
        elif line == end_marker:
            found_old_contents = False

        if not found_old_contents:
            print line

讨论

这里的关键在于函数fileinput.input(file_list, inplace=True),它获取文件名列表,逐行遍历它们,然后将你print输出的任何内容写回文件。

您将需要file_list通过os.walk()或其他一些方法提供文件列表(例如 )。

我已经针对两个 .html 文件测试了我的代码,并且确信它可以工作。我不能保证结果,尤其是对于嵌套目录。祝你好运。

于 2013-04-22T18:15:12.043 回答