将随机数量的随机数写入文件并返回其正方形

时间:2012-11-03 19:34:35

标签: python math file-io python-3.x

所以,我试图写一个随机数量的随机整数(在01000的范围内),将这些数字平方,并将这些方块作为列表返回。最初,我开始写入我已创建的特定txt文件,但它无法正常工作。我寻找了一些我可以使用的方法可能会让事情变得更容易,我找到了我认为可能有用的tempfile.NamedTemporaryFile方法。这是我当前的代码,提供了评论:

# This program calculates the squares of numbers read from a file, using several functions
# reads file- or writes a random number of whole numbers to a file -looping through numbers
# and returns a calculation from (x * x) or (x**2);
# the results are stored in a list and returned.
# Update 1: after errors and logic problems, found Python method tempfile.NamedTemporaryFile: 
# This function operates exactly as TemporaryFile() does, except that the file is guaranteed to   have a visible name in the file system, and creates a temprary file that can be written on and accessed 
# (say, for generating a file with a list of integers that is random every time).

import random, tempfile 

# Writes to a temporary file for a length of random (file_len is >= 1 but <= 100), with random  numbers in the range of 0 - 1000.
def modfile(file_len):
       with tempfile.NamedTemporaryFile(delete = False) as newFile:
            for x in range(file_len):
                 newFile.write(str(random.randint(0, 1000)))
            print(newFile)
return newFile

# Squares random numbers in the file and returns them as a list.
    def squared_num(newFile):
        output_box = list()
        for l in newFile:
            exp = newFile(l) ** 2
            output_box[l] = exp
        print(output_box)
        return output_box

    print("This program reads a file with numbers in it - i.e. prints numbers into a blank file - and returns their conservative squares.")
    file_len = random.randint(1, 100)
    newFile = modfile(file_len)
    output = squared_num(file_name)
    print("The squared numbers are:")
    print(output)

不幸的是,现在我在modfile函数TypeError: 'str' does not support the buffer interface中的第15行收到此错误。作为一个相对较新的Python人,有人可以解释为什么我有这个,以及如何解决它以达到预期的结果?谢谢!

编辑:现在固定代码(非常感谢unutbu和Pedro)!现在:我怎样才能在原来的方块旁打印原始文件号码?另外,有没有什么方法可以从输出的浮点数中删除小数?

2 个答案:

答案 0 :(得分:2)

默认情况下tempfile.NamedTemporaryFile会创建一个二进制文件(mode='w+b')。要以文本模式打开文件并能够写入文本字符串(而不是字节字符串),您需要更改临时文件创建调用,以便不使用b参数中的mode({{ 1}}):

mode='w+'

答案 1 :(得分:1)

你需要在每个int之后添加换行符,以免它们一起运行创建一个巨大的整数:

newFile.write(str(random.randint(0, 1000))+'\n')

(同样设置模式,如PedroRomano的回答中所述):

   with tempfile.NamedTemporaryFile(mode = 'w+', delete = False) as newFile:

modfile返回已关闭的文件句柄。您仍然可以从中获取文件名,但您无法从中读取。所以在modfile中,只需返回文件名:

   return newFile.name

在程序的主要部分,将文件名传递给squared_num函数:

filename = modfile(file_len)
output = squared_num(filename)

现在在squared_num内,你需要打开文件进行阅读。

with open(filename, 'r') as f:
    for l in f:
        exp = float(l)**2       # `l` is a string. Convert to float before squaring
        output_box.append(exp)  # build output_box with append

全部放在一起:

import random, tempfile 

def modfile(file_len):
       with tempfile.NamedTemporaryFile(mode = 'w+', delete = False) as newFile:
            for x in range(file_len):
                 newFile.write(str(random.randint(0, 1000))+'\n')
            print(newFile)
       return newFile.name

# Squares random numbers in the file and returns them as a list.
def squared_num(filename):
    output_box = list()
    with open(filename, 'r') as f:
        for l in f:
            exp = float(l)**2
            output_box.append(exp)
    print(output_box)
    return output_box

print("This program reads a file with numbers in it - i.e. prints numbers into a blank file - and returns their conservative squares.")
file_len = random.randint(1, 100)
filename = modfile(file_len)
output = squared_num(filename)
print("The squared numbers are:")
print(output)

PS。不运行它就不要写很多代码。编写小函数,并测试每个函数是否按预期工作。例如,测试modfile会显示所有随机数都被连接在一起。打印发送到squared_num的参数会显示它是一个封闭的文件句柄。

测试这些碎片可以让您站稳脚跟,让您以有条理的方式发展。