【问题标题】:Sorting a list from a file, outputting in another file从文件中排序列表,在另一个文件中输出
【发布时间】:2012-10-06 00:08:41
【问题描述】:

我正在尝试从 csv 文件中找到最小值和最大值,并将其输出到文本文件中,目前我的代码将所有数据输出到输出文件中,我不确定如何从中获取数据多列并相应地对它们进行排序。

任何指导都将不胜感激,因为我对如何解决这个问题没有很好的指导

read_file = open("riskfactors.csv", 'r')

def create_file():

    read_file = open("riskfactors.csv", 'r')
    write_file = open("best_and_worst.txt", "w")

    for line_str in read_file:
        read_file.readline()
        print (line_str,file=write_file)

    write_file.close()
    read_file.close()

【问题讨论】:

  • 看看csv 模块——它就是为此而生的:)
  • 当您说最小值和最大值时,您是指每列的最小值和最大值条目,还是某个特定列中具有最小值和最大值的行?或者别的什么。

标签: python file sorting csv


【解决方案1】:

假设您的文件是标准 .csv 文件,其中仅包含用分号分隔的数字:

1;5;7;6;
3;8;1;1;

那么最简单的方法就是使用 str.split() 命令,然后将类型转换为 int。 您可以将所有值存储在列表中(或更快:设置),然后获取最大值:

valuelist=[]
for line_str in read_file:
     for cell in line_str.split(";"):
         valuelist.append(int(cell))
print(max(valuelist))
print(min(valuelist))

警告:如果您的文件包含非数字条目,您必须将它们过滤掉。 .csv 文件也可以有不同的分隔符。

【讨论】:

  • 我不会将分号分隔称为标准,因为毕竟 csv 代表 comma 分隔值。
【解决方案2】:
import sys, csv

def cmp_risks(x, y):
    # This assumes risk factors are prioritised by key columns 1, 3
    # and that column 1 is numeric while column 3 is textual
    return cmp(int(x[0]), int(y[0])) or cmp(x[2], y[2])

l = sorted(csv.reader(sys.stdin), cmp_risks))

# Write out the first and last rows
csv.writer(sys.stdout).writerows([l[0], l[len(l)-1]])

现在,我走捷径说 inputoutput 文件是 sys.stdinsys.stdout。您可能会将这些替换为您在原始问题中创建的文件对象。 (例如read_filewrite_file

但是,就我而言,我可能只是运行它(如果我使用的是 linux):

$ ./foo.py <riskfactors.csv >best_and_worst.txt

【讨论】:

  • 他们真的不希望我们使用 csv,但这看起来也不错!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多