我正在尝试从python格式的制表符分隔文件中读取格式如下:
Things Some things here spanning multiple lines
but continues on to this line as well
next_item 123456789
我使用以下代码将文件作为列表列表读取:
with open('file.txt', 'rb') as f:
data = list(list(rec) for rec in csv.reader(f, delimiter = '\t'))
目标是创建一个像这样的列表列表:
[['Things', 'Some things here spanning multiple lines but continues on to this line as well'], ['next_item', '123456789']
问题是,这会将第二行读入自己的列表中。 我想这是一个简单的解决方法,我只是不知道从哪里开始。有什么想法吗?
答案 0 :(得分:0)
您可以使用regex
执行此操作。实际上,您正在查找有换行符的实例,然后是没有制表符的行,紧接着是换行符。使用re.sub
我们可以用空格替换第一个换行符 - 将文本合并到上一行。如果我们然后使用re.split
将其拆分以获取各种换行符,我们可以将其反馈到csv.reader
:
import re
import csv
with open('file.txt', 'rb') as f:
data = f.read()
normalised_data = re.sub(r'[\n\r]+([^\t\n\r]+)([\n\r]+)', r' \g<1>\g<2>', data)
output_list = list(rec for rec in csv.reader(re.split(r'[\n\r]+', normalised_data), delimiter='\t'))
print output_list
返回:
[['Things', 'Some things here spanning multiple lines but continues on to this line as well'], ['next_item', '123456789']]
根据需要。
答案 1 :(得分:0)
一种方法是使用next()
来读取行并合并不包含分隔符的行(在本例中为'\t'
)。
这个post可以为你提供进一步实施的指示
答案 2 :(得分:0)
诀窍是首先按\t
分割,然后按\n
分割。这样我们得到一个有点奇怪的列表,内部列表末尾的键,键和值索引关闭一个。拆分的多行数据保存在列表中,可以使用换行或空白重新加入。
with open('file.txt', 'rb') as f:
data = f.read()
odd = [x.split('\n') for x in data.split('\t')]
keys = [x[-1] for x in odd[:-1]]
vals = [x[:-1] for x in odd[1:-1]] + [odd[-1]]
lol = [[k,v] for k,v in zip(keys,[' '.join(x)for x in vals])]
编辑:
如果您愿意使用正则表达式,您有机会在下一条记录之前预先停止比赛。
with open('file.txt', 'rb') as f:
data = f.read()
rec = r'(^|(?<=\n))[^\n\t]+\t[^\t]+(?=$|\n[^\n\t]+\t)'
lol = [x.group().split('\t') for x in re.finditer(rec,data)]
或者,如果您希望用空格替换换行符
lol = [x.group().replace('\n',' ').split('\t') for x in re.finditer(rec,data)]