在 python 中从不同列表中的文件拆分不同的数据(用空行分隔)

Split different data (separated by a blank line) from a file in different lists in python

提问人:Gallo 提问时间:11/15/2023 最后编辑:Gallo 更新时间:11/16/2023 访问量:60

问:

Python 新手在这里,我有一个文件,其中包含不同的物理实验,用空行分隔,如下所示:

#t x
0 0
0 1
0 2

0 1
0 2
0 3

我想知道是否有一种简单的方法可以根据列和实验(列表 T1 表示第一次实验的时间等)将我的数据拆分为多个列表,以便我可以分别绘制不同的实验。

我尝试使用 numpy.loadtxtpandas.read_csv,但他们只是跳过空行并合并所有数据。我搜索了类似 c fscanf 函数的东西,该函数停在空行处,但我找不到简单的方法。

python pandas numpy 文件 拆分

评论

0赞 hpaulj 11/15/2023
您可以在 Python 中像在 c 中一样轻松地逐行读取文本文件。您要求一个旨在读取格式良好的 csv 文件的程序来读取其他内容。
0赞 hpaulj 11/16/2023
使用 ,可以提供行列表而不是文件名。因此,您可以读取文件,并将行组传递给调用,每次都返回一个数组。loadtxtloadtxt

答:

0赞 mozway 11/15/2023 #1

读取数据时没有直接的拆分方法,但是可以读取整个文件并利用空行拆分数据帧:

df = pd.read_csv('your_file.csv', sep=r'\s+', skip_blank_lines=False)

m = df.isna().all(axis=1)

dfs = [g for _,g in df[~m].groupby(m.cumsum())]

print(dfs)

输出:

[    #t    x    # DataFrame #1
 0  0.0  0.0
 1  0.0  1.0
 2  0.0  2.0,
     #t    x    # DataFrame #2
 4  0.0  1.0
 5  0.0  2.0
 6  0.0  3.0]
0赞 DDade 11/15/2023 #2

# Read file
with open('filename.txt', 'r') as f:
    raw_data = f.read()

# Seperate each experiment
experiments = raw_data.split('\n\n')

# Split lines
experiments = [lines.split('\n') for lines in experiments]

# Create empty list for all.
all_data = []

for experiment in experiments:
    # Create empty list for each experiment.
    data = {'t':[], 'x':[]}
    for line in experiment:

        # if the first character of line is not a number, ignore ( for #t, x )
        if (not line[0].isdigit()): continue
        
        # split and convert data into int
        t, x = map(int,line.split(' '))

        # append it
        data['t'].append(t)
        data['x'].append(x)

    # append it
    all_data.append(data)

评论

0赞 Community 11/16/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。