如何从python中的文件生成元组列表

2024-06-06 10:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我有一个像这样的文件。在

panite,1,1800
ruby,2,100
diamond,0.75,900
emerald,3,250
amethyst,2,50
opal,1,300
sapphire,0.5,750
benitoite,1,2000
malachite,1,60

我们的老师给了我们一个使用try/except来帮助我们打开文件的代码。我需要打开文件,读取每一行,使每一行都成为一个元组,然后将其放入一个列表中。列表应该是最后一个数字除以中间的数字,然后这个值后跟宝石的名称(中间的数字是宝石的克拉数)。我的问题是我甚至不能让它从文件中列出一个列表。这就是我试图打开它,但没有成功。在

^{pr2}$

实际上,当我在def knapsack()下将它改为一个简单的printstatement时,它将打印类似于2+2的简单语句,但当我试图创建一个列表时,它会给我一个except错误。这是我第一次上编程课,所以如果能深入了解这一点,我将不胜感激。在


Tags: 文件列表数字老师opalrubytryexcept
3条回答
def make_jewel(line):
    name, carats, price = line.split(",")
    return (float(price)/float(carats), name)

def main():
    while True:
        file_name = input('File name containing jewel data: ')
        try:
            with open(file_name) as inf:
                data = [make_jewel(line) for line in inf]
            break
        except FileNotFoundError:
            print('Could not find that file -- try again')

main()

还有一些评论:

  • {em1>也被称为“不加修饰的异常”,因为它被指定为一个异常。您应该指定您希望看到的异常类型,并且只处理这些异常;如果您捕获了所有异常,并且发生了完全意外的失败(即ComputerOnFireError!)你永远不会知道的。

  • 首选使用with打开文件,因为这样可以确保文件始终正确关闭。

  • 以文本模式打开文件时,可以逐行迭代该文件;这是处理文件的最常用方法。

  • 当你.split()一个字符串时,你会得到一个字符串列表。在对片段进行数学运算之前,必须使用int()float()将它们从字符串转换为数值。

希望有帮助。在

使用csv模块将行作为csv行读取。在

import csv

def knapsack(datafile):
    output_data = []
    csv_reader = csv.reader(datafile, delimiter=',')
    for row in csv_reader:
        output_data.append(tuple(row))
    return output_data

这将使您output_data为:

^{pr2}$

它是元组的列表。这就解决了从文件中生成列表的问题。现在,您应该:

  • 元组中的数字是字符串。在执行描述中提到的算术运算之前,需要确保you convert them to ^{}
  • output_data作为参数传递给执行问题中提到的算术函数的单独函数。这个函数应该建立你的输出列表。

关于您的代码的几点意见:

  • 在main函数中定义文件句柄,但不传递它 到knapsack函数。但你在背包里提到过 不会给你想要的功能。所以你需要通过 datafile文件句柄作为knapsack函数的参数。为此,请从以下位置替换main方法中的这一行:

    knapsack()
    

    knapsack(datafile)
    
  • {cd8>在Python中构建了一个

你应该:

  • dataFile发送到knapsack函数。
  • except更改为except IOError,以避免捕捉到您希望看到的异常。
  • 关闭文件(考虑使用with打开文件,以避免显式关闭它

    try:
        dataFile = open(fileName, "r")
        fileFound = True
        knapsack(dataFile)
        dataFile.close()
    except IOError:
        print ('Could not find that file -- try again')
    

如果您从一开始就使用except IOError,则会看到以下错误:

^{pr2}$

knapsack不知道dataFile是什么,因此出现错误。使用try..except时,总是捕获特定于的异常。如果您不知道抛出了哪个错误,请在编写python解释器之前重新生成它(例如,尝试打开一个不存在的文件,注意抛出了IOError)。在

knapsack中,您需要从readline更改为{}。在

def knapsack(dataFile):
    list = dataFile.readlines()

您还应该考虑使用另一个答案中提到的^{}模块来处理数据。在

相关问题 更多 >