使用 Python 3.8 和 Linux Bash 进行子进程

使用 Python 3.8 和 Linux Bash 进行子进程

我有一个 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()

相关内容