以递归方式从文件夹/文件名中删除字符

时间:2014-07-07 16:07:26

标签: python

我开始编写一个脚本来从linux os walk中删除非法字符。从文件开始,然后是文件夹。这是我到目前为止所拥有的 -

import sys
import os
import re

# List of illegal chars to run through to replace in the filesystem walk
chars = ['~', '*', '\\', ':', '<', '>', '|', '?', '"']

def ReplaceChars(value):
    for c in chars:
        value = value.replace(c, '')
    return value

def RenamePath(path):
    newFilePath = ReplaceChars(path)
    os.rename(path, newFilePath)

def WalkFileSystem(dirroot):
    # Main Walk Through File System
    for root, dirs, files in os.walk(dirroot, topdown=False):
        for name in files:
            searchObj = re.search(r'[%s]' % ''.join(chars), os.path.join(root, name))
            if searchObj:
                RenamePath(os.path.join(root, name))

        for name in dirs:
            searchObj = re.search(r'[%s]' % ''.join(chars), os.path.join(root, name))
            if searchObj:
                RenamePath(os.path.join(root, name))

if __name__ == "__main__":
    # Calls the WalkFileSystem Function
    WalkFileSystem('/TestFolder/')

在某些情况下确实有效。问题是,如果我有像* test / os.rename这样的目录名称并不喜欢它,因为如果尝试重命名该目录下的文件,它就不会破坏路径中的那个通配符(我猜那就是问题)

两个问题 -

  • 如何在这种情况下解决问题?
  • 这是最恐怖的方式吗?还是我在这里失去了情节?

使用工作示例更新

import argparse
import os
import re

# List of illegal chars to run through to replace in the filesystem walk
chars = ['~', '*', '\\', ':', '<', '>', '|', '?', '"']

def ReplaceChars(value):
    for c in chars:
        value = value.replace(c, '')
    return value


def RenamePath(root, path):
    newFilePath = ReplaceChars(path)
    os.rename(os.path.join(root, path), os.path.join(root, newFilePath))


def WalkFileSystem(dirroot):
    # Main Walk Through File System
    for root, dirs, files in os.walk(dirroot, topdown=False):

    for name in dirs:
        searchObj = re.search(r'[%s]' % ''.join(chars), name)
        if searchObj:
            RenamePath(root, name)


    for name in files:
        searchObj = re.search(r'[%s]' % ''.join(chars), name)
        if searchObj:
            RenamePath(root, name)


if __name__ == "__main__":
    # Calls the WalkFileSystem Function
    WalkFileSystem('/home/mpashby/Scripts/TestFolder/')

干杯,

1 个答案:

答案 0 :(得分:0)

那是因为当你的脚本运行RenamePath时,它会做这样的事情:

>>> os.rename(str('/testdir/*test/h.txt'), '/testdir/test/h.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory

您正尝试使用目前尚不存在的目录(/testdir/test/h.txt)重命名路径,因此您将收到错误

但是下面的一个工作正常。

>>> os.rename(str('/testdir/*test/h.txt'), '/testdir/*test/g.txt')
>>> 

但是,您不需要任何特殊字符,因此,我先说先删除目录路径中的特殊字符,然后再对文件执行操作,这样,您就不会&#39;没有这样的文件或目录&#39;错误。