分享
三行代码  ›  专栏  ›  技术社区  ›  jfwinston32

但我不知道为什么。我的文件没有多余的空格。请帮帮我完全迷路了

  •  2
  • jfwinston32  · 技术社区  · 1 周前

    我从中得到的是有一个空的东西或空间,但在我的文本文件中没有任何东西。 我的代码的目标是将钱添加到一个用逗号分隔的文本文件中,并将其转换为一个整数列表。

    奖励:如果你对Pycharm有所了解,你是如何摆脱的 '>?' 当输入时。

    我的错误:

    File "C:/Users/hayde/PycharmProjects/Finance/Money.py", line 32, in <listcomp>
        int_tot = [int(i) for i in str_tot]
    ValueError: invalid literal for int() with base 10: ''
    

    我的代码:

    def add_money():
        money = str(input("Amount: "))   
        #if '' in money: #if i run this it loops forever
            #return add_money()
        with open(r"C:\Users\hayde\OneDrive\Desktop\account.txt", 'a') as account:  
            account.write(',' + money)                    
        with open(r"C:\Users\hayde\OneDrive\Desktop\account.txt", 'r') as account:  
            if account.read(1) == ',':                                 
                print("Please clear account file, then have 0 be the only value in file")
                return                  
            for cash in account:
                str_tot = cash.split(',')  
        int_tot = [int(i) for i in str_tot]
        return int_tot
    
    4 回复  |  直到 1 周前
        1
  •  1
  •   Ian Wilson    1 周前

    我在运行你的代码时遇到了一些问题。我真的很难创建一个没有尾随换行符的文件,这将被认为是一个空格。

    我可以用 echo -n '0' > account.txt

    第二,一旦你打电话来 account.read(1) 实际上,您将文件指针向前移动,以便帐户现在偏移1个字符。然后,当你尝试迭代时,文件指针会关闭1,总是从逗号开始,因为 0 是文件的开头。所以如果你打电话 account.seek(0) 在分开之前应该可以用。

    def add_money():
        money = str(input("Amount: "))   
        #if '' in money: #if i run this it loops forever
            #return add_money()
        with open(r"C:\Users\hayde\OneDrive\Desktop\account.txt", 'a') as account:  
            account.write(',' + money)                    
        with open(r"C:\Users\hayde\OneDrive\Desktop\account.txt", 'r') as account:
            if account.read(1) == ',':                                 
                print("Please clear account file, then have 0 be the only value in file")
                return
            # Return to the beginning of the file after reading 1 character.
            account.seek(0)
            
            for cash in account:
                str_tot = cash.split(',')  
        int_tot = [int(i) for i in str_tot]
        return int_tot
    
        2
  •  3
  •   Ann Zen    1 周前

    出错的一个原因是当你打电话时 int() 在空字符串上:

    int_tot = [int(i) for i in str_tot]
    

    可以使用筛选器仅转换和保留非空字符串:

    int_tot = [int(i) for i in str_tot if i]
    

    if i 在这种情况下,意味着 if i != ''

        3
  •  1
  •   Ann Zen    1 周前

    用逗号分隔行时,如果该行中的第一个字符是逗号,则列表中的第一个值为 '' .

    要解决此问题,请不要在新行中添加逗号,也不要将逗号添加为行的第一个字符。
    或者你可以简单地移除 从列表中 .remove(0)

        4
  •  1
  •   Mateo Lara    1 周前

    问题似乎是str_tot上的一个或多个元素无法转换为int,这就是为什么会得到ValueError。请检查文件以验证您没有字符串或空格,您也可以按如下方式添加异常处理:

    str_tot = [1, 2, 3, '3rjr', 6, 7]
    int_tot = []
    
    for i in str_tot:
        try:
            int_tot.append(int(i))
        except ValueError:
            print('Error, value: ', i)
    print(int_tot)
    

    输出:

    Error, value:  3rjr
    [1, 2, 3, 6, 7]