python 导入txt文件,数据由列和空行分隔

ttp71kqs  于 2023-10-14  发布在  Python
关注(0)|答案(3)|浏览(112)

我有一个txt文件,其中包含3列浮点数,需要导入,但需要用列和空行分隔。
例如,txt文件数据如下所示:

1.0    1.1    1.2
1.3    1.4    1.5

2.0    2.1    2.2
2.3    2.4    2.5

我需要的数据导入到Python一样

column 1-1: 1.0, 1.3
column 2-1: 1.1, 1.4
column 3-1: 1.2, 1.5

column 1-2: 2.0, 2.3
column 2-2: 2.1, 2.4
column 3-2: 2.2, 2.5

我能够导入txt文件并使用a,b,c = np.loadtxt('file.txt', dtype=float, unpack=True)按列分隔,但这种方法不读取空行,我不能进一步用空行分隔数据。

mpgws1up

mpgws1up1#

为什么不自己做个算法呢在我看来,以某种方式配置numpy或为其获取模块要容易得多。我不得不花5分钟来思考和做一个算法

def parse_file(file_data):
    all_numbers = []
    current_number = ""
    current_number_group: list[float] = []
    for letter in file_data:
        if letter == "\n":
            all_numbers.append(current_number_group)
            current_number_group = []
        elif letter == " " and current_number != "":
            current_number_group.append(float(current_number))
            current_number = ""
        elif letter != " ":
            current_number += letter
    
    if current_number != "":
        current_number_group.append(float(current_number))
    return all_numbers

这个算法不使用numpy(我使用的是在线解释器rn,所以我不能安装包),而且它也很慢,所以你自己做一个版本会更好。

flvlnr44

flvlnr442#

您可以尝试:

import pandas as pd

text = """\
1.0    1.1    1.2
1.3    1.4    1.5

2.0    2.1    2.2
2.3    2.4    2.5"""

all_data = []
for group in map(str.strip, text.split("\n\n")):
    all_data.append(list(zip(*[line.split() for line in group.splitlines()])))

df = pd.DataFrame(all_data, columns=["Col1", "Col2", "Col3"])
print(df)

图纸:

Col1        Col2        Col3
0  (1.0, 1.3)  (1.1, 1.4)  (1.2, 1.5)
1  (2.0, 2.3)  (2.1, 2.4)  (2.2, 2.5)
7qhs6swi

7qhs6swi3#

如果你想的话,你可以用stdlib本身来做:

from itertools import groupby

text = """\
1.0    1.1    1.2
1.3    1.4    1.5

2.0    2.1    2.2
2.3    2.4    2.5"""

result: list[list[tuple[float, ...]]] = []

for k, grouped_lines in groupby(text.splitlines(), key=lambda x: bool(x.strip())):
    if k:
        floatted_grouped_lines = (map(float, line.split()) for line in grouped_lines)
        result.append(list(zip(*floatted_grouped_lines)))

for i, row in enumerate(result, start=1):
    print(f"row{i}: {row}")

产出:

row1: [(1.0, 1.3), (1.1, 1.4), (1.2, 1.5)]
row2: [(2.0, 2.3), (2.1, 2.4), (2.2, 2.5)]

我使用groupby对空行之间的行进行分组。然后,对于组中的每一行,我将它们转换为浮点数列表而不是字符串。现在转换:

[1.0, 1.1, 1.2], [1.3, 1.4, 1.5]

(1.0, 1.3) (1.1, 1.4) (1.2, 1.5)

你需要zip()他们。

相关问题