我怎样才能扭转结果shlex.split
呢?也就是说,如果给出一个我希望引用的字符串,我怎样才能获得一个"类似于Unix shell"list
的带引号的字符串?
我找到了一个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 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机器上得到完全相同的错误.
这是我的设置:
我有一个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中,我如何使用shlex.split()
或类似于拆分字符串,只保留双引号?例如,如果输入"hello, world" is what 'i say'
则是输出["hello, world", "is", "what", "'i", "say'"]
.
如果我有一个字符串
'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)
有人可以帮忙吗?
我有一个.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来分割.两个类似的场景:
我正在为一个长期过时的文本编辑器的脚本语言实现一个解释器,而我在让词法分析器正常工作方面遇到了一些麻烦.
以下是该语言有问题部分的示例:
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) 我想看看shlex
对于我正在尝试构建的东西是否是一个很好的选择,所以我想我会把它放在调试模式下来玩它.只有,shlex的构造函数有这样奇怪的事情:它设置self.debug
为0
然后立即检查它是否为真.
…
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程序的copy-and-pastable调用?它不必是完全相同的调用字符串,但参数应该解析为同一个东西.
请注意' '.join(sys.argv)
,不幸的是,它不会削减它.我对这种方法的主要问题是它不能正确引用参数.考虑dummy.py
与import 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)