Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文件重命名/删除_Python_Unix - Fatal编程技术网

Python 文件重命名/删除

Python 文件重命名/删除,python,unix,Python,Unix,我有一些这样的文件- *.sss和*u.sss 如果我有一个名为blah1.sss和blah1_passive.sss的文件,我想去掉blah1.sss并重命名blah1_passive.sss。但是,如果我没有blah1_passive.sss,我希望记录文件名并保留blah1.sss 我能够找到所有*_passive.sss文件,但我想知道可以将*_passive.sss重命名为*.sss的awk/sed etc命令 编辑:现在我有这个,但os.rename不会覆盖文件,我需要它来覆盖 im

我有一些这样的文件-

*.sss和*u.sss

如果我有一个名为blah1.sss和blah1_passive.sss的文件,我想去掉blah1.sss并重命名blah1_passive.sss。但是,如果我没有blah1_passive.sss,我希望记录文件名并保留blah1.sss

我能够找到所有*_passive.sss文件,但我想知道可以将*_passive.sss重命名为*.sss的awk/sed etc命令

编辑:现在我有这个,但os.rename不会覆盖文件,我需要它来覆盖

import os, fnmatch

def locate(pattern, root=os.curdir):

    #ignore directories- uncomment to make ignore work
    #ignored = ["0201", "0306"]
  for path, dirs, files in os.walk(os.path.abspath(root)):
         #for dir in ignored:                  # if dir in dirs:                        #dirs.remove(dir)
    for filename in fnmatch.filter(files, pattern):
       yield os.path.join(path, filename)



for filename in locate("*_passive.sss"):
               #found the files that i want to rename, but os.rename() refuses to overwrite !! 
    newfilename=filename.rstrip("_passive.sss") + ".sss"
    os.rename(filename,newfilename)

在Unix中,您可以在Bourne shell(即sh/bash)中使用以下命令:


此shell脚本应执行以下操作:

while read f; do
    fp="`echo "$f" | sed -nr 's|(.*)(\.sss)|\1_passive\2| p'`"
    if [ -f "$fp" ]; then mv "$fp" "$f"
    else  echo "file $fp missing" >> missing.log
    fi
done<<<"`ls -1 *.sss | grep -v _passive.sss`"

还将向missing.log报告丢失的被动文件这里有一个python解决方案:

import os
from glob import glob

# Write out test files.
with open('foo.sss', 'w'):  pass
with open('foo_passive.sss', 'w'):  pass
with open('bar.sss', 'w'):  pass

# Rename files.
files = glob('*.sss')
for filename in files:
  if filename.endswith('_passive.sss'):  continue
  passive_fname = filename.split('.sss')[0] + '_passive.sss'
  if passive_fname in files:
    os.remove(filename)
    os.rename(passive_fname, filename)
  else:
    print 'no passive: ', filename

谢谢,这在windows下行吗?我试着用sh.exe运行它,它告诉我意外标记doneOMG附近的语法错误。如果要在Windows上运行,为什么要标记unix?这是一个unix shell脚本,可以在所有shell中运行,AFAIK@Illusionist:我从未使用过sh.exe,但我想他不知道如何处理错误,如果你用它开始你的脚本,它会起作用的/usr/bin/env bash@格雷格:这在某些shell中肯定会起作用,但在其他shell中肯定不会起作用@魔术师:你的问题被标记为Python,脚本语言重要吗,还是你只是想完成任务?@illusionist:不客气。如果您对我的答案感到满意,请将其标记为已接受:-我很想在python中实现这一点,os.rename将为我完成此任务,但它不会过度写入文件。我会引用文件名,以避免在出现空格时出现问题filenames@Illusionist:使用os.rename尝试先删除要覆盖的文件。阅读文档:尝试os.RemoveneFileName;重命名文件名,新文件名
import os
from glob import glob

# Write out test files.
with open('foo.sss', 'w'):  pass
with open('foo_passive.sss', 'w'):  pass
with open('bar.sss', 'w'):  pass

# Rename files.
files = glob('*.sss')
for filename in files:
  if filename.endswith('_passive.sss'):  continue
  passive_fname = filename.split('.sss')[0] + '_passive.sss'
  if passive_fname in files:
    os.remove(filename)
    os.rename(passive_fname, filename)
  else:
    print 'no passive: ', filename