Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Parsing_Data Processing - Fatal编程技术网

在python中解析文件并存储其值时跳过多行

在python中解析文件并存储其值时跳过多行,python,string,parsing,data-processing,Python,String,Parsing,Data Processing,我为这个令人困惑的标题道歉。我对Python非常陌生,下面是我试图实现的目标: 我正在解析一个文件file.txt,其中包含如下数据(以及其他内容): file.txt: ... a = ( 1 2 3 ) ... 我需要将此类数据存储在两个部分中: name=“a” 值={(“,“1”,“2”,“3)”} ^每一行都是列表的一个元素 我正在逐行解析文件,如下面的代码段所示,我无法更改它。我不知道如何通过向前看几行来存储数据,存储它们的值,然后跳过它们,这样它们就不会被处理两次当循环位于第一行

我为这个令人困惑的标题道歉。我对Python非常陌生,下面是我试图实现的目标:

我正在解析一个文件file.txt,其中包含如下数据(以及其他内容):

file.txt:

...
a = (
1
2
3 )
...
我需要将此类数据存储在两个部分中:

name=“a”

值={(“,“1”,“2”,“3)”}
^每一行都是列表的一个元素

我正在逐行解析文件,如下面的代码段所示,我无法更改它。我不知道如何通过向前看几行来存储数据,存储它们的值,然后跳过它们,这样它们就不会被处理两次当循环位于第一行“a=”

with open(file.txt) as fp:
    for line in fp:
        ...

感谢您的帮助。

因此,您可以逐行解析文件。每当在一行中找到等号“=”时,就意味着“=”前面的字符就是您想要的名称值。然后下一行是列表的第一个元素,之后的一行是第二个元素,等等。。。当一行包含char“)”时,表示它是列表的最后一个值。 . 试着理解这个概念,编码应该不难

[u'a']
['(', '1', '2', '3', ')']
这是你需要的吗

然后,您可以按照以下代码行操作:

import nltk

name = []
value = []
with open("file.txt") as fp:
    for line in fp:
        words = line.split()
        if ('(') in words:
            name.append(words[0].decode('utf-8'))
            value.append('(')
        else:
            for entry in words:
                value.append(entry)

print (name)
print (value)

fp.close()

我建议使用字典:

txt=open(r"file.txt","r").readlines()
dictionary=dict()
for i in range(len(txt)):
    if "=" in txt[i]:
        name,values=txt[i].split()[0],[txt[i].split()[-1]]
        dictionary[name],i={"name":name},i+1
        while True:
            values.append(txt[i])
            if ")" in txt[i]:
                break
            i=i+1
        values=[value.replace("\n","") for value in values]
        dictionary[name].update({"values":values})
        i=i-1
    i=i+1

>>dictionary["a"]
Out[40]: {'name': 'a', 'values': ['(', '1', '2', '3 )']}
>>dictionary["b"]
Out[45]: {'name': 'b', 'values': ['(', '3', '4', '6 )']}

如果文件不太大,请将整个文件读入内存,然后使用while循环执行更细粒度的控制:

# python3
with open("file.txt") as f:
    lines = f.readlines()
    index = 0
    while True:
        # do something here
否则,如果只有最后一个值包含“'),请执行以下操作:

with open('file.txt') as f:
    pairs = []
    for line in f:
        values = []
        name, value = line.strip().split('=')
        name = name.strip()
        values.append(value.strip())
        while True:
            line = next(f)
            values.append(line.strip())
            if ')' in line:
                break
        pairs.append((name, values))