处理路径变量python中的空格

时间:2012-07-26 14:42:50

标签: python python-2.6

我有一个字符串如下

command= "copy1 "D:\path1\program Files" "c:\program Files\path1" copy2 "D:\path2\program Files" "c:\program Files\path2""

请注意,copy1和copy2都在字符串中。我的目的是将每个复制过程写入xml文件,如下所示:

        <copyFiles>
               <copy1>
                    <Sourcepath>D:\path1\program Files</Sourcepath>
                    <DestPath>c:\program Files\path1</DestPath>
                </copy1>

                 <copy2>
                    <Sourcepath>D:\path2\program Files</Sourcepath>
                    <DestPath>c:\program Files\path2</DestPath>
                  </copy2>

         <copyFiles>

我试图通过使用空格分割字符串来创建每个参数的列表,如下所示:

Copyparamlist=command.split(' ')

但是我按照以下方式对xml进行了调整:

        <copyFiles>
               <copy1>
                    <Sourcepath>D:\path1\program</Sourcepath>
                    <DestPath>c:\program</DestPath>
                </copy1>

                 <copy2>
                    <Sourcepath>D:\path2\program</Sourcepath>
                    <DestPath>c:\program</DestPath>
                  </copy2>

         <copyFiles>

我的清单内容应如下: ["copy1", "D:\path1\program Files", "c:\program Files\path1", "copy2", "D:\path2\program Files]", "c:\program Files\path2"]

请帮忙

7 个答案:

答案 0 :(得分:1)

很难说出你想要的是什么,但看起来你想分割字符串如下:

a = 'this "is a string" with "4 elements"'
split = magic_splitter(a)  #How to write magic splitter?
print split  #['this', 'is a string', 'with', '4 elements']

如果是这种情况,你想要的是使用奇妙的函数shlex.split

print shlex.split(a) #['this', 'is a string', 'with', '4 elements']

答案 1 :(得分:0)

您想要的输出是什么?您可以使用join将其放入您想要的任何格式。例如,要简单地删除空格,请使用

Copyparamlist=''.join(command.split(' '))

或者如果您想用%20替换它们,请使用

Copyparamlit='%20'.join(command.split(' '))

答案 2 :(得分:0)

你需要另外一个除空格之外的分隔符...... 例如......你可以使用例如引用分隔符的东西作为

CopyParam = command.split('"')

我应该了解string命令的格式 as copyName“Source”“Destination”... 你可以循环三元组列表...... 像

for i in xrange(0, len(CopyParam), 3): 
    copyname, sourcepath, destpath = CopyParam[i], CopyParam[i + 1], CopyParam[i + 2]
    # Do the code to transfer it to XML here ..

您可能需要先从列表中删除空元素..

答案 3 :(得分:0)

我假设您的命令字符串实际上被指定为;

command='copy1 "something with spaces" "somewhere else" copy2 "this thing" "elsewhere"'

如果您的命令始终是复制命令,可能会查看“复制”一词的拆分并使用结果列表,

command.split('copy')
['','1 "something with spaces" "somewhere else" ','2 "this thing" "elsewhere"']

答案 4 :(得分:0)

我认为这个帖子可能有你想要的东西。如果你试图忽略引号中的分割,你可能不得不使用正则表达式。

How to split but ignore separators in quoted strings, in python?

试试这段代码:

import re
PATTERN = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''')
command = PATTERN.split(command)

答案 5 :(得分:0)

有了它,它可以很容易地作为字典管理:

import shlex
split = shlex.split(commandlist)
commands = dict(zip(split[::3], zip(split[1::3], split[2::3])))

说明: 鉴于字符串&#39; copyname&#34; source&#34; &#34; DEST&#34; copyname2&#34; source2&#34; &#34; dest2&#34;&#39; ...

split = shlex.split()将以['copyname', 'source', 'dest', 'copyname2', 'source2','dest2']

格式拆分字符串

split[::3]正在做一些叫做拼接的事情。这隐含地说&#39;从0指数开始,给我每三个项目。 split[::3]将等于['copyname', 'copyname2']。但是,拼接并不止于此。 split[1::3]表示从索引1开始,然后在此之后给出每个第三个元素。它将返回所有来源。

zip功能是一个独特的功能。鉴于列表l1=['a','b','c']l2=[1,2,3]zip(l1,l2)将等于[('a',1),('b',2), ('c',3)]

zip(split[1::3], split[2::3])将等于[('source', 'dest'), ('source2', 'dest2')]

zip(split[::3], zip(split[1::3], split[2::3]))将等于[('copyname',('source','dest')), ('copyname2',('source2','dest2'))]

dict函数会将给定列表中的每个键/值对(copyname('source','dest'))转换为字典。

commands变量现在采用{'copyname': ('source', 'dest'), ...}格式 要写入xml,只需遍历字典即可。

专业提示:当使用for遍历字典时,每个项目都是一个键。

如果您愿意,可以使用for copyname, source, dest in zip(split[::3], split[1::3], split[2::3])

答案 6 :(得分:0)

尝试以下示例:

import shlex
import xml.etree.ElementTree as etree

def my_parser(s):
    command = []
    for item in shlex.split(s):
        if item.startswith('copy'):
            if command:            # any previous command was collected?
                yield command      # output one parsed command
            command = [ item ]     # start collecting new command
        else:
            command.append(item)   # collect another argument    

    if command:                    # if anything was collected
        yield command              # output the last parsed command


cmd = r'copy1 "D:\path1\program Files" "c:\program Files\path1" copy2 "D:\path2\program Files" "c:\program Files\path2"'

# Just to show what are the parsed command in the lists
for command in my_parser(cmd):
    print command

# Alternatively, constructing the XML.
e = etree.Element('copyFiles')    # root element
tree = etree.ElementTree(e)
root = tree.getroot()             # now the same as e 

for command in my_parser(cmd):
    assert len(command) == 3
    assert command[0].startswith('copy')

    e = etree.Element(command[0])  # the command name becomes the tag name 

    src = etree.Element('Sourcepath')  # subelement
    src.text = command[1]

    dst =  etree.Element('DestPath')   # subelement
    dst.text = command[2]

    e.append(src)                  # subelement appended to its parent
    e.append(dst)                  # subelement appended to its parent

    root.append(e)                 # command appended to the root element

tree.write('output.xml')

打印:

['copy1', 'D:\\path1\\program Files', 'c:\\program Files\\path1']
['copy2', 'D:\\path2\\program Files', 'c:\\program Files\\path2']

并生成output.xml,其中包含以下内容(作为一行,在此处手动换行):

<copyFiles><copy1><Sourcepath>D:\path1\program Files</Sourcepath>
<DestPath>c:\program Files\path1</DestPath></copy1>
<copy2><Sourcepath>D:\path2\program Files</Sourcepath>
<DestPath>c:\program Files\path2</DestPath></copy2></copyFiles>
相关问题