如何在多个文件中将某个标签中的字符串更改为小写
How to change string in a certain tag to lowercase in multiple files
我有以下要求,我试图在 Windows 10 中使用 Python 脚本满足这些要求:
将多个文件夹中的所有文件名递归更改为小写。
为此,我使用了以下代码:
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)
更新嵌入在特定标签中的这些文件的引用。这里的标签是
<img href=(filename.png)>
。
这里,<img href=>
不变,文件名 filename.png 不同。
所以,这里是例子:
现有文件名:
ABC.dita
XYZ.dita
IMG.PNG
这些在不同的文件中被引用,比如说
IMG.PNG
在 XYZ.dita
中被引用。
在step1之后,这些变化如下:
abc.dita
xyz.dita
img.png
这将破坏不同文件中包含的所有引用。
我想更新所有更改的文件名引用,以便链接保持完整。
我对 Python 没有任何经验,只是个初学者。
要实现第 2 步,我应该能够使用正则表达式并找到一个模式,
说,
<img href="(this will be a link to the IMG.PNG>"
。
这将是 .dita
文件的一部分。
在第 1 步之后,文件中的引用将中断。
如何更改文件名并保留其引用?
这里的问题是,在所有文件中找到并用新名称替换旧名称。
感谢任何帮助。
我假设您有一个包含所有相关文件的文件夹。
所以问题分为两部分:
- 运行 在文件循环中
- 对于每个文件降低引用
遍历文件
这可以使用 glob
或 os.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)
我必须说这是一个简单的方法,假设您的文件不是很大,它会很有效。如果你有大文件不能一次全部读入内存,或者文件很多你可能想想办法避免读取所有文件的数据。
我有以下要求,我试图在 Windows 10 中使用 Python 脚本满足这些要求:
将多个文件夹中的所有文件名递归更改为小写。 为此,我使用了以下代码:
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)
更新嵌入在特定标签中的这些文件的引用。这里的标签是
<img href=(filename.png)>
。 这里,<img href=>
不变,文件名 filename.png 不同。
所以,这里是例子:
现有文件名:
ABC.dita
XYZ.dita
IMG.PNG
这些在不同的文件中被引用,比如说
IMG.PNG
在 XYZ.dita
中被引用。
在step1之后,这些变化如下:
abc.dita
xyz.dita
img.png
这将破坏不同文件中包含的所有引用。
我想更新所有更改的文件名引用,以便链接保持完整。
我对 Python 没有任何经验,只是个初学者。 要实现第 2 步,我应该能够使用正则表达式并找到一个模式, 说,
<img href="(this will be a link to the IMG.PNG>"
。
这将是 .dita
文件的一部分。
在第 1 步之后,文件中的引用将中断。
如何更改文件名并保留其引用? 这里的问题是,在所有文件中找到并用新名称替换旧名称。
感谢任何帮助。
我假设您有一个包含所有相关文件的文件夹。 所以问题分为两部分:
- 运行 在文件循环中
- 对于每个文件降低引用
遍历文件
这可以使用 glob
或 os.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)
我必须说这是一个简单的方法,假设您的文件不是很大,它会很有效。如果你有大文件不能一次全部读入内存,或者文件很多你可能想想办法避免读取所有文件的数据。