如何使用Python 3中的readlines读取由空格分隔的整数输入文件?

问题描述 投票:4回答:4

我需要读取一个包含一行整数(13 34 14 53 56 76)的输入文件(input.txt),然后计算每个数字的平方和。

这是我的代码:

# define main program function
def main():
    print("\nThis is the last function: sum_of_squares")
    print("Please include the path if the input file is not in the root directory")
    fname = input("Please enter a filename : ")
    sum_of_squares(fname)

def sum_of_squares(fname):
    infile = open(fname, 'r')
    sum2 = 0
    for items in infile.readlines():
        items = int(items)
        sum2 += items**2
    print("The sum of the squares is:", sum2)
    infile.close()

# execute main program function
main()

如果每个数字都在它自己的行上,它可以正常工作。

但是,当所有数字都在一个由空格分隔的行上时,我无法弄清楚如何做到这一点。在那种情况下,我收到错误:ValueError: invalid literal for int() with base 10: '13 34 14 53 56 76'

python python-3.x integer readlines
4个回答
5
投票

您可以使用file.read()获取字符串,然后使用str.split按空格分割。

您需要先将每个数字从string转换为int,然后使用内置的sum函数计算总和。

另外,您应该使用with语句为您打开和关闭文件:

def sum_of_squares(fname):

    with open(fname, 'r') as myFile: # This closes the file for you when you are done
        contents = myFile.read()

    sumOfSquares = sum(int(i)**2 for i in contents.split())
    print("The sum of the squares is: ", sumOfSquares)

输出:

The sum of the squares is: 13242

2
投票

您正在尝试将包含空格的字符串转换为整数。

你想要做的是使用split方法(这里,它将是items.split(' '),它将返回一个字符串列表,包含数字,这次没有任何空格。然后你将遍历这个列表,将每个元素转换为一个int作为你已经在尝试做了。

我相信你会发现下一步该做什么。 :)


这是一个简短的代码示例,使用更多pythonic方法来实现您要执行的操作。

# The `with` statement is the proper way to open a file.
# It opens the file, and closes it accordingly when you leave it.
with open('foo.txt', 'r') as file:
    # You can directly iterate your lines through the file.
    for line in file:
        # You want a new sum number for each line.
        sum_2 = 0
        # Creating your list of numbers from your string.
        lineNumbers = line.split(' ')
        for number in lineNumbers:
            # Casting EACH number that is still a string to an integer...
            sum_2 += int(number) ** 2
        print 'For this line, the sum of the squares is {}.'.format(sum_2)

2
投票

您可以尝试使用split()函数在空间上拆分项目。

来自文档:例如,' 1 2 3 '.split()返回['1', '2', '3']

def sum_of_squares(fname):
    infile = open(fname, 'r')
    sum2 = 0
    for items in infile.readlines():
        sum2 = sum(int(i)**2 for i in items.split())
    print("The sum of the squares is:", sum2)
    infile.close()

0
投票

保持简单,不需要任何复杂的事情。这是一个评论一步一步的解决方案:

def sum_of_squares(filename):

    # create a summing variable
    sum_squares = 0

    # open file
    with open(filename) as file:

        # loop over each line in file
        for line in file.readlines():

            # create a list of strings splitted by whitespace
            numbers = line.split()

            # loop over potential numbers
            for number in numbers:

                # check if string is a number
                if number.isdigit():

                    # add square to accumulated sum
                    sum_squares += int(number) ** 2

    # when we reach here, we're done, and exit the function
    return sum_squares

print("The sum of the squares is:", sum_of_squares("numbers.txt"))

哪个输出:

The sum of the squares is: 13242
© www.soinside.com 2019 - 2024. All rights reserved.