V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeroday
V2EX  ›  问与答

Python 处理有空格的文件名的问题

  •  
  •   zeroday · 2015-08-29 15:27:19 +08:00 · 13829 次点击
    这是一个创建于 3373 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码想复制文件夹下的 .md 文件到另一个文件夹中

    import os
    
    def copy_file ( dirname ):
        """Copy .md file in a given directory and its subdirectories.
        """
        for root, dirs, file in os.walk ( dirname ):
            for f in file:
                if os.path.splitext (root+f )[1] == ".md":
                    os.system ("cp %s ~/file/"%os.path.join ( root, f ))
    
    copy_file ('.')
    

    可是因为文件名带空格,报这样的错误,请问有什么好的处理方法呢?

    cp: cannot stat ‘./Chapter ’: No such file or directory
    cp: cannot stat ‘ 01 ’: No such file or directory
    cp: cannot stat ‘ Best ’: No such file or directory
    cp: cannot stat ‘ Friends/from-morse-to-binary.md ’: No such file or directory
    cp: cannot stat ‘./Chapter ’: No such file or directory
    cp: cannot stat ‘ 02 ’: No such file or directory
    cp: cannot stat ‘ Code ’: No such file or directory
    
    16 条回复    2015-08-29 19:00:51 +08:00
    lianyue
        1
    lianyue  
       2015-08-29 15:33:11 +08:00
    空格转发成% 20 试试
    lianyue
        2
    lianyue  
       2015-08-29 15:33:20 +08:00
    转换
    ratazzi
        3
    ratazzi  
       2015-08-29 15:45:03 +08:00   ❤️ 1
    我能吐槽这 Python 的用法吗,为什么不用自带模块还要去调用命令,而且还是写在循环里
    loading
        4
    loading  
       2015-08-29 15:45:46 +08:00 via Android
    转义

    顺便把+号也处理了,我前阵子也是写文件系统相关的东西!
    Sylv
        5
    Sylv  
       2015-08-29 15:57:15 +08:00 via iPhone   ❤️ 1
    文件名加引号:
    "cp '%s' ~/file/"

    不过还是用 Python 来复制吧,你这样有点多此一举。
    loading
        6
    loading  
       2015-08-29 16:11:15 +08:00 via Android
    看到楼主用 os.path 想必是没找到 os.copy

    其实是 shutil.copy
    zeroday
        7
    zeroday  
    OP
       2015-08-29 16:32:31 +08:00
    @Sylv 谢谢,文件名加引号真的成功了。

    我试着用 python shutil.copyfile 进行复制

    filename = os.path.join (root, f )
    shutil.copyfile (filename, "~/file1/%s"%f )

    提示错误。

    ```
    Traceback (most recent call last ):
    File "walk.py", line 17, in <module>
    copy_file ('.')
    File "walk.py", line 15, in copy_file
    shutil.copyfile (filename, "~/file1/%s"%f )
    File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 83, in copyfile
    with open (dst, 'wb') as fdst:
    IOError: [Errno 2] No such file or directory: '~/file1/from-morse-to-binary.md'
    ```
    ryd994
        8
    ryd994  
       2015-08-29 16:37:41 +08:00 via Android   ❤️ 1
    @zeroday ~当 home 不是哪里都通用的
    zeroday
        9
    zeroday  
    OP
       2015-08-29 16:49:52 +08:00
    @ryd994 谢谢~
    Sylv
        10
    Sylv  
       2015-08-29 16:51:32 +08:00   ❤️ 1
    @zeroday Python 是不认 ~ 的,所以你得手动写完整路径,或用 os.path.expanduser () 补全路径。
    binux
        11
    binux  
       2015-08-29 16:59:27 +08:00 via Android   ❤️ 1
    第一, Python 自带 copy 调用
    第二, Python 自带转义函数
    非要自己手拼命令,都不知道是怎么死的
    zeroday
        12
    zeroday  
    OP
       2015-08-29 17:01:37 +08:00
    @Sylv 谢谢,又学到一个用法了。
    zeroday
        13
    zeroday  
    OP
       2015-08-29 17:05:11 +08:00
    @binux 嗯嗯,谢谢大家的指点了。这是在大家帮助下,完善好的代码。

    想将文件夹下的 aaaBbbCcc.md 的文件复制为 2014-09-%d-aaa-bbb-ccc.md

    import os
    import shutil
    import re

    def copy_file ( dirname ):
    """Copy .md file in a given directory and its subdirectories.
    """
    i = 0
    for root, dirs, file in os.walk ( dirname ):
    for f in file:
    if os.path.splitext (root+f )[1] == ".md":
    filename = os.path.join (root, f )
    i += 1
    list = re.sub ( r"([A-Z])", r" \1", f ).split ()
    f = '-'.join (list ).lower ()
    shutil.copyfile (filename, os.path.expanduser ("~/file2/2014-09-%02d-%s"%(i,f )))

    copy_file ('.')
    lionyue
        14
    lionyue  
       2015-08-29 17:11:14 +08:00
    文件路径用双引号
    zeroday
        15
    zeroday  
    OP
       2015-08-29 17:13:21 +08:00
    @lionyue Okay, copy_file ('.') 修改为=> copy_file (".")
    binux
        16
    binux  
       2015-08-29 19:00:51 +08:00
    pipes.quote
    @zeroday
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2137 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:46 · PVG 08:46 · LAX 16:46 · JFK 19:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.