您好,我是一名自学 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/