我有一个 Python 脚本,它从 oldFiles.txt 读取文件名,遍历 Linux 目录中的文件的文件名,然后使用 string.replace 更新文件名,最后运行一个子进程来查找这些文件(假设在主目录中,以便于解释和演示)并使用更改它们的名称 subprocess.run(['mv', 'oldfile', 'newfile')]
假设我有一些文件名中包含字符串“jane”,我想将其替换为“jdoe”,文件名示例为:abcd_jane.csv
sys.argv[1] 是将像下面这样传递的参数./changeJane.py oldFiles.txt
我正在使用这些空文件进行本地训练,它们的名称保存在 oldFiles.txt 中, sdafsdfs_jane.doc 12fgdf-jane.csv files_jane.txt
每个文件的名称保存在一行中。
迭代和更新 oldFiles.txt 中的文件名是可以的,但我仍然无法弄清楚如何运行子进程来实现上述目标。这就是我得到的答案,非常感谢。抱歉我的解释不好。
实际输出mv: cannot stat '/home/user/sdafsdfs_jane.doc 12fgdf-jane.csv files_jane.tx': No such file or directory
从输出中我可以了解到,也许路径仅附加到第一个 newName,而不是其余文件名,或者可能是 bash 将所有文件名读取为一个文件名,但我仍然不知道如何解决它。
PS:我没有显示我的用户名,而是用 替换了它user
。所以请将其更改为您当前的用户名。
PS:我被迫使用 sys 和 subprocess 模块,也被迫应用所有提到的细节,这是一个家庭作业评估。
非常感谢您的支持和理解。
#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1]) as f:
for name in f.readlines():
newName = name.strip()
lastName = newName.replace("jane", "jdoe")
subprocess.run(["mv", "/home/user/"+newName, "/home/user/"+lastName])
更新
我修改了脚本以返回列表,这样我就可以完美地遍历项目,实际上脚本仅成功应用于第一个文件名,而其他两个文件名仍然有效,有什么想法吗?非常感谢。
#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r') as f:
content1 = f.readlines()
content2 = [x.strip() for x in content1]
content3 = [item.replace("jane", "jdoe") for item in content2]
for x in content2:
for i in content3:
subprocess.run(['mv', '/home/ninja-coder/'+x, '/home/ninja-coder/'+i])
答案1
感谢@Jonatã 和@HackLab 的提示。经过多次调试,我解决了这个非常烦人的评估,但我学到了很多东西,再次强调,成功的关键秘诀之一是实践,这是最终的代码
#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r') as f:
content1 = f.readlines()
content2 = [x.strip() for x in content1]
content3 = [item.replace("jane", "jdoe") for item in content2]
res = dict(zip(content2, content3))
for key, value in res.items():
subprocess.run(['mv', '/home/ninja-coder/'+key, '/home/ninja-coder/'+value])
答案2
我相信代码这个答案令人困惑且难以理解。以下是更简单的版本:
import sys
import subprocess
file = open(sys.argv[1])
for line in file:
source = line.strip()
dest = line.replace("jane", "jdoe")
subprocess.run(['mv', '<homedirectorypath>'+source, '<homedirectorypath>'+dest])
file.close()