【问题标题】:Convert integer within a list into a string to be written to a text file and later retrieved将列表中的整数转换为要写入文本文件并稍后检索的字符串
【发布时间】:2016-01-13 02:36:38
【问题描述】:

我正在尝试创建一个stats.txt 文件,我可以在其中存储winsdrawslosses。到目前为止,我能够在程序运行时检索值并修改它们的唯一方法是使用.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())

如果我在没有list, 的情况下分配这些值,则打印时输出变为:generator object <genexpr> at 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。

我宁愿将文本文件中的值作为整数导入,修改它们,然后将它们写为整数,但我还没有找到这样做的方法。我知道必须有更好的方法来完成上述操作。

【问题讨论】:

  • 注意:[int(val) for val in lines[0].split()] 不需要list
  • stats.close 不会关闭文件,你需要调用stats.close()
  • 或者也可以使用with 语句进行阅读。你只是在文件上做readlines(),之后你不需要这个文件并且可以关闭它。
  • 您必须根据建议的 TypeError 将列表转换为字符串。你可以做例如f.write(str(wins)),但保存的输出可能不是您想要的。或类似f.write(','.join([str(win) for win in wins])) 的东西。到那时,你可能会开始考虑 csv 模块,甚至 numpy。

标签: python text type-conversion python-3.4 writing


【解决方案1】:
  1. 在这种情况下,您应该使用str.strip() 而不是str.split()str.split()空字母(空格、换行符、制表符等)分割字符串并返回一个列表。

    但是,您似乎不需要此处的列表而只想删除该\n,然后,您可以使用str.strip()。删除字符串前后的空字母

    演示:

    >>> s = '0\n'
    >>> s
    '0\n'
    >>> s.strip()
    '0'
    >>> s.split()
    ['0']   
    >>> int(s.strip())
    0
    
  2. 然后,它是一个 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')
    

【讨论】:

  • 这看起来几乎完美!但是,当我运行它时,我在以下位置收到此错误:wins += 1 TypeError: Can't convert 'int' object to str implicitly
  • @Jawshbawx:嗯,我已经编辑了我的答案。看看吧。
  • 完美!非常感谢,这让我很沮丧。
【解决方案2】:

你想用writelines()而不是write()来写一个可迭代对象(比如字符串列表),类似于获取单个字符串的方法是read()和获取列表的方法字符串是readlines()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多