Python调用SVN实现文件批量rename

使用Python调用os模块, import os
先看一下os.system()的用法:

>>> help(os.system)
Help on built-in function system in module nt:
system(...)
    system(command) -> exit_status
    
    Execute the command (a string) in a subshell.
>>>

在subshell下执行给定的命令(这个命令是一个字符串),并返回状态值。


试一下:

>>> os.system('time')

注意,与直接在dos命令行输入命令不同,这里需要给命令加上引号'',使命令为一个字符串,否则会报错:

>>> os.system(time)
Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    os.system(time)
NameError: name 'time' is not defined
>>>

接下来就知道怎么调用SVN的命令了,例如,查看svn的帮助信息:

>>> os.system('svn help')
0

因为我想给指定的文件重命名,所以,先来查看一下SVN的rename命令怎么用:

>>> os.system('svn help rename')
move (mv, rename, ren): Move and/or rename something in working copy or repository.
usage: move SRC... DST
When moving multiple sources, they will be added as children of DST,
which must be a directory.
  Note:  this subcommand is equivalent to a 'copy' and 'delete'.
  Note:  the --revision option has no use and is deprecated.
  SRC and DST can both be working copy (WC) paths or URLs:
    WC  -> WC:   move and schedule for addition (with history)
    URL -> URL:  complete server-side rename.
  All the SRCs must be of the same type.
Valid options:
  -r [--revision] ARG      : ARG (some commands also take ARG1:ARG2 range)
                             A revision argument can be one of:
                                NUMBER       revision number
                                '{' DATE '}' revision at start of the date
                                'HEAD'       latest in repository
                                'BASE'       base rev of item's working copy
                                'COMMITTED'  last commit at or before BASE
                                'PREV'       revision just before COMMITTED
  -q [--quiet]             : print nothing, or only summary information
  --force                  : force operation to run
  --parents                : make intermediate directories
  -m [--message] ARG       : specify log message ARG
  -F [--file] ARG          : read log message from file ARG
  --force-log              : force validity of log message source
  --editor-cmd ARG         : use ARG as external editor
  --encoding ARG           : treat value as being in charset encoding ARG
  --with-revprop ARG       : set revision property ARG in new revision
                             using the name[=value] format
Global options:
  --username ARG           : specify a username ARG
  --password ARG           : specify a password ARG
  --no-auth-cache          : do not cache authentication tokens
  --non-interactive        : do no interactive prompting
  --trust-server-cert      : accept unknown SSL server certificates without
                             prompting (but only with '--non-interactive')
  --config-dir ARG         : read user configuration files from directory ARG
  --config-option ARG      : set user configuration option in the format:
                                 FILE:SECTION:OPTION=[VALUE]
                             For example:
                                 servers:global:http-library=serf

0

好的,可以看到:move (mv, rename, ren): Move and/or rename something in working copy or repository.
使用move(或者rename)命令来移动,重命名的操作。当然也可以用简写 mv,ren。

在使用之前先来用一个简单的例子来试探一下:

>>> os.system('svn log')
svn:'.' is not a working copy
1

当前目录不是一个(SVN的)工作副本!看一下log命令的用法:

 

log: Show the log messages for a set of revision(s) and/or file(s).
usage: 1. log [PATH]
       2. log URL[@REV] [PATH...]
  1. Print the log messages for a local PATH (default: '.').
     The default revision range is BASE:1.
  2. Print the log messages for the PATHs (default: '.') under URL.
     If specified, REV determines in which revision the URL is first
     looked up, and the default revision range is REV:1; otherwise,
     the URL is looked up in HEAD, and the default revision range is
     HEAD:1.
  Multiple '-c' or '-r' options may be specified (but not a
  combination of '-c' and '-r' options), and mixing of forward and
  reverse ranges is allowed.
  With -v, also print all affected paths with each log message.
  With -q, don't print the log message body itself (note that this is
  compatible with -v).
  Each log message is printed just once, even if more than one of the
  affected paths for that revision were explicitly requested.  Logs
  follow copy history by default.  Use --stop-on-copy to disable this
  behavior, which can be useful for determining branchpoints.
  Examples:
    svn log
    svn log foo.c
    svn log http://www.example.com/repo/project/foo.c
    svn log http://www.example.com/repo/project foo.c bar.c
