[英]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
拼写错误。 try
在process_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.