标签: shlex

什么是shlex.split的反面?

我怎样才能扭转结果shlex.split呢?也就是说,如果给出一个我希望引用的字符串,我怎样才能获得一个"类似于Unix shell"list的带引号的字符串?

Update0

我找到了一个Python错误,并在此处提出了相应的功能请求.

python shell split shlex

38
推荐指数
5
解决办法
8489
查看次数

Python:拆分字符串,尊重并保留引号

使用python,我想拆分以下字符串:

a=foo, b=bar, c="foo, bar", d=false, e="false"
Run Code Online (Sandbox Code Playgroud)

这应该导致以下列表:

['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"']
Run Code Online (Sandbox Code Playgroud)

当在posix模式下使用shlex并使用","分割时,get的参数c被正确处理.但是,它删除了引号.我需要它们,因为它们false不一样"false",例如.

我的代码到目前为止:

import shlex

mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'

splitter = shlex.shlex(mystring, posix=True)
splitter.whitespace += ','
splitter.whitespace_split = True
print list(splitter) # ['a=foo', 'b=bar', 'c=foo, bar', 'd=false', 'e=false']
Run Code Online (Sandbox Code Playgroud)

python split shlex

13
推荐指数
1
解决办法
1万
查看次数

shlex.split仍然不支持unicode?

根据文档,在Python 2.7.3中,shlex应该支持UNICODE.但是,当运行下面的代码时,我得到:UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-189: ordinal not in range(128)

难道我做错了什么?

import shlex

command_full = u'software.py -fileA="sequence.fasta" -fileB="??????.fasta.txt" -output_dir="..." -FORMtitle="tst"'

shlex.split(command_full)
Run Code Online (Sandbox Code Playgroud)

确切的错误如下:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shlex.py", line 275, in split
    lex = shlex(s, posix=posix)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shlex.py", line 25, in __init__
    instream = StringIO(instream)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 44-49: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

这是我的mac使用python从macports输出的.我在使用"native"python 2.7.3的Ubuntu机器上得到完全相同的错误.

python unicode shlex python-unicode

12
推荐指数
1
解决办法
2921
查看次数

使用python设置组权限

这是我的设置:

我有一个VirtualMachine(Ubuntu 14.04.LTS),其中运行PostgreSQL/PostGIS数据库.

使用QGIS中的Windows 7,我连接到此数据库并将要素图层加载到我的GIS项目中.

使用一些python代码,我创建了一个带有tile ID和一些信息的文件.

import os
import io
import time

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "fishnet_final":
    layer = lyr

for f in layer.selectedFeatures():
    pth = os.path.join(os.path.dirname(r'H:\path_to_file\'), str(f['name']) + "_" + str(time.strftime("%Y-%m-%d")) + "_" + str(f['country']) + ".txt")
    fle = open(pth,'wb')    
    fle.writelines(str(f['name']))
    fle.write('\n')
    fle.write(str(time.strftime("%Y-%d-%m")))
    fle.write('\n')
    fle.write(str(f['country']))
    fle.write('\n')
    fle.close()
    os.rename(pth, pth.replace(' ', ''))
Run Code Online (Sandbox Code Playgroud)

该文件具有以下权限:

-rwx------
Run Code Online (Sandbox Code Playgroud)

我想为我的群组和其他人设置相同的权限.

-rwxrwxrwx
Run Code Online (Sandbox Code Playgroud)

我试过了:

import shlex
command=shlex.split("chmod 777 r'H:\path_to_file\file.txt'") 
subprocess.call(command)
Run Code Online (Sandbox Code Playgroud)

没有成功.

工作的是:

command=shlex.split("touch r'H:\path_to_file\file.txt'")
Run Code Online (Sandbox Code Playgroud)

要么

command=shlex.split("rm r'H:\path_to_file\file.txt'")
Run Code Online (Sandbox Code Playgroud)

为什么不能使用chmod命令?

在UNIX下我可以chmod这个文件,我和Windows中的用户一样.

我也尝试过os.chmod方法.但没有成功.

import os, …
Run Code Online (Sandbox Code Playgroud)

python file-permissions chmod shlex

11
推荐指数
2
解决办法
1082
查看次数

Python shlex.split(),忽略单引号

在Python中,我如何使用shlex.split()或类似于拆分字符串,只保留双引号?例如,如果输入"hello, world" is what 'i say'则是输出["hello, world", "is", "what", "'i", "say'"].

python quotes split shlex

10
推荐指数
2
解决办法
2万
查看次数

如何将字符串拆分为标记?

如果我有一个字符串

'x+13.5*10x-4e1'
Run Code Online (Sandbox Code Playgroud)

如何将其拆分为以下令牌列表?

['x', '+', '13', '.', '5', '*', '10', 'x', '-', '4', 'e', '1']
Run Code Online (Sandbox Code Playgroud)

目前我正在使用shlex模块:

str = 'x+13.5*10x-4e1'
lexer = shlex.shlex(str)
tokenList = []
for token in lexer:
    tokenList.append(str(token))
return tokenList
Run Code Online (Sandbox Code Playgroud)

但这回归:

['x', '+', '13', '.', '5', '*', '10x', '-', '4e1']
Run Code Online (Sandbox Code Playgroud)

所以我试图从数字中分割字母.我正在考虑使用包含字母和数字的字符串然后以某种方式拆分它们,但不确定如何执行此操作或如何将它们全部添加回列表中以及之后的其他字符串.令牌保持有序是很重要的,我不能拥有嵌套列表.

在理想的世界中,e和E不会以相同的方式被识别为字母,因此

'-4e1'
Run Code Online (Sandbox Code Playgroud)

会成为

['-', '4e1']
Run Code Online (Sandbox Code Playgroud)

'-4x1'
Run Code Online (Sandbox Code Playgroud)

会成为

['-', '4', 'x', '1']
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

python equation token tokenize shlex

10
推荐指数
1
解决办法
2万
查看次数

用python从txt中删除空格

我有一个.txt文件(从网站上格式化为预先格式化的文本),其中数据如下所示:

B, NICKOLAS                       CT144531X       D1026    JUDGE ANNIE WHITE JOHNSON  
ANDREWS VS BALL                   JA-15-0050      D0015    JUDGE EDWARD A ROBERTS        
Run Code Online (Sandbox Code Playgroud)

我想删除列之间的所有额外空格(它们实际上是不同数量的空格,而不是制表符).我还想用一些分隔符替换它(tab或pipe,因为数据中有逗号),如下所示:

ANDREWS VS BALL|JA-15-0050|D0015|JUDGE EDWARD A ROBERTS
Run Code Online (Sandbox Code Playgroud)

环顾四周,发现最好的选择是使用正则表达式或shlex来分割.两个类似的场景:

python regex whitespace python-2.7 shlex

10
推荐指数
3
解决办法
4086
查看次数

解析此脚本语言的最有效方法

我正在为一个长期过时的文本编辑器的脚本语言实现一个解释器,而我在让词法分析器正常工作方面遇到了一些麻烦.

以下是该语言有问题部分的示例:

T
L /LOCATE ME/
C /LOCATE ME/CHANGED ME/ * *
C ;CHANGED ME;CHANGED ME AGAIN; 1 *
Run Code Online (Sandbox Code Playgroud)

/人物似乎引用字符串,也充当分隔符C(CHANGE在)命令sed型语法,但它允许任何字符作为分隔符.

我可能实现了大约一半最常见的命令,parse_tokens(line.split())直到现在才使用.这很快又很脏,但效果出奇的好.

为了避免写我自己的词法分析器,我试过了shlex.

除了CHANGE案例之外,它的效果非常好:

import shlex

def shlex_test(cmd_str):
    lex = shlex.shlex(cmd_str)
    lex.quotes = '/'
    return list(lex)

print(shlex_test('L /spaced string/'))
# OK! gives: ['L', '/spaced string/']

print(shlex_test('C /spaced string/another string/ * *'))
# gives   : ['C', '/spaced string/', 'another', 'string/', '*', '*']
# desired : any format that …
Run Code Online (Sandbox Code Playgroud)

python lexer shlex

7
推荐指数
1
解决办法
484
查看次数

将shlex置于调试模式

我想看看shlex对于我正在尝试构建的东西是否是一个很好的选择,所以我想我会把它放在调试模式下来玩它.只有,shlex的构造函数有这样奇怪的事情:它设置self.debug0然后立即检查它是否为真.

…
self.debug = 0
self.token = ''
self.filestack = deque()
self.source = None
if self.debug:
    print 'shlex: reading from %s, line %d' \
          % (self.instream, self.lineno)
Run Code Online (Sandbox Code Playgroud)

我知道Python有一些强大的元编程功能,但我无法弄清楚它是如何工作的 - 即使我覆盖了构造函数,也没有编程方法来设置值和它的使用.

是否应该有一种方法在if self.debug条件中输出语句(如果是,如何?),它是一个错误,还是有一些我没有考虑的第三种可能性?

python shlex

7
推荐指数
1
解决办法
90
查看次数

重新创建一个python调用

是否可以从调用的程序本身修补python程序的copy-and-pastable调用?它不必是完全相同的调用字符串,但参数应该解析为同一个东西.

请注意' '.join(sys.argv),不幸的是,它不会削减它.我对这种方法的主要问题是它不能正确引用参数.考虑dummy.pyimport sys; print(sys.argv); print(' '.join(sys.argv))

运行python dummy.py "1 2"打印:

['dummy.py', '1 2']
dummy.py 1 2
Run Code Online (Sandbox Code Playgroud)

当然,如果我们复制后者,我们将获得不同的调用.用引号括起每个参数也不起作用.考虑dummy2.py:

import sys
print(sys.argv)
print(' '.join('"{}"'.format(s) for s in sys.argv))
Run Code Online (Sandbox Code Playgroud)

这将打破:

python dummy2.py ' " breaking " '
Run Code Online (Sandbox Code Playgroud)

python shell escaping shlex

7
推荐指数
1
解决办法
143
查看次数