将CSV读入列表时获取以下行

时间:2017-06-09 14:44:59

标签: python csv

我正在尝试从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']

问题是,这会将第二行读入自己的列表中。 我想这是一个简单的解决方法,我只是不知道从哪里开始。有什么想法吗?

3 个答案:

答案 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)]