【问题标题】:python reading file with different informations according to linepython根据行读取具有不同信息的文件
【发布时间】:2021-09-16 09:13:40
【问题描述】:

我有一个奇怪的文件:

515   30.00398       30.00153
1  4
A B A
A B B
A B C
A B D
2  4
A C A
A C B
A C C
A C D

这是根据“fortran 逻辑”创建的(不幸的是)。 我必须用python阅读它。 对我来说,很难转向 python 逻辑。事实上,我必须阅读第一行并将其存储在一些变量中。第 2 行和第 7 行为我提供了与“字母”相关的其他变量的信息。 我尽量让自己清楚。

我有一个名为“cells”的变量。每个单元格都有编号,在本例中为“1”和“2”。每个单元有 4*3 个元素。在此示例中,单元格“1”具有:

A B A
A B B
A B C
A B D

如何读取所有文件。

我学会了使用:

for line in Lines:
    count += 1
    print("Line{}: {}".format(count, line.strip()))

这似乎适用于所有行都具有相同类型元素的文件。我的档案呢。 如何正确阅读?有什么建议吗?

提前感谢您的任何帮助

【问题讨论】:

  • 1, 4 表示第一个单元格,有 4 行,对吗?总是有3列?总是?你想要的输出是什么?
  • 输出应该是什么样子的?
  • 第一行的数字是多少?
  • @Yuri,抱歉,我认为这不是一个好建议——在任意空白处拆分的规范方法是 .split() 不带任何参数,其结果与您的代码相同。此外,!= 优于 is not
  • @fsimonjetz 你是对的, vars = [v for v in line.split() if v != ''] 更好并且做同样的事情。

标签: python input readlines


【解决方案1】:
# assuming that your file.txt is like

# 515   30.00398       30.00153
# 1  5
# A B A
# A B B
# A B C
# A B D
# P Q R
# 2  4
# A C A
# A C B
# A C C
# A C D

cells = [] # cell0, cell 1, cell2 etc

with open('file.txt') as f:
    # discarding 515   30.00398       30.00153
    next(f)
    
    cell_line = f.readline()
    while(cell_line != ''):
        cell_no, number_of_rows = map(int, cell_line.split())
        cell = [[0,0,0] for i in range(number_of_rows)]

        for i in range(number_of_rows):
            cell[i][0], cell[i][1], cell[i][2] = f.readline().split()
        cells.append(cell)

        cell_line = f.readline()
    
print(cells)

# [[['A', 'B', 'A'],
#   ['A', 'B', 'B'],
#   ['A', 'B', 'C'],
#   ['A', 'B', 'D'],
#   ['P', 'Q', 'R']], ---> cell 0
#  [['A', 'C', 'A'], ['A', 'C', 'B'], ['A', 'C', 'C'], ['A', 'C', 'D']]] ---> cell 1

【讨论】:

  • 我喜欢这种方法 - 我想我会将 while 循环的中间部分更改为 cells.append([f.readline().split() for _ in range(number_of_rows)]) 之类的东西,而不是先构建 cell 矩阵,然后通过索引填充它,但我猜猜这是个人喜好问题!
  • 是的,这也是可能的
  • 由于在我的“真实文件”中我有 15 列,有没有办法用一些东西替换 cell = [[0,0,0] for i in range(number_of_rows)]更紧凑?我在考虑一个带有 numpy 的数组。你怎么看?
  • 然后试试np.empty((15, number_of_rows), dtype=str)
  • 我已经完成了: cell = np.empty((number_of_rows,15), dtype=str) // for i in range(number_of_rows): cell[i][:] = f.readline( )。分裂()。 //好像不行我无法识别拆分 am 数组。
【解决方案2】:

尝试使用 readLine #readLine() 将逐行读取您 #readLines() 将读取列表中的整个文件

with open('fortan_file.txt') as file:
    lines = file.readLines()
    for count, line in enumerate(Lines):
      print("Line{}: {}".format(count, line.strip()))

如果您知道两者之间的界限

lines.seek(line_numer)

#seek 将指针重定向到给定的行 添加一个 if 条件就可以了!

【讨论】:

    【解决方案3】:

    由于我不知道您想要的输出,我假设 3x4 矩阵可能是您单元格的良好数据结构。

    也许用 cell_number: matrix 对构建字典可能是一个很好的实现:

    data = open("file.txt").readlines()[1:] # get a list of all lines except header
    
    cells = {f"cell_{i+1}": data[i:i+4] for i in range(0, len(data), 4)}
    

    这看起来很复杂,因为它非常全面,但实际上有点直观。

    请注意,这是针对特定问题的特定解决方案,因此请确保您的文件与帖子中的结构相同。

    【讨论】:

      猜你喜欢
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多