简体   繁体   English

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

[英]How to read an input file of integers separated by a space using readlines in Python 3?

I need to read an input file (input.txt) which contains one line of integers (13 34 14 53 56 76) and then compute the sum of the squares of each number. 我需要读取一个包含一行整数(13 34 14 53 56 76)的输入文件(input.txt),然后计算每个数字的平方和。

This is my code: 这是我的代码:

# 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()

If each number is on its own line, it works fine. 如果每个数字都在它自己的行上,它可以正常工作。

But, I can't figure out how to do it when all the numbers are on one line separated by a space . 但是,当所有数字都在一个由空格分隔的行上时,我无法弄清楚如何做到这一点。 In that case, I receive the error: ValueError: invalid literal for int() with base 10: '13 34 14 53 56 76' 在这种情况下,我收到错误: ValueError: invalid literal for int() with base 10: '13 34 14 53 56 76'

You can use file.read() to get a string and then use str.split to split by whitespace. 您可以使用file.read()获取字符串,然后使用str.split按空格分割。

You'll need to convert each number from a string to an int first and then use the built in sum function to calculate the sum. 您需要先将每个数字从一个string转换为一个int ,然后使用内置的sum函数来计算总和。

As an aside, you should use the with statement to open and close your file for you: 另外,您应该使用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)

Output: 输出:

The sum of the squares is: 13242

You are trying to turn a string with spaces in it, into an integer . 您正在尝试将包含空格字符串转换为整数

What you want to do is use the split method (here, it would be items.split(' ') , that will return a list of strings, containing numbers, without any space this time. You will then iterate through this list, convert each element to an int as you are already trying to do. 你想要做的是使用split方法(这里是items.split(' ') ,它将返回一个字符串列表 ,包含数字,这次没有任何空格。然后你将遍历这个列表,转换你正在尝试做的每个元素到一个int

I believe you will find what to do next. 我相信你会发现下一步该做什么。 :) :)


Here is a short code example, with more pythonic methods to achieve what you are trying to do. 这是一个简短的代码示例,使用更多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)

You could try splitting your items on space using the split() function. 您可以尝试使用split()函数在空间上拆分项目。

From the doc: For example, ' 1 2 3 '.split() returns ['1', '2', '3'] . 来自doc:例如, ' 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()

Just keep it really simple, no need for anything complicated. 保持简单,不需要任何复杂的事情。 Here is a commented step by step solution: 这是一个评论一步一步的解决方案:

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"))

Which outputs: 哪个输出:

The sum of the squares is: 13242

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM