python - 用 Python 读取文本文件并从中选择类别

标签 python parsing python-3.x exception recursion

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

酒店销售人员在文本文件中输入销售额。每行包含以下内容,以分号分隔:客户姓名、销售的服务(例如晚餐、 session 、住宿等)、销售金额以及该事件的日期。编写一个程序来读取此类文件并显示每个服务类别的总金额。如果文件不存在或格式不正确,则显示错误。

  • 提示输入要处理的文件名并发出 错误消息并在无法打开该文件时终止

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

  • 验证美元金额是否为有效的 float 编号,如果不是则终止

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

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

  • 显示类别和每个类别的总数

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

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

请记住,虽然您可以在不使用其他软件包的情况下做任何事情,但它们的存在是有原因的,并且拥有正确的工具可以使工作变得更容易。 假设这不是作业问题

关于python - 用 Python 读取文本文件并从中选择类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33138623/

相关文章:

python - 用于数组索引的 Matlab 逻辑 - Python 等效项

python - 使用另一个向量中的分组值进行平均(numpy/Python)

ruby - Ruby解析器的原理是什么?

java - 从 Jackson 解析器生成 JSON

python - 在 Windows 上打印到 NamedTemporaryFile

终端中的 Python 字符处理

python - 如何在 Keras、Tensorflow 中导入 LSTM

ios - 当我在 Parse Swift 2.2 中遇到未经授权的错误时该怎么办

python-3.x - 逐步调试选定的 Python 代码

python - pysftp 无法创建日志文件 - 权限被拒绝