[python] 如何把文件夹和文件名中的空格替换成下划线?

Python/PHP/Perl 开发与设计
回复
头像
nickleeh
帖子: 130
注册时间: 2008-08-06 13:24
送出感谢: 1 次
接收感谢: 0

[python] 如何把文件夹和文件名中的空格替换成下划线?

#1

帖子 nickleeh » 2014-09-02 9:56

我想把文件夹和文件名中的空格替换成下划线,在Python中:

代码: 全选


# import os

# def rm_space():
#     for f in os.listdir("."):
#         if f.find(" ") > 0:
#             n  =  f.replace(" ", "_")
#             if n != f:
#                 os.rename(f, n)
#             else:
#                 os.rename(f, "_"+n)
但这个脚本不能在子文件夹中实现,即不能递归替换。

改用os.walk:

代码: 全选

import os

def rm_space():
    for root, dirs, files in os.walk("."):
        for fn in files:
            if fn.find(" ") > 0:
                n  =  files.replace(" ", "_")
                if n != fn :
                    os.rename(fn, n)
                else:
                    os.rename(fn, "_"+n)
还是不行。请大家帮我看一下,哪个地方出问题了?谢谢!


注: 用 python/ipython 来实现。
buntutu
帖子: 61
注册时间: 2009-11-25 1:38
送出感谢: 0
接收感谢: 7 次

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#2

帖子 buntutu » 2014-09-02 17:47

子文件夹下当然不行,你的 fn 只是一个文件名,没有文件夹部分,那么只在当前文件夹下是有效的, os.rename() 在当前目录下找不到子文件夹下的文件名,自然失败。

你需要把文件夹的路径和文件名合并后,作为 os.rename的参数。

fn = os.path.join(dir, fn)
n = fn.replace(" ", "_")
os.rename(fn, n)
头像
nickleeh
帖子: 130
注册时间: 2008-08-06 13:24
送出感谢: 1 次
接收感谢: 0

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#3

帖子 nickleeh » 2014-09-02 20:21

buntutu 写了:子文件夹下当然不行,你的 fn 只是一个文件名,没有文件夹部分,那么只在当前文件夹下是有效的, os.rename() 在当前目录下找不到子文件夹下的文件名,自然失败。

你需要把文件夹的路径和文件名合并后,作为 os.rename的参数。

fn = os.path.join(dir, fn)
n = fn.replace(" ", "_")
os.rename(fn, n)
多谢!

我是新手,刚刚接触编程,有些愚钝。不太明白这个 os.path.join(dir, fn) 的用法。能具体一些吗,或者有能运行的例子我来学习一下。

去除文件名中的空格应该是很常见的任务吧,是不是python已经有典型的实现了呢?
buntutu
帖子: 61
注册时间: 2009-11-25 1:38
送出感谢: 0
接收感谢: 7 次

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#4

帖子 buntutu » 2014-09-02 21:34

代码: 全选

>>> fn = "fname.txt"
>>> dir = "./folder1/folder2/"
>>> os.path.join(dir, fn)
'./folder1/folder2/fname.txt'

os.path.join 的说明在手册 os.path 章

其实在 os.walk 里吧 root, dirs, files 的内容列出来,你就应该知道问题在哪里了

代码: 全选

for root, dirs, files in os.walk("."):
    print(root, dirs, files)
python 编程,多利用 print 来列出变量内容,是查找问题的最重要手段。其实所有编程 print 都是最重要的除错手段

代码: 全选

import os
def rm_space():
    for root, dirs, files in os.walk(".", topdown=False):
        for fn in files:
            if fn.find(" ") > 0:
                n  =  fn.replace(" ", "_")
                fn = os.path.join(root, fn)
                n = os.path.join(root, n)
                os.rename(fn, n)
        for d in dirs: # remove space in directory names
            if " " in d:
                nd = d.replace(" ", "_")
                d = os.path.join(root, d)
                nd = os.path.join(root, nd)
                os.rename(d, nd)
类似这样吧
头像
nickleeh
帖子: 130
注册时间: 2008-08-06 13:24
送出感谢: 1 次
接收感谢: 0

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#5

帖子 nickleeh » 2014-09-03 14:59

buntutu 写了:

代码: 全选

>>> fn = "fname.txt"
>>> dir = "./folder1/folder2/"
>>> os.path.join(dir, fn)
'./folder1/folder2/fname.txt'

os.path.join 的说明在手册 os.path 章

其实在 os.walk 里吧 root, dirs, files 的内容列出来,你就应该知道问题在哪里了

代码: 全选

for root, dirs, files in os.walk("."):
    print(root, dirs, files)
python 编程,多利用 print 来列出变量内容,是查找问题的最重要手段。其实所有编程 print 都是最重要的除错手段

代码: 全选

import os
def rm_space():
    for root, dirs, files in os.walk(".", topdown=False):
        for fn in files:
            if fn.find(" ") > 0:
                n  =  fn.replace(" ", "_")
                fn = os.path.join(root, fn)
                n = os.path.join(root, n)
                os.rename(fn, n)
        for d in dirs: # remove space in directory names
            if " " in d:
                nd = d.replace(" ", "_")
                d = os.path.join(root, d)
                nd = os.path.join(root, nd)
                os.rename(d, nd)
类似这样吧

多谢 “buntutu”!

我试了这段代码,只有在文件夹所处的目录中,有含有空格的文件时,这个文件夹才能去空格。例如:
a dir
|--b dir
|--b file

只有b file中存在空格时,b dir才能去除空格。否则,b dir 不能去除空格。

我没搞清楚错在哪里了?
buntutu
帖子: 61
注册时间: 2009-11-25 1:38
送出感谢: 0
接收感谢: 7 次

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#6

帖子 buntutu » 2014-09-03 17:39

没看出问题,测试也没有问题,你抄错了吧?

for fn in files:

for d in dirs: # remove space in directory names

的缩进是相同的。
附件
test.py
测试脚本
(609 Bytes) 下载 121 次
头像
nickleeh
帖子: 130
注册时间: 2008-08-06 13:24
送出感谢: 1 次
接收感谢: 0

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#7

帖子 nickleeh » 2014-09-03 23:02

buntutu 写了:没看出问题,测试也没有问题,你抄错了吧?

for fn in files:

for d in dirs: # remove space in directory names

的缩进是相同的。
非常感谢!

下载你的代码就没有问题了。可能是emacs把代码重排出了差错。我开始也推断是缩进的问题,可是调整之后还是不行。(应该是我没调回来。)如何避免拷贝代码缩进变乱的情况呢?顺便问一下你用什么编辑器/IDE呢?
buntutu
帖子: 61
注册时间: 2009-11-25 1:38
送出感谢: 0
接收感谢: 7 次

Re: [python] 如何把文件夹和文件名中的空格替换成下划线?

#8

帖子 buntutu » 2014-09-04 9:47

你可以使用 diff 来查看文件之间的差别:

代码: 全选

diff -u test.py mytest.py
或者使用 meld 之类的图形 diff 工具。

剪贴的问题,也没什么好办法,各个网站代码不同,有的能够较好的保留格式,有的不行。实在不行,可能使用浏览器的“存成txt"的方法再提取会容易些吧。

我使用 gvim 做编辑器,其实用什么编程无所谓,设置好了后,效率都很高。手熟耳

另外 tab 和空格混排对于 python 也会是很大问题,所以编辑器最好设定成把tab展开成空格。
这些用户感谢了作者 buntutu 于这个帖子:
nickleeh (2014-09-05 21:54)
评价: 3.7%
回复

回到 “Python/Php/Perl”