繁体   English   中英

在Python中读取文本文件并从中选择类别

[英]Reading a text file in Python and choosing categories from it

您好,我是一个非常新的程序员,正在自学Python。 我遇到了一个非常有趣的问题,需要一些帮助来为其创建程序。 像这样

旅馆销售员在文本文件中输入销售。 每行包含以下内容,并用分号隔开:客户名称,出售的服务(例如Dinner,Conference,Lodging等),销售金额以及该事件的日期。 编写一个程序,读取该文件并显示每个服务类别的总金额。 如果文件不存在或格式不正确,则显示错误。

  • 提示要处理的文件名并发出错误消息,如果无法打开该文件则终止

  • 验证每行的项目数是否正确,如果没有,则终止

  • 验证美元金额是有效的浮点数,如果不是,则终止

  • 保留一个列表,列出遇到的类别(可能与下面有所不同),并列出另一个列表,列出每个类别的累积美元金额。 这是两个列表,但是其中一个元素与另一个元素相关(按位置)

  • 处理完所有数据后,关闭文件

  • 显示每个类别和总计

我们的示例文本文件看起来像这样

Bob;Dinner;10.00;January 1, 2015
Tom;Dinner;14.00;January 2, 2015
Anne;Lodging;125.00;January 3, 2015
Jerry;Lodging;125.00;January 4, 2015

这是我的代码。 我在main()处出现缩进错误。 有人可以根据问题帮助我更正和完善我的代码吗? 如果需要,请随时删除整个代码。

import sys
def main():

    try:
        line = infile.readline()
        for line in infile:
            inputFileName = input("Input file name: ")
            infile = open(inputFileName, "r")
            fields = line.split(";")

            value = float(fields[1])

    except:
        print("Error: The file cannot be opened.")
        sys.exit(1)

    def process_file(file_name):
        infile = open(file_name, 'r')
        # a dictionary mapping category to total amount for that category
        amount_by_category = {}
        try:
            line = infile.readline()
            for line in infile:
                fields = line.split(';')
                if len(fields) != 4:
                    raise Exception('Expected 4 fields but found %s' % len(fields))
                value = float(fields[2])
                category = fields[1]
                if not category in amount_by_category:
                    amount_by_category[category] = 0.0
                amount_by_category[category] += value
            return amount_by_category
main()

使用上述正确文件运行的输出应为:

Enter the name of the file to display: input.txt

Totals:
Dinner: $  24.00

Lodging: $ 250.00

我看到您花了很多时间,但是我认为最好总是使用手头的工具。

为了提高效率,我了解您学习的并不是100%的内容,但是将数据导入pandas可以节省大量时间。

import pandas as pd

df = pd.read_csv('data.csv', header = None, sep=';')

dinner = df[df[1]=='Dinner'][2].sum() #1 is the "Dinner/Lodge" and 2 is "Cost"

print(dinner)

>>> 24.0

记住这一点,尽管您可以在不使用其他软件包的情况下做任何事情,但是它们之所以存在是有原因的,拥有合适的工具可以使工作更加轻松。 假设这不是作业问题

使用包含以下内容的文本文件:

Bob;Dinner;10.00;January 1, 2015
Tom;Dinner;14.00;January 2, 2015
Anne;Lodging;125.00;January 3, 2015
Jerry;Lodging;125.00;January 4, 2015

我做了一些最小的更改,并得到了您想要的输出:

Totals:
Dinner: $ 24.0
Lodging: $ 250.0

我在原始代码中遇到了很多问题。 amount_by_category拼写错误。 tryprocess_file需要一个except 读取文件时,实际上是在跳过第一行,因此从未处理Bob 那是因为您读了一行,然后什么也不做,进入了循环。 0.0f不是浮点数,只需执行0.0正确转换。

您还应该考虑停止使用try except用作拐杖。 这是一种非常懒惰的编程方式,而不是实际修复错误。 在这种情况下,您可以轻松检查文件是否需要输入,因此不需要使用try

def main():
    file_name = input("Input file name: ")
    amount_by_category = process_file(file_name)
    if amount_by_category:
        print 'Totals:'
        for key in amount_by_category:
            print '{0}: $ {1}'.format(key, amount_by_category.get(key) )

def process_file(file_name):
    infile = open(file_name, 'r')
    # a dictionary mapping category to total amount for that category
    amount_by_category = {}
    for line in infile:
        fields = line.split(';')
        if len(fields) != 4:
            raise Exception('Expected 4 fields but found %s' % len(fields))
        value = float(fields[2])
        category = fields[1]
        if not category in amount_by_category:
            amount_by_category[category] = 0.0
        amount_by_category[category] += value
    return amount_by_category

main()

希望能有所帮助。

您收到语法错误,因为您不能在数字后使用字母'f'。 在python中,您可以通过使用小数点或使用内置类型float()来获得一个浮点数

float(0)= 0.0 0. = 0.0 0.0 = 0.0

所有将产生相同的结果

我不知道您是否在寻找特定的python3.x答案,但是我复制粘贴了您的代码并做了一些小的改动。
对于3.1,应将raw_input更改为input
希望对您有所帮助。

import os

def process_file(file_name):
    infile = open(file_name, 'r')
    amount_by_category = {}
    # a dictionary mapping category to total amount for that category

    line = infile.readline()
    for line in infile:
        fields = line.split(';')
        if len(fields) != 4:
            raise Exception('Expected 4 fields but found %s' % len(fields))
        value = float(fields[2])
        category = fields[1]
        if category not in amount_by_category:
            amount_by_category[category] = 0.0
        amount_by_category[category] += value

    return amount_by_category


if __name__== "__main__": 
    filePath = raw_input("Input file name: ")
    if not os.path.exists(filePath):
        raise Exception("File Does not exists: "+filePath)
    dataDict = process_file(filePath)
    for key,value in dataDict.iteritems():
        print key,value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM