【问题标题】:How to find the minimum and maximum value of the each row from the text file in file handling?如何在文件处理中从文本文件中找到每一行的最小值和最大值?
【发布时间】:2021-12-28 20:38:04
【问题描述】:

我在文件夹中有一个文本文件,该文件包含许多数字的数据。我需要使用 Python 从该文件的每一行中找到最小值和最大值。结果应该是这样的:

.txt 文件中的示例数字

10  2  3  5  9 12 15
 5  9  4  8 10 98 15
23 19 89 71 56 20 11

这样的结果

[(min,max)from first row, (min,max)from second row,.........]

预期结果

[(2,15),(4,98),(11,89),.....]

【问题讨论】:

  • 没有图片 - 只有文字。
  • 到目前为止你尝试了什么?你有什么问题吗?

标签: python max min file-handling


【解决方案1】:

我能想到的最简单的方法是使用 pandas。将文件读入数据框并zip 将最小值和最大值放在一起。

from io import StringIO # import just for the example
import pandas as pd
s = """10  2  3  5  9 12 15
 5  9  4  8 10 98 15
23 19 89 71 56 20 11"""

# df = pd.read_csv('/path/to/file.txt', sep='\s+', header=None)
df = pd.read_csv(StringIO(s), sep='\s+', header=None)
list(zip(df.min(axis=1), df.max(axis=1)))  # -> [(2, 15), (4, 98), (11, 89)]

【讨论】:

  • 谢谢@It_is_Chris.. 实际上我想使用文件处理找到结果。
  • 香草python可以很轻松地完成这项工作,为什么还要有一个外部库?
  • @balderman 因为使用 pandas 比使用循环要快得多,尤其是在处理数百万行时。
【解决方案2】:

遍历行,拆分。转换为 int 并使用 min / max

with open ('in.txt') as f:
  data = []
  for line in f:
    numbers = [int(x) for x in line.strip().split()]
    data.append((min(numbers),max(numbers)))
print(data)

输出

[(2, 15), (4, 98), (11, 89)]

【讨论】:

    【解决方案3】:

    有很多方法可以做到这一点,但我首先想到的是使用 pandas 及其 read_fwf 函数(固定宽度的列)。查看您的示例 .txt 文件,数字由 2-3 个空格分隔,因此您不能使用一个特定的分隔符(除非它是 \t - 然后使用 pd.read_csv())。之后,您可以:

    with open("textfile.txt", 'r') as file:
        df = pd.read_fwf(file, colspecs=[widths_of_your_colums])
    

    然后你可以使用你描述的算法。

    list = [(min(row), max(row)) for row in df]
    

    【讨论】:

      【解决方案4】:

      一种选择是读取每一行,按空格分割,从字符串转换为整数,然后添加到列表中。然后使用minmax查找相关号码:

      with open('file.txt') as fil:
        results = []
        for line in fil:
          nums = [int(x) for x in line.strip().split()]
          results.append((min(nums), max(nums)))
      
      print(results)
      # [(2, 15), (4, 98), (11, 89)]
      

      【讨论】:

        【解决方案5】:
        with open("file.txt", "r") as f:
            num_list = [list(map(lambda x: int(x), line.strip().split())) for line in f]
        out = [(min(li), max(li)) for li in num_list]
        

        【讨论】:

          猜你喜欢
          • 2014-07-15
          • 1970-01-01
          • 2014-10-21
          • 2017-06-09
          • 2016-06-07
          • 2020-08-24
          • 1970-01-01
          • 2020-03-19
          • 2013-04-19
          相关资源
          最近更新 更多