我是一名蟒蛇学习者。如果我在文件中有一行文字看起来像这样
“Y:\ DATA \ 00001 \ SERVER \ DATA.TXT”“V:\ DATA2 \ 00002 \ SERVER2 \ DATA2.TXT”
我可以将引号分开吗?唯一的常量是它们在文件中相对于数据行本身的位置。数据行的范围可以是10到100多个字符(它们是嵌套的网络文件夹)。我无法看到我如何使用任何其他方式来分割这些标记,但是我缺乏python知识使得这很困难。 我试过了
optfile=line.split("")
和其他变化,但继续获得valueerror:空的分隔符。我明白为什么会说,我只是不知道如何改变它。任何帮助,一如既往地非常感激。
非常感谢
答案 0 :(得分:8)
您必须逃避"
:
input.split("\"")
结果
['\n',
'Y:\\DATA\x0001\\SERVER\\DATA.TXT',
' ',
'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT',
'\n']
删除生成的空行:
[line for line in [line.strip() for line in input.split("\"")] if line]
结果
['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
答案 1 :(得分:5)
我只想补充一点,如果你处理看起来像命令行参数的行,那么你可以利用shlex module:
import shlex
with open('somefile') as fin:
for line in fin:
print shlex.split(line)
会给:
['Y:\\DATA\\00001\\SERVER\\DATA.TXT', 'V:\\DATA2\\00002\\SERVER2\\DATA2.TXT']
答案 2 :(得分:5)
没有正则表达式,没有拆分,只需使用csv.reader
import csv
sample_line = '10.0.0.1 foo "24/Sep/2015:01:08:16 +0800" www.google.com "GET /" -'
def main():
for l in csv.reader([sample_line], delimiter=' ', quotechar='"'):
print l
输出
['10.0.0.1', 'foo', '24/Sep/2015:01:08:16 +0800', 'www.google.com', 'GET /', '-']
答案 3 :(得分:3)
查找所有正则表达式匹配将执行此操作:
input=r'"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
re.findall('".+?"', # or '"[^"]+"', input)
这将返回文件名列表:
["Y:\DATA\00001\SERVER\DATA.TXT", "V:\DATA2\00002\SERVER2\DATA2.TXT"]
要获取不带引号的文件名,请使用:
[f[1:-1] for f in re.findall('".+?"', input)]
或使用re.finditer
:
[f.group(1) for f in re.finditer('"(.+?)"', input)]
答案 4 :(得分:1)
shlex
模块可以帮助您。
import shlex
my_string = '"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
shlex.split(my_string)
这将吐出
['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
答案 5 :(得分:0)
我认为你想要的是提取由空格分隔的文件路径。那就是你要分割关于引用中包含的项目。我有一条线
"FILE PATH" "FILE PATH 2"
你想要
["FILE PATH","FILE PATH 2"]
在哪种情况下:
import re
with open('file.txt') as f:
for line in f:
print(re.split(r'(?<=")\s(?=")',line))
使用file.txt
:
"Y:\DATA\00001\SERVER\DATA MINER.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"
输出:
>>>
['"Y:\\DATA\\00001\\SERVER\\DATA MINER.TXT"', '"V:\\DATA2\\00002\\SERVER2\\DATA2.TXT"']
答案 6 :(得分:0)
这是我的解决方案。它解析大多数合理的输入,就像它直接传递到命令行一样。
import re
def simpleParse(input_):
def reduce_(quotes):
return '' if quotes.group(0) == '"' else '"'
rex = r'("[^"]*"(?:\s|$)|[^\s]+)'
return [re.sub(r'"{1,2}',reduce_,z.strip()) for z in re.findall(rex,input_)]
使用案例:将一堆单击脚本收集到实用程序启动器中,而无需重做命令输入。
编辑: 获得OCD关于命令行处理糟糕引用的愚蠢方式并写下如下:
import re
tokens = list()
reading = False
qc = 0
lq = 0
begin = 0
for z in range(len(trial)):
char = trial[z]
if re.match(r'[^\s]', char):
if not reading:
reading = True
begin = z
if re.match(r'"', char):
begin = z
qc = 1
else:
begin = z - 1
qc = 0
lc = begin
else:
if re.match(r'"', char):
qc = qc + 1
lq = z
elif reading and qc % 2 == 0:
reading = False
if lq == z - 1:
tokens.append(trial[begin + 1: z - 1])
else:
tokens.append(trial[begin + 1: z])
if reading:
tokens.append(trial[begin + 1: len(trial) ])
tokens = [re.sub(r'"{1,2}',lambda y:'' if y.group(0) == '"' else '"', z) for z in tokens]
答案 7 :(得分:0)
我知道这在一百万年前得到了解答,但这也有效:
input = '"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
input = input.replace('" "','"').split('"')[1:-1]
应将其输出为包含以下内容的列表:
['Y:\\DATA\x0001\\SERVER\\DATA.TXT', 'V:\\DATA2\x0002\\SERVER2\\DATA2.TXT']
答案 8 :(得分:-1)
我的问题Python - Error Caused by Space in argv Arument被标记为此问题的副本。我们有许多Python书籍回到Python 2.3。最老的引用是使用argv的列表,但没有示例,所以我把事情改为: -
repoCmd = ['Purchaser.py', 'task', repoTask, LastDataPath]
SWCore.main(repoCmd)
并在SWCore中: -
sys.argv = args
shlex模块有效,但我更喜欢这个。