我正在尝试制作一个程序,它从文件中抓取一个数字列表(可能会改变行和大小),然后打印出所有数字和平均值的总和。当我有一定数量的线读时,我没有遇到任何问题,但是当线读改变每次运行时,我对“正确”方式感到困惑。
这是我正在进行中的代码。我读了一下,找到了正确的(?)循环文件的方式来查找长度,但不知道如何实现它,因为它当前抛出某种类型的IO错误。谢谢你的帮助!
def main():
filename = input("Enter file name (name.txt):")
try:
file = open(filename, "r")
except IOError:
print("Error opening file!")
totalLines = totalLineGet(filename)
results = []
for x in range(totalLines):
results.append(getLineNumber(x+1, file))
print("Total = ", numTotal)
print("Average = ", numAvg)
def totalLineGet(_filename):
count = 0
_file = open(_filename, "r")
for x in open(_file):
count+= 1
return count
def getLineNumber(linetoget, _file):
try:
intNumber = int(number = _file.readline())
except ValueError:
print("Error in file data!")
return intNumber
main()
答案 0 :(得分:2)
我不确定你想做什么......但你应该能够一次性得到答案。
如果您需要知道项目/行号计数,可以使用enumerate()
为可迭代对象编号,在本例中为文件。
假设每行有一个int():
with open(filename, "r") as in_f:
numbers = []
for line in in_f:
line = line.strip() # remove whitespace
if line: # make sure there is something there
number_on_line = int(line)
numbers.append(number_on_line)
sum_of_numbers = sum(numbers)
avg_of_numbers = sum(numbers)/len(numbers)
如果这是CSV数据,您应该使用csv
模块进行查看,它会将行拆分成行/列。
import csv
filename = "somefile"
with open(filename, "rb") as in_f: # <-- notice "rb" is used
reader = csv.reader(in_f)
for row in reader:
for col in row:
# do stuff
...
答案 1 :(得分:1)
一个简单的解决方案,做你想做的......
filename = 'tmp.txt'
f = open(filename)
s, totnum = 0, 0
for line_number, line in enumerate(f):
nums = map(int, line.split())
s += sum(nums)
totnum += len(nums)
print "numbers:", totnum, "average:", 1.0*s/totnum
答案 2 :(得分:1)
这假设您的文件每行只有数字而不是字符,否则您将获得TypeError
。
list_of_numbers = []
with open('somefile.txt') as f:
for line in f:
if line.strip(): # this skips blank lines
list_of_numbers.append(int(line.strip()))
print 'Total ',len(list_of_numbers)
print 'Average ',1.0*sum(list_of_numbers)/len(list_of_numbers)
答案 3 :(得分:1)
关于如何做你想做的事,有一些很好的答案。至于IO错误,input()内置尝试评估用户的输入,这既危险又不是你想要的。
尝试使用内置的raw_input()。这将用户的输入作为字符串返回。为了好玩,尝试运行您的脚本并将其作为文件名__name__
,并查看会发生什么。