如何使用 Sys 和 Subprocess 模块更改部分文件名和 Linux Bash

How to change part of files names using Sys and Subprocess modules and Linux Bash

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

更改它们的名称
subprocess.run(['mv', 'oldfile', 'newfile')]

假设我有带字符串“jane”的文件名,我想将其替换为“jdoe”,文件名示例为:abcd_jane.csv 修改为 abcd_jdoe.csv

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

./changeJane.py oldFiles.txt

我正在使用那些空文件进行本地训练,它们的名字保存在oldFiles.txt

sdafsdfs_jane.doc 12fgdf-jane.csv files_jane.txt

迭代和更新 oldFiles.txt 中的文件名是可以的,或者也可能有一些错误 :-( 但我仍然无法弄清楚如何 运行 子进程来实现我的目标,比如如上所述。这就是我进来的,非常感谢。

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

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

更新

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

#!/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() https://www.tutorialspoint.com/python/os_listdir.html

import os

path = "./"

for filename in os.listdir(path):
    newFilename = filename.replace("jane", "jdoe")
    os.rename(path + filename, path + newFilename)

@Poshi 指出不需要子进程 os.rename 应该这样做 https://www.tutorialspoint.com/python/os_rename.htm

如果你真的想使用子进程

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 的提示。经过几次试验,我解决了这个非常烦人的评估,但我学到了很多东西,再次强调,成功的关键秘诀之一是 PRACTICE,这是最终代码

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

这对我有用!

我在作业的最后一部分使用了您的代码(使用 Python 脚本重命名文件)但不起作用。对此有何建议?

我使用了以下但不起作用=>

subprocess.run(['mv', '/home/username/'+键, '/home/username/'+值])

#!/usr/bin/env python3

import sys
import subprocess
impotr os

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

在这里使用嵌套循环不是一个好的做法,也不会达到目的。 使用 zipdictionaries

更容易
import sys
import subprocess

from pathlib import Path
with open (sys.argv[1], "r") as f:
    data=[ x.strip() for x in  f.readlines()]
    datanew=[x.replace("jane","jdoe") for x in data]
    for k, t in zip( data,datanew):
      subprocess.run(["mv",'<add path>'+k,'<add path>/+t'])
f.close()