9

我是一名python学习者。如果我在一个看起来像这样的文件中有一行文本

"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"

我可以拆分引号周围的行吗?唯一不变的是它们在文件中相对于数据线本身的位置。数据行的范围可以从 10 到 100+ 个字符(它们将是嵌套的网络文件夹)。我看不出如何使用任何其他方式来分割这些标记,但我缺乏 python 知识使得这变得困难。我试过了

optfile=line.split("")

和其他变体,但不断收到 valueerror: empty 分隔符。我明白为什么会这样说,我只是不知道如何改变它。一如既往地非常感谢任何帮助。

非常感谢

4

10 回答 10

12

你必须逃避"

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']
于 2013-05-17T07:09:47.110 回答
10

我只是补充一点,如果您正在处理看起来像是命令行参数的行,那么您可以利用shlex 模块

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']
于 2013-09-09T22:26:31.557 回答
6

没有正则表达式,没有拆分,只需使用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 /', '-']
于 2015-09-25T04:02:01.213 回答
4

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']

参考:https ://docs.python.org/2/library/shlex.html

于 2016-06-18T10:18:59.473 回答
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)]
于 2013-05-17T07:09:33.997 回答
1

以下代码在每次出现反逗号字符 (") 时拆分行,并删除空字符串和仅包含空格的字符串。

[s for s in line.split('"') if s.strip() != '']

无需使用正则表达式、转义字符、某些模块或假定路径之间有一定数量的空白字符。

测试:

line = r'"Y:\DATA\00001\SERVER\DATA.TXT" "V:\DATA2\00002\SERVER2\DATA2.TXT"'
output = [s for s in line.split('"') if s.strip() != '']
print(output)
>>> ['Y:\\DATA\\00001\\SERVER\\DATA.TXT', 'V:\\DATA2\\00002\\SERVER2\\DATA2.TXT']
于 2018-09-14T09:37:42.270 回答
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"']
于 2013-05-17T07:11:31.660 回答
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_)]

用例:将一堆单次脚本收集到实用程序启动器中,而无需重做命令输入。

编辑:得到了关于命令行处理蹩脚引用的愚蠢方式的强迫症,并写了以下内容:

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]
于 2013-09-09T17:59:42.910 回答
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']
于 2016-09-15T10:18:36.880 回答
-1

我的问题 Python - Error Caused by Space in argv Arument被标记为这个问题的副本。我们有很多关于 Python 2.3 的 Python 书籍。最古老的提到使用 argv 列表,但没有示例,所以我将其更改为:-

repoCmd = ['Purchaser.py', 'task', repoTask, LastDataPath]
SWCore.main(repoCmd)

在 SWCore 中:-

sys.argv = args

shlex 模块有效,但我更喜欢这个。

于 2017-09-20T13:59:03.943 回答