Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用自定义分隔符读取文件_Python_Python 3.x - Fatal编程技术网

Python 使用自定义分隔符读取文件

Python 使用自定义分隔符读取文件,python,python-3.x,Python,Python 3.x,我正试图解析一个文件,其中包含一些自定义输入,行与行之间带有分隔符。是否有一种有效的方法来解析文件 输入: ABCD XYZ % Hello World %% XXX YYY ZZZ 预期产出: ['ABCDXYZ'、'HelloWorld'、'xxxyyzzz'] op = [] with open('random_input','r') as fh: for line in fh: if lin

我正试图解析一个文件,其中包含一些自定义输入,行与行之间带有分隔符。是否有一种有效的方法来解析文件

输入:

    ABCD
    XYZ
    %
    Hello
    World
    %%
    XXX
    YYY
    ZZZ
预期产出:
['ABCDXYZ'、'HelloWorld'、'xxxyyzzz']

op = []
with open('random_input','r') as fh:
    for line in fh:
        if line.rstrip()!='%':
            op.append(line.rstrip())
            
print(op)
我的代码只给我提供了所有单词的列表:
['ABC'、'XYZ'、'Hello'、'World'、'XXX'、'YYY'、'ZZZ']
代码:

有没有办法获得预期的输出:
['ABCDXYZ'、'HelloWorld'、'xxxyyzzz']

op = []
with open('random_input','r') as fh:
    for line in fh:
        if line.rstrip()!='%':
            op.append(line.rstrip())
            
print(op)

尝试以下方法

在将字符串存储到列表中之前将其组合起来:

op = []
string = '' # to store the string
with open('random_input','r') as fh:
    for line in fh:
        if line.rstrip().startswith('%'):
            op.append(string)
            string = ''
            continue
        else:
            string = string + line.rstrip()
            
print(op)

首先,您需要在一个或多个
%
字符上拆分输入,然后从每个部分删除空白:

import re

text = """ABCD
    XYZ
    %
    Hello
    World
    %%
    XXX
    YYY
    ZZZ"""

parts = [re.sub(r'\s+', '', part) for part in re.split(r'%+', text)]
print(parts)
印刷品:

['ABCDXYZ', 'HelloWorld', 'XXXYYYZZZ']
因此,首先将整个文件读入变量
text
,并按上述方法处理

如果绝对需要确保
%
字符单独在一行上,则使用:

parts = [re.sub(r'\s+', '', part) for part in re.split(r'^\s*%+\s*$', text, flags=re.M)]
请注意,上述内容删除了所有空白,包括一行中单词之间可能存在的空白,因为从发布问题的方式来看,输入中似乎有前导空白。如果您的目的只是连接行,请使用以下命令:

parts = [part.replace('\n', '') for part in re.split(r'(?:^\s*%+\s*\n)+', text, flags=re.M)]

如果一行中存在
%
,是否应丢弃整行?当两个连续的行中有分隔符时,会发生什么情况?如果文件很小,
fh.read().replace('\n','').split('%')
应该足够大,因为一行可以包含多个“%”符号,所以这不会很好地工作。您应该在rstrip()之后使用startswith(“%”),因为一行可以包含多个“%”符号,所以这不会很好地工作。在rstrip()伟大的建议之后,您应该使用startswith(“%”),fixedthank这一方法有效并获得了预期的输出。当我处理一个文件时,如何获得列表中每个单词的起始字母的偏移量。示例:{1:'ABCDXYZ',10:'HelloWorld'}。字符串第一个字母的偏移量和字符串本身的Hashmap。我尝试了上面提到的所有3种方法,我得到的是空字符串是输出列表,这不是所需的输出。因此,您需要1。明确您是希望删除某个节中的所有空白,还是只希望将每个节和2的行连接起来。您需要显示实际输入的样子,结果是一个空字符串和3。我上面提供的3个选项中,哪一个会让你感到悲伤。我不认为使用前两个选项中的任何一个都会得到空字符串。如果在连续的行上有
%%
,则会得到空字符串。是这样吗?我已经更新了最后一个选项,以防您的连续行带有
%
%
,这将导致空字符串。在结果列表中。