如何在多个文件中将某个标签中的字符串更改为小写

How to change string in a certain tag to lowercase in multiple files

我有以下要求,我试图在 Windows 10 中使用 Python 脚本满足这些要求:

  1. 将多个文件夹中的所有文件名递归更改为小写。 为此,我使用了以下代码:

    import os path = "C://Users//shilpa//Desktop//content"
    for dir,subdir,listfilename in os.walk(path):
        for filename in listfilename:  
            new_filename = filename.lower()
            src = os.path.join(dir, filename) 
            dst = os.path.join(dir, new_filename) 
            os.rename(src,dst)
    
  2. 更新嵌入在特定标签中的这些文件的引用。这里的标签是 <img href=(filename.png)>。 这里,<img href=> 不变,文件名 filename.png 不同。

所以,这里是例子:

现有文件名:

这些在不同的文件中被引用,比如说 IMG.PNGXYZ.dita 中被引用。

在step1之后,这些变化如下:

这将破坏不同文件中包含的所有引用。

我想更新所有更改的文件名引用,以便链接保持完整。

我对 Python 没有任何经验,只是个初学者。 要实现第 2 步,我应该能够使用正则表达式并找到一个模式, 说,

<img href="(this will be a link to the IMG.PNG>"。 这将是 .dita 文件的一部分。

在第 1 步之后,文件中的引用将中断。

如何更改文件名并保留其引用? 这里的问题是,在所有文件中找到并用新名称替换旧名称。

感谢任何帮助。

我假设您有一个包含所有相关文件的文件夹。 所以问题分为两部分:

  1. 运行 在文件循环中
  2. 对于每个文件降低引用

遍历文件

这可以使用 globos.walk 来完成。

import os

upper_directory = "[insert your directory]"
for dirpath, directories, files in os.walk(upper_directory):
    for fname in files:
        path = os.path.join(dirpath, fname)
        lower_file_references(path)

小写 参考资料

当你有文件的路径时,你需要从中读取数据:

with open(path) as f:
    s = f.read()

获得引用文件的数据后,您可以使用此代码降低引用字符串:

head = "<img href="
tail = ">"
img_start = s.find(head, start)
while img_start != -1:
    img_end = s.find(">", img_start)
    s = s[:img_start] +s[img_start:img_end].lower() + s[img_end:]
    img_start = img_end

或者您可以使用一些 XML 解析模块。例如 BeautifulSoup,这将有助于避免 href=href =

等问题
from bs4 import BeautifulSoup as bs

s = bs(s)
imgs = s.find_all("img")
for i in imgs:
    if "href" in i.attrs:
        i.attrs["href"] = i.attrs["href"].lower()
s = str(s)

您可以通过这两种方式重写文件。 你可以这样做:

with open(path, "w") as f:
    f.write(s)

综合起来

import os
from bs4 import BeautifulSoup as bs

def lower_file_references(file_path):
    with open(path) as f:
        s = f.read()
    s = bs(s)
    imgs = s.find_all("img")
    for i in imgs:
        if "href" in i.attrs:
            i.attrs["href"] = i.attrs["href"].lower()
    s = str(s)
    with open(path, "w") as f:
        f.write(s)

upper_directory = "[insert your directory]"
for dirpath, directories, files in os.walk(upper_directory):
    for fname in files:
        path = os.path.join(dirpath, fname)
        lower_file_references(path)

我必须说这是一个简单的方法,假设您的文件不是很大,它会很有效。如果你有大文件不能一次全部读入内存,或者文件很多你可能想想办法避免读取所有文件的数据。