【问题标题】:How to change string in a certain tag to lowercase in multiple files如何在多个文件中将某个标签中的字符串更改为小写
【发布时间】:2020-04-28 06:40:41
【问题描述】:

我尝试使用 Python 脚本在 Windows 10 中满足以下要求:

  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不同。

所以,这里是例子:

现有文件名:

  • ABC.dita
  • XYZ.dita
  • IMG.PNG

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

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

  • abc.dita
  • xyz.dita
  • img.png

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

我想更新所有更改的文件名引用,以使链接保持不变。

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

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

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

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

感谢任何帮助。

【问题讨论】:

  • 我使用以下代码将多个文件夹中的所有文件递归重命名为小写 - import os path = "C://Users//sh001//Desktop//content" for dir,subdir,listfilename in os.walk(path): for filename in listfilename: #i += 1 new_filename = filename.lower() src = os.path.join(dir, filename) dst = os.path.join(dir, new_filename.lower ()) os.rename(src,dst)
  • 你在用什么?什么操作系统/语言/等?适当的标签将有助于将问题引导给最能回答问题的人。此外,您应该编辑您的帖子以包含您的评论内容,而不是将其添加为评论。

标签: python html-parsing lowercase


【解决方案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)

我必须说这是一个简单的方法,如果你的文件不是很大,它会很好用。如果您有无法一次全部读取到内存的大文件,或者您可能需要考虑避免读取所有文件数据的方法。

【讨论】:

  • 谢谢。但是,我想搜索多个文件夹中的所有文件,而不是专门拼出引用的文件并将它们全部更改为小写。
  • 我执行了您共享的第一段代码,它执行但文件没有更改。使用 Spyder 执行。我在这里错过了什么吗? path = "C://Users//sh001//Desktop//content" s = """""" start = 0 head = "" while start != -1: head = "", img_start) s = s[:img_start] +s[img_start:img_end].lower() + s[ img_end:] 开始 = img_end
  • 我的代码示例不会更改文件本身。读取文件数据后即可使用,然后再次写入磁盘。
  • 这正是我想要的。我将您的脚本与 BeautifulSoup 代码一起使用。但是,有一个小问题我相信你可以帮我解决。执行脚本后, 被添加到多个文件夹中的所有文件中。我尝试在 s=bs(s, "lxml") 中传递“lxml”,但这似乎没有任何区别。提前致谢。
  • 我使用“xml”而不是“lxml”,它似乎工作。但是,面对另一个问题,脚本也在对所有图像文件进行更改。有什么方法可以在脚本中添加一行以忽略扩展名为 *.png、*.jpg 等的文件名?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多