【问题标题】:read from file line by line , multiple match in file possible逐行读取文件,文件中可能有多个匹配
【发布时间】:2018-10-18 09:20:50
【问题描述】:

我正在读取文件并尝试生成以下内容:

  1. 搜索文件找到“温度”,其中“温度”可以在文件中出现多次
  2. 组织数据:生成 4 个列表:

    • 第一个列表:list_planes_r(飞机名称):[plane_r_01,plane_r_02,plane_r_03,plane_r_04]
    • 第二个列表:temp_plane_r(温度值):[54, 50, 52, 10]
    • 第三个列表:list_planes_f: [plane_f_01, plane_f_02, plane_f_03, plane_f_04]
    • 第 4 个列表:temp_plane_f: [1254, 1354, 1454, 1554]

我总是遇到必须拆分列表的问题,这当然是不允许的。

我做了如下:

with open ('test_reading_file.txt', 'r') as f:
   lines = f.readlines()
list_lines = []
for index, line in enumerate(lines):
 if   ('  temperature') in line:
        list_lines.append(lines[index+1: index+5]

我的玩具文件'test_reading_file.txt'

  temperature
-------
 plane_r_01          54
 plane_r_02          50
 plane_r_03          52
 plane_r_04          10


  co
-------
 plane_r_01          54
 plane_r_02          54
 plane_r_03          54
 plane_r_04          54

  temperature
-------
 plane_f_01          1254
 plane_f_02          1354
 plane_f_03          1454
 plane_f_04          1454

更新:图片

【问题讨论】:

  • 您能否向我们展示您的代码输出以更好地了解您需要做什么?
  • 我已经展示了代码的输出。第二张图片有点显示所需的输出(有所需的列表,我可以用 pandas 做到这一点)
  • 为什么拆分列表又不理想了?
  • 我认为 python 列表不是“可拆分的”。我现在的问题是如何以“plane_r_01”,54 而不是 [“plane_r_01”,54] 结束。我不知道如何实现这一点。

标签: python file readlines


【解决方案1】:

这是较短的版本:

list_planes = []
list_temperatures = []
[list_planes.append([sub.split()[0] for sub in content]) for content in list_lines]
[list_temperatures.append([sub.split()[1] for sub in content]) for content in list_lines]

list_planes_r, list_planes_f = list_planes
temp_plane_r, temp_plane_f = list_temperatures

【讨论】:

  • 这是在你完成之后可能有更简单的方法,但这是可行的。
  • 谢谢,它如我所愿。我已经接受了你的回答,所以只有你有额外的时间:你提到这整个事情可以用更简单的方式完成。你能给我一些提示吗:我这样做是因为我不知道更好。
  • 它只是将几行循环减少到一行,复杂性方面它会保持不变。
  • @Silvia 发布了更短更整洁的版本^
【解决方案2】:

我还没有完全清楚你想要什么,但我最好的猜测是你想要两个列表(比如planestemperatures)这样你就可以做到

for plane, temperature in zip(planes, temperatures):
    ...

我根据这个猜测产生的代码是

planes, temperatures = [], []
with open('...') as f:

    for line in f:
        if line.strip() == 'temperatures':
            next(f)  # skip a line
            for n in range(4):
                p, t = next(f).strip().split()
                planes.append(p)
                temperatures.append(t)

我已经检查了结果。

代码有效,因为文件对象(此处为f)是一个迭代器,我们可以在迭代器内部前进,使用内置的next 使用迭代器。

当您找到关键字时扫描文件并读取一些行的用例是使用next 的典型示例;不使用next 意味着在您进入/退出有趣 区域时使用标志并升起/清除它...

【讨论】:

  • 感谢您的贡献。它更紧凑+优雅,我已经检查过,几乎没有修改我也可以得到我想要的。
猜你喜欢
  • 2011-12-04
  • 2019-05-07
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多