根据 .dat 文件中的相似文本将行类别分组到列表中
Posted
技术标签:
【中文标题】根据 .dat 文件中的相似文本将行类别分组到列表中【英文标题】:Group line categories based on similar text from .dat file into a list 【发布时间】:2022-01-23 00:25:04 【问题描述】:我对使用 CSV 完全陌生。我已经逐行看到了答案,但我发现没有阅读成组的行。我有一个 csv 文件,其中包含例如以下数据格式,其中第一行包含开始、月份和日期。从第二行开始,我只有最后两列的数据,比如 A 和 B。
starting 6 3
34.75 15
34.75 15.25
32.5 14.2
starting 7 27
12.75 14.75
13 15
starting 7 28
29 33
29 33.25
我想要做的是从每个 starting 下方检索数据,并将它们分别写为 3 个数组的列表,每个数组有 2 列。这样做的目的是能够独立地绘制 starting 的每个数组。
这是我经过多次搜索后设法编写的代码,请帮助纠正我遗漏的地方。
import numpy as np
#input file
f=open('./latlon.dat','r')
lines = f.readlines() # Read file and close
f.close()
i = 0
tr = []
while (i < (len(lines)-1) ):
line = lines[i]
i = i+1
linesplit = line.strip().split('\t')
if linesplit[0] == 'start' :
latlog = int(linesplit[1])
latlogarray = np.genfromtxt(lines[i:(i+latlog)])
for k in range (i-1,i+latlog):
i = i+latlogarray
tr.append(k)
print(tr)
谢谢你的期待。
【问题讨论】:
【参考方案1】:您可以使用 Python 的 CSV 模块完成此操作。
阅读您的问题,您有一个组,由starting
分隔。该组的数据在该行之后开始。最后,您需要所有组。
如果是这样,那么您想逐行阅读,当您阅读第一列中带有starting
的行时,保存最后一个组(如果存在)并开始一个新组:
#!/usr/bin/env python3
import csv
import pprint
groups = []
group = None
with open('latlon.dat', newline='') as f:
reader = csv.reader(f, delimiter='\t')
for row in reader:
# Normalize all cells at once
row = [cell.strip() for cell in row]
# Deal with "blank" lines
if len(row) == 0 or len(row) == 1:
continue
# Starting new group...
if row[0] == 'starting':
# Save last group, if it exists
if group:
groups.append(group)
# Reset group
group = []
# Don't do anything else with this row
continue
# A "data row"
group.append([float(row[1]), float(row[2])])
groups.append(group)
pprint.pprint(groups)
当我对你的样本运行它时,我得到:
[
[[34.75, 15.0], [34.75, 15.25], [32.5, 14.2]],
[[12.75, 14.75], [13.0, 15.0]],
[[29.0, 33.0], [29.0, 33.25]]
]
【讨论】:
嗯,有几件事。我刚刚更新了您的示例,在它周围添加了一个代码围栏......当我复制粘贴该代码围栏中的所有内容作为 latlon.dat 使用时,它会运行并为我提供该输出。所以,请做同样的事情——按原样使用帖子中的示例,并将其作为输入来测试我的代码。 另外,您的实际数据中有多少组?我想它比你的样本中的三个多。 您的回答正是我所期望的。在某些情况下,我有大约 8 个组,在其他情况下甚至更多。我本可以在这里共享文件,但我不知道该怎么做。我是 *** 的新手。你能指导我,然后我可以分享文件吗? 那么,当您针对帖子中的示例运行我的代码时,它可以工作吗?如果是这样,那么您的真实数据中的某些内容未在您的示例中显示。您需要找到真实数据中的问题所在。要么手动修复它,要么调整代码处理这种新情况。无论哪种方式,听起来我的代码都适用于您发布的示例。请接受和/或支持我的贡献。 当然!今天是我第一次尝试 ***。干杯!【参考方案2】:在这种情况下使用 pandas 可能会更容易:
import pandas as pd
df = pd.read_csv('./latlon.dat', sep = ' ') # sep is whatever delimiter you want
df.plot() # will plot the three variables together
【讨论】:
以上是关于根据 .dat 文件中的相似文本将行类别分组到列表中的主要内容,如果未能解决你的问题,请参考以下文章