Python 读取空行之间的列

Python 读取空行之间的列,python,Python,假设文件中的数据格式如下: 1 4 5 2 3 4 4 7 1 1 1 1 2 1 2 3 3 3 4 1 4 2 2 2 我总是希望读取空行之间的部分数据,例如,我希望第一个空行和第二个空行之间的列,所以v1=[1,2,3,4],v2=[1,1,3,1]等等。 首先,我通过以下方法找到空行出现的位置的索引: filetmp = open('data.txt') indices = [] for i, line in enumerate(filetmp): tmp = ''.joi

假设文件中的数据格式如下:

1 4 5
2 3 4
4 7 1

1 1 1
2 1 2
3 3 3
4 1 4

2 2 2
我总是希望读取空行之间的部分数据,例如,我希望第一个空行和第二个空行之间的列,所以v1=[1,2,3,4],v2=[1,1,3,1]等等。 首先,我通过以下方法找到空行出现的位置的索引:

filetmp = open('data.txt')
indices = []
for i, line in enumerate(filetmp):
    tmp = ''.join(c for c in line if c.isalnum() or c.isspace())
    print tmp
    if not tmp.strip(): indices.append(i)
现在
索引
确实包含正确的索引,即空行索引。下一部分,是在给定空行索引的情况下读取所需的部分,这样我们就可以填充v1、v2等。我应该先执行
filetmp.readlines()
来完成吗?或者,在处理数据列时,有没有更直接的方法来读取特定部分?

我想如下所示:

with open('data.txt') as f:
    data = f.read()

v = []
# Split the string into blocks, by looking for duplicated line terminaters ('\n\n').
for i, block in enumerate(data.split('\n\n')):
    # Split the blocks in lines by looking for line terminaters ('\n').
    lines = block.split('\n')
    v.append([])
    for line in lines:
        if line == "":
            continue
        v[i] += [line.split(' ')]

# Take the middle block and transpose it.
v1 = map(list, zip(*v[1]))
当然,您只能使用第二个块,而不是遍历所有块

作为一项功能:

def get_block_from_file(file_path, block_number):
    with open(file_path) as f:
        data = f.read()

    blocks = data.split('\n\n')
    try:
        block = blocks[block_number - 1]
    except IndexError:
        print('Not enough blocks')
        import sys; sys.exit(1)
    v = []
    lines = block.split('\n')
    for line in lines:
        if line == "":
            continue
        v += [map(int, line.split(' '))]

    return map(list, zip(*v))

print(get_block_from_file('data.txt', 2))

请试试这个。这是使用熊猫。这是为了适合您当前的数据集。如果有多个空白行(多于2行),则可能必须循环查找l_lower_索引和l_upper_索引

import pandas as pd
import numpy as np

l_df = pd.read_table('expt2data.txt',sep=' ',header=None,names=('Col_1','Col_2','Col_3'), skip_blank_lines=False)

l_lower_index = l_df[l_df['Col_1'].isnull()].index.values[0]
l_upper_index = l_df[l_df['Col_1'].isnull()].index.values[1]
v1 = l_df.ix[l_lower_index + 1:l_upper_index - 1]['Col_1'].values
v2 = l_df.ix[l_lower_index + 1:l_upper_index - 1]['Col_2'].values
print v1
print v2
输出

[ 1.  2.  3.  4.]
[ 1.  1.  3.  1.]
1 4 5
2 3 4
4 7 1

1 1 1
2 1 2
3 3 3
4 1 4

2 2 2
expt2data.txt

[ 1.  2.  3.  4.]
[ 1.  1.  3.  1.]
1 4 5
2 3 4
4 7 1

1 1 1
2 1 2
3 3 3
4 1 4

2 2 2

也许你也可以使用熊猫阅读标签。然后,您只能获取两行之间的数据。只是一个建议。@pmaniyan当然欢迎所有建议,非常感谢。事实上,其他人告诉我要和熊猫一起尝试这些东西,我想是时候开始了。您能展示一下在这种情况下如何使用它吗?(对未来的读者肯定也很有用)你可以先按换行,然后按空格分割,然后再从那里开始。主要缺点是它会首先将整个数据集加载到内存中。感谢您的建议,它看起来很复杂。我现在要试试,看看我是否能很好地理解细节。小心大文件,因为它会先将整个文件读入内存。太棒了!两个小问题:i)是否可以按原样提取数据,而不转换为字符串?e、 现在,如果一列是1,2,0.2。。。提取的值为['1','2','0.2',而不是[1,2,0.2]。ii)每次get_block_from_file返回时,打开的文件将关闭并从内存中清空,对吗?我编辑了代码,它现在返回带有整数的列表。该文件仅在读取数据()时打开。但是内容仍然是在数据和块中。谢谢,整洁!我并不想吹毛求疵,但如果存在浮点数和整数的混合呢?map(…,line.split('')是否有更通用的替代品?非常感谢,我似乎在“skip_blank_lines”的关键字参数中遇到了一个错误。这是否是python 3的偶然情况?我有py 2.7Mine也是python 2.7,Pandas是0.17.1。这段代码对我来说没有任何错误。请共享您的代码和错误跟踪。