Python 3.x 如何使用Sys和Subprocess模块以及linuxbash更改部分文件名

Python 3.x 如何使用Sys和Subprocess模块以及linuxbash更改部分文件名,python-3.x,bash,subprocess,sys,Python 3.x,Bash,Subprocess,Sys,我有一个Python脚本,它从oldFiles.txt读取文件名,遍历Linux目录中的文件名,然后使用string.replace更新文件名,最后运行一个子进程来查找这些文件(比如在home目录中查找,以使解释和演示更容易),并使用 subprocess.run(['mv', 'oldfile', 'newfile')] 假设我有字符串为“jane”的文件名,我想将其替换为“jdoe”,文件名示例是:将jane.csv修改为jdoe.csv sys.argv[1]是参数,将像下面一样传递 .

我有一个Python脚本,它从oldFiles.txt读取文件名,遍历Linux目录中的文件名,然后使用string.replace更新文件名,最后运行一个子进程来查找这些文件(比如在home目录中查找,以使解释和演示更容易),并使用

subprocess.run(['mv', 'oldfile', 'newfile')]
假设我有字符串为“jane”的文件名,我想将其替换为“jdoe”,文件名示例是:将jane.csv修改为jdoe.csv

sys.argv[1]是参数,将像下面一样传递

./changeJane.py oldFiles.txt

我正在使用这些空文件进行本地培训,它们的名称保存在oldFiles.txt中

sdafsdfs\u jane.doc 12fgdf-jane.csv文件\u jane.txt

在oldFiles.txt中迭代和更新文件名是可以的,或者可能还有一些错误:-(但我仍然不知道如何运行子流程来实现上述目标。这就是我进来的原因,非常感谢

PS:我被迫使用sys和subprocess模块,也被迫应用所有提到的细节,这是一个家庭作业评估

#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r+') as f:
  for line in f.readlines():
    newline = line.strip()
    newtext = newline.replace("jane", "jdoe")
    subprocess.run(['mv', '~/newline', '~/newtext']) #I know its wrong but this is my limit!
更新

我修改了脚本以返回列表并轻松地迭代了它的项目,脚本是成功的,但它只进行了一次迭代,这意味着它只应用了第一个文件名或第一次迭代,任何想法都可以完成所有迭代并完成工作。非常感谢

#!/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])

使用子进程重命名文件代价太高,工作量太大。请使用Python本身提供的工具重命名文件。 此外,您无需打开文件进行写入,只需参考文件即可对文件进行迭代:

#!/usr/bin/env python3

import sys
import subprocess

with open(sys.argv[1], 'r') as f:
  for line in f:
    newline = line.strip()
    newtext = newline.replace("jane", "jdoe")
    os.rename(newline, newtext)

如果要更改文件名,我不确定为什么要打开文件。 我认为您希望迭代一个目录中所有需要os.listdir()的文件

正如@Poshi所指出的,不需要子流程os.rename就可以了

如果您真的想使用子流程

subprocess.run(['mv', path + filename, path + newFilename])
更新 现在,我希望完整的解决方案能让事情变得更清楚

#!/usr/bin/env python3
import sys
import subprocess
with open(sys.argv[1], 'r') as f:
    for filename in f.readlines():
        newFilename = filename[:-1].strip().replace("jane", "jdoe")
        subprocess.run(['mv', "~/" + filename[:-1], "~/" + newFilename])

多亏了@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])

您的第一个代码更简单,您几乎是对的!您在第一个代码中没有获得所需输出的原因是您没有添加mv命令的完整路径

#!/usr/bin/env python3
import sys
import subprocess
f= open (sys.argv[1],"r")
path='/home/<username>'
for line in f.readlines():
 old_name = line.strip()
 new_name = old_name.replace("jane","jdoe")
 subprocess.run(["mv",path+old_name,path+new_name])
f.close()
!/usr/bin/env python3
导入系统
导入子流程
f=打开(系统argv[1],“r”)
路径='/home/'
对于f.readlines()中的行:
old_name=line.strip()
新名称=旧名称。替换(“jane”、“jdoe”)
子进程运行([“mv”,路径+旧名称,路径+新名称])
f、 关闭()

这对我来说很有效!

你想得太多了。忘记
子流程
,看看
操作系统。重命名
。你好。事实上,我不得不使用sys和子流程模块,这是一个家庭作业评估。如果你觉得我的问题相关,请向上投票。谢谢。
子流程。运行(['mv',path+filename,path+newFilename])
但是我不知道为什么Linux不接受变量名作为路径,比如
~/newline
,它等于oldFiles.txt中的一个文件名,并且已经存在于Linux目录中。下面是您的脚本的输出:bro
mv:cannot stat'~/sdafsdfs\u jane.doc'$'\n:当文件名正确且文件在那里,但我不知道为什么不通过。请原谅我打扰你。我非常感谢你的宝贵帮助。你能提供一个旧文件的例子吗。txt我正在使用这些空文件进行本地培训,它们保存在oldFiles.txt
sdafsdfs\u jane.doc 12fgdf-jane.csv文件\u jane.txt
Fo中文件中的问题当然在结尾有换行符,表示为\n这需要删除。如果您发现我的问题相关,请向上投票。谢谢。如果您发现我的问题相关,请向上投票。谢谢。
#!/usr/bin/env python3
import sys
import subprocess
f= open (sys.argv[1],"r")
path='/home/<username>'
for line in f.readlines():
 old_name = line.strip()
 new_name = old_name.replace("jane","jdoe")
 subprocess.run(["mv",path+old_name,path+new_name])
f.close()