Python 将列表中的整数转换为字符串,以写入文本文件并稍后检索
我正在尝试制作一个Python 将列表中的整数转换为字符串,以写入文本文件并稍后检索,python,text,type-conversion,python-3.4,writing,Python,Text,Type Conversion,Python 3.4,Writing,我正在尝试制作一个stats.txt文件,在那里我可以存储赢的,抽的,和输的。到目前为止,我能够检索值并在程序运行时修改它们的唯一方法是使用.readlines()打开它们,然后将它们作为列表中的整数分配给变量(见下文) 我的问题是,我似乎找不到一种方法将它们以列表形式写回文本文件。谁能给我指出正确的方向吗 文本文件的格式如下: 0\n 0\n 0\n 除了三个0,后跟enter之外,没有其他内容写入其中。 我的代码如下: stats = open("C:/Users/JawshBawx/Do
stats.txt
文件,在那里我可以存储赢的
,抽的
,和输的
。到目前为止,我能够检索值并在程序运行时修改它们的唯一方法是使用.readlines()
打开它们,然后将它们作为列表中的整数分配给变量(见下文)
我的问题是,我似乎找不到一种方法将它们以列表形式写回文本文件。谁能给我指出正确的方向吗
文本文件的格式如下:
0\n
0\n
0\n
除了三个0,后跟enter之外,没有其他内容写入其中。
我的代码如下:
stats = open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","r")
lines = stats.readlines()
wins = list(int(val) for val in lines[0].split())
draws = list(int(val) for val in lines[1].split())
losses = list(int(val) for val in lines[2].split())
如果我在没有列表的情况下分配这些值,
输出在打印时变为:0x0000011CEF216CA8处的生成器对象,并且我不能用+1修改值
if result == 0:
print("Draw!")
draws = [x + 1 for x in draws]
elif result == 1:
print(ai_var+" Wins!")
losses = [x + 1 for x in losses]
elif result == 2:
print(ai_var+" Wins!")
losses = [x + 1 for x in losses]
elif result == 3:
print(user_var+" Wins!")
wins = [x + 1 for x in wins]
else:
print(user_var+" Wins!")
wins = [x + 1 for x in wins]
print(wins)
print(draws)
print(losses)
stats.close
with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","w") as f:
f.write(wins)
f.write(draws)
f.write(losses)
我的结果是:
TypeError: write() argument must be str, not list
我无法将其转换为字符串,并以这样一种方式写入,即它将以我需要的格式检索,以便每次程序运行时都能处理I
我宁愿将文本文件中的值作为整数导入,修改它们,然后将它们作为整数写入,但我还没有找到这样做的方法。我知道一定有更好的方法来实现上述功能。您想使用writelines()
而不是write()
来编写一个iterable对象(例如字符串列表),类似于获取单个字符串的方法是read()
,获取字符串列表的方法是readlines()
在这种情况下,您应该使用而不是。按空字母(空格、换行符、制表符等)拆分字符串并返回列表
但是,这里似乎不需要列表,只需要删除\n
,然后就可以使用。它删除字符串前后的空字母
演示:
然后,它是一个int对象。因此,您可以完全删除这些列表并使用object+=1
但是,当您将字符串对象写回文件时,可以使用str()
函数将其转换为字符串对象
请记住,如果您不想将它们全部放在一行中,请添加一个+\n
:
with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt", "r") as f:
lines = f.readlines()
wins = int(lines[0].strip())
draws = int(lines[1].strip())
losses = int(lines[2].strip())
if result == 0:
print("Draw!")
draws += 1
elif result in [1, 2]:
print(ai_var+" Wins!")
losses += 1
else:
print(user_var+" Wins!")
wins += 1
with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","w") as f:
f.write(str(wins)+'\n')
f.write(str(draws)+'\n')
f.write(str(losses)+'\n')
注意:[int(val)for val in line[0].split()]
不需要list
stats。close
不关闭文件,您需要调用它stats.close()
或使用with
语句进行读取。您只需对文件执行readlines()
,然后您就不需要该文件并可以将其关闭。您必须根据建议的TypeError将列表转换为字符串。您可以执行例如f.write(str(wins))
,但保存的输出可能不是您想要的。或者类似于f.write(',').join([str(win)表示wins中的win])
。到那时,你可能会开始考虑csv模块,甚至numpy。这看起来几乎完美!当我运行这个程序时,我在:wins+=1 TypeError:无法将'int'对象转换为strimplicitly@Jawshbawx:嗯,我已经编辑了我的答案。看一看,太好了!非常感谢,这让我很沮丧。
with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt", "r") as f:
lines = f.readlines()
wins = int(lines[0].strip())
draws = int(lines[1].strip())
losses = int(lines[2].strip())
if result == 0:
print("Draw!")
draws += 1
elif result in [1, 2]:
print(ai_var+" Wins!")
losses += 1
else:
print(user_var+" Wins!")
wins += 1
with open("C:/Users/JawshBawx/Documents/LiClipse Workspace/RPScLSp/RPScLSp_Src/Stats.txt","w") as f:
f.write(str(wins)+'\n')
f.write(str(draws)+'\n')
f.write(str(losses)+'\n')