Valid options:
  -r [--revision] ARG      : ARG (some commands also take ARG1:ARG2 range)
                             A revision argument can be one of:
                                NUMBER       revision number
                                '{' DATE '}' revision at start of the date
                                'HEAD'       latest in repository
                                'BASE'       base rev of item's working copy
                                'COMMITTED'  last commit at or before BASE
                                'PREV'       revision just before COMMITTED
  -q [--quiet]             : print nothing, or only summary information
  -v [--verbose]           : print extra information
  -g [--use-merge-history] : use/display additional information from merge
                             history
  -c [--change] ARG        : the change made in revision ARG
  --targets ARG            : pass contents of file ARG as additional args
  --stop-on-copy           : do not cross copies while traversing history
  --incremental            : give output suitable for concatenation
  --xml                    : output in XML
  -l [--limit] ARG         : maximum number of log entries
  --with-all-revprops      : retrieve all revision properties
  --with-no-revprops       : retrieve no revision properties
  --with-revprop ARG       : retrieve revision property ARG
Global options:
  --username ARG           : specify a username ARG
  --password ARG           : specify a password ARG
  --no-auth-cache          : do not cache authentication tokens
  --non-interactive        : do no interactive prompting
  --trust-server-cert      : accept unknown SSL server certificates without
                             prompting (but only with '--non-interactive')
  --config-dir ARG         : read user configuration files from directory ARG
  --config-option ARG      : set user configuration option in the format:
                                 FILE:SECTION:OPTION=[VALUE]
                             For example:
                                 servers:global:http-library=serf

OK!log后面加命令的路径,如果没有设置,就是当前目录。那么接下来,首先想到的是在命令后面加上路径:

>>> os.system('svn log E:\test')


但是如果要进行多次操作的话,这样就很不方便。最好是把路径切换到我们的工作目录。那么继续使用DOS命令来操作:

>>> os.system('E:')
0
>>> os.getcwd()
'C:\\Python26'
>>>

很遗憾当前路径并没有改变。因为os.system调用的命令是在subshell下执行的,而python shell的当前目录并没有改变,这里需要用到
os模块中的FUNCTION:
    chdir(...)
        chdir(path)
        
        Change the current working directory to the specified path.

>>> os.chdir('E:\test')
>>> print os.getcwd()
E:\test

好了,我们把工作目录设定为rootpath,并且把此目录下的 Test01_2013_11_15_01-001.txt 重命名为 Test01_2013_11_15_01_001.txt :

>>> rootpath=r'E:\test'
>>> os.system('svn move Test01_2013_11_15_01-001.txt Test01_2013_11_15_01_001.txt')
A         Test01_2013_11_15_01_001.txt
D         Test01_2013_11_15_01-001.txt
0

好了,忙了半天只让单个文件重命名,这绝对不是我的初衷。如何批量改名呢?把文件名给变量试试?
首先获取目录下的文件:

>>> filenames = os.listdir(path)

然后定义想要改变的字符以及替换的字符:

>>> source_char = raw_input('Enter the characters that you want to modify:')
Enter the characters that you want to modify:-0
>>> copy_char = raw_input('Enter the characters that you want to get:')
Enter the characters that you want to get:_0
>>> for old_file in filenames:
 new_file = string.replace(old_file,source_char,copy_char)
 os.system('svn move old_file new_file')

 
1
1
1
1
1
1
1
1
1
1
1
1
1

返回值为1,操作失败!

因为在rename 命令执行时,把变量old_file 和 new_file当做了普通的字符,而不是某个文件名。

解决方法很简单,就是在文件名变量变成普通字符传之前,把rename命令写成字符串:
 svnren=r'svn move '+old_file+' '+new_file
 os.system(svnren)

 


你可能感兴趣的:(Python调用SVN实现文件批量rename)