在Python中,逐行解析文本文件并使元组每隔n个分隔符

在Python中,逐行解析文本文件并使元组每隔n个分隔符,python,string,python-3.x,python-2.7,file-processing,Python,String,Python 3.x,Python 2.7,File Processing,我有一个文本文件。我想逐行读取文件,用分隔符拆分,并每隔n分隔符生成元组。例如: "A-B-C-D E-F-G Thank You! For Helping Stranger-seeker " 上述行的输出如下所示: (A,B,C,D) (E,F,G\n\nThank You!\n\nFor Helping\n\nStranger,seeker) 如果您能帮助我使用Python解决方案,我将不胜感激。在itertools中有一个grouper的配方。您可以使用它将列表分组为固定长

我有一个文本文件。我想逐行读取文件,用分隔符拆分,并每隔
n
分隔符生成元组。例如:

"A-B-C-D 

E-F-G

Thank You!

For Helping

Stranger-seeker "
上述行的输出如下所示:

(A,B,C,D)

(E,F,G\n\nThank You!\n\nFor Helping\n\nStranger,seeker)

如果您能帮助我使用Python解决方案,我将不胜感激。

在itertools中有一个
grouper
的配方。您可以使用它将列表分组为固定长度的列表

>>> from itertools import zip_longest
>>> def grouper(iterable, n, fillvalue=None):
...     "Collect data into fixed-length chunks or blocks"
...     # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
...     args = [iter(iterable)] * n
...     return zip_longest(*args, fillvalue=fillvalue)
... 
>>> data = open('tmp.txt').read().split('-')
>>> list(grouper(data, 4))
[('A', 'B', 'C', 'D\nE'), ('F', 'G\nThank You!\nFor Helping\nStranger', 'seeker\n', None)]

您可以拆分输入字符串,然后对列表的滚动部分使用列表理解:

s = '''A-B-C-D

E-F-G

Thank You!

For Helping

Stranger-seeker'''
l = s.split('-')
print([l[i:i+3] for i in range(0, len(l), 3)])
这将产生:

[['A', 'B', 'C'], ['D\n\nE', 'F', 'G\n\nThank You!\n\nFor Helping\n\nStranger'], ['seeker']]

我的解决方案是一次读取整个文件。请帮我改进一下

以fp形式打开(文件名):


打印(rem_值)

不应该是单个元素吗?对不起!在这种情况下,n应该是3。到目前为止,您尝试了什么?我通过一次读取整个文件成功地获得了它。我想一行一行地读。谢谢你的努力。在元组中的4个字段之后,新行表示另一条记录。我还试图一次读取每一行的文件。”“D\nE”是第二条记录的一部分。
list(grouper(data,3))
会将元素分为几块或三块。因此,您将得到
[('A','B','C'),('D\nE','F','G\n谢谢你!\n帮助管理员',('seeker\n',无,无)]
 data = fp.read()
 my_values = data.split('-')
 my_data = []
 count = 0
 rem_values = []
 delimiter_count =  len(my_values) - 1
 for x in range(len(my_values)):
     count += 1
     if count == 4:
         split_val = my_values[x].split("\n")
         if len(split_val) == 2:
             count = 1
             my_data.append(split_val[0] )
             rem_values.append(my_data ) 
             my_data = [ split_val[1] ]
        else:
             count = 1
             my_data.append(split_val[0] )
             rem_values.append(my_data ) 
    else:
        my_data.append( my_values[x] )