python-3.x 如何使用Sys和Subprocess模块以及Linux Bash更改部分文件名

vs3odd8k  于 2022-12-24  发布在  Python
关注(0)|答案(8)|浏览(126)

我有一个Python脚本,它从oldFiles.txt中读取文件名,迭代Linux目录中的文件名,然后使用string. replace更新文件名,最后运行一个子进程来查找这些文件(假设在主目录中,以便于解释和演示),并使用

subprocess.run(['mv', 'oldfile', 'newfile')]

让我们假设我有字符串为"jane"的文件名,我想用"jdoe"替换它,文件名的例子将是:已将abcd_jane. csv修改为abcd_jdoe. csv
sys.argv [1]是一个参数,它将按如下方式传递

./changeJane.py oldFiles.txt

我正在使用这些空文件进行本地培训,它们的名称保存在oldFiles.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])
mwecs4sa

mwecs4sa1#

您的第一个代码比较简单,而且几乎是正确的!在第一个代码中没有得到所需输出的原因是您没有添加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()

这对我很有效!

4smxwvx5

4smxwvx52#

感谢@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])
kmbjn2e3

kmbjn2e33#

使用嵌套循环在这里不是一个好的做法,也不适用于此目的。使用zip比使用dictionary更容易

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()
31moq8wy

31moq8wy4#

使用子进程来重命名文件的代价太高,而且工作量太大。使用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)
lxkprmvk

lxkprmvk5#

我不知道为什么你要打开一个文件,如果你想改变文件名,我认为你想迭代一个目录中的所有文件,你需要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

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])
qncylg1j

qncylg1j6#

我在作业的最后一部分使用了你的代码(使用Python脚本重命名文件),但是不起作用。对此有什么建议吗?
我使用了以下命令,但不起作用=〉
subprocess.run([“mv”、“/主页/用户名/”+键、“/主页/用户名/”+值])

wfveoks0

wfveoks07#

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

rjzwgtxy8#

`
#!/usr/bin/env python3

import sys
import subprocess

with open(sys.argv[1],'r') as f:
        path='/home/student-01-88c93c037e85'
        for filename in f.readlines():
                filename = filename.strip()
                newname = filename.rstrip().replace("jane","jdoe")
                subprocess.run(["mv",path+filename,path+newname])
        f.close()

`

相关问题