所以,我试图写一个随机数量的随机整数(在0
到1000
的范围内),将这些数字平方,并将这些方块作为列表返回。最初,我开始写入我已创建的特定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人,有人可以解释为什么我有这个,以及如何解决它以达到预期的结果?谢谢!
答案 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
的参数会显示它是一个封闭的文件句柄。
测试这些碎片可以让您站稳脚跟,让您以有条理的方式发展。