无法在保存的txt文件中添加prettytable中的新行

时间:2013-11-12 20:34:11

标签: python-3.x

我是python和编程的新手,所以如果我没有正确解释或使用正确的术语,请耐心等待。同样,如果你给我一个非常技术性的回答,我可能不会理解你。我正在努力,但这对我来说是新的,非常困难!

我正在尝试学习python的方法,所以我开始创建一个小程序来跟踪与徒步旅行相关的各种事情,比如过去的徒步旅行,里程等等。我找到了一个名为prettytable的库,我安装并导入了格式化输入表格的数据。我在输入时使用了数据,但是没有保存文件。我希望能够保存输入程序的数据供以后使用。

这是我正在使用的模块,它创建了一个远足列表。每次徒步旅行都有目的地,里程徒步,天数和合作伙伴。该计划的这一部分按预期工作。输入信息后,输入的数据将存储为名为stored_words的列表,然后该列表将作为一行添加到prettytable中。桌子打印出来之后 你完成了徒步旅行。

def Hikes():

    import prettytable
    import csv

    answer = "yes"
    Index = 0


    mytable = prettytable.PrettyTable()

    x = prettytable.PrettyTable(["Destination", "Miles Hiked", "Days Hiked", "Partner"])
    x.align["Destination"] = "l" # Left align destination
    x.padding_width = 1 # One space between column edges and contents (default)

    while answer == "yes":
        words = ["destination", "miles hiked", "days hiked", "partner"]
        stored_words = []
        HikeList = []
        hikesave = open("hikes.txt" , "a")
        for word in words:
            answer = input("Enter the %s:" % word)
            stored_words.append(answer)
            print(stored_words)

        HikeList.append(stored_words)
        hikesave.write('\n')
        hikesave.write(str(stored_words))

        x.add_row(stored_words)

        hikesave.close()

        answer = input("Enter another hike? yes or no: ")


    print(x)

    return x

这是我为加载文件而创建的模块:

def LoadFile():

    import prettytable
    Flag = False
    FileToLoad = str



    mytable = prettytable.PrettyTable()

    x = prettytable.PrettyTable(["Destination", "Miles Hiked", "Days Hiked", "Partner"])
    x.align["Destination"] = "l" # Left align destination
    x.padding_width = 1 # One space between column edges and contents (default)

    print("-----------------------------------")
    print("     A = Hikes")
    print("     B = Miles List")
    print("     B = Destinations List")
    print("-----------------------------------")
    print()

    FileToLoad = input("Which file would you like to open?")

    while Flag == False: #Loop will keep running until true
        while FileToLoad == "A" or FileToLoad == "B" or FileToLoad == "C":
            if FileToLoad == "A

                with open("hikes.txt", "r") as f:   
                    lines = f.readline()
                    print(lines)                    

                x.add_row(lines)

##                f = open("hikes.txt", "r")
##                for line in f:
##                    print(line)
##                    x.add_row(line)


                print(x)

                Flag = True

我无法弄清楚如何在LoadFile模块中加载文件(hikes.txt),并将该文件中的数据逐行添加到prettytable中。当我尝试这样做时,我在输出中出现了这个错误:

-----------------------------------
     A = Hikes
     B = Miles List
     C = Destinations List
-----------------------------------

Which file would you like to open?A
['High Country Pathway, MI', '82', '4', 'solo']

Traceback (most recent call last):
  File "D:\Program Files\PROGRAMMING\Python\11-3-13.py", line 260, in <module>
    main()
  File "D:\Program Files\PROGRAMMING\Python\11-3-13.py", line 66, in main
    c = LoadFile()
  File "D:\Program Files\PROGRAMMING\Python\11-3-13.py", line 216, in LoadFile
    x.add_row(lines)
  File "D:\Program Files\PROGRAMMING\Python\lib\site-packages\prettytable.py", line 818, in add_row
    raise Exception("Row has incorrect number of values, (actual) %d!=%d (expected)" %(len(row),len(self._field_names)))
**Exception: Row has incorrect number of values, (actual) 48!=4 (expected)**

我不明白为什么我会收到上述错误。

此:

['High Country Pathway, MI', '82', '4', 'solo']
应该将

添加到prettytable中的行...与上一个模块中使用的格式相同。

非常感谢任何帮助。我找不到有关我收到的错误消息的任何信息,并且一直在读取文件输入/输出但是无法解决这个问题。我知道我的代码可能有很多问题,但请记住,我对python非常陌生,只是想让事情发挥作用,所以请不要对我太过刻薄。

**修改

Stevha,我尝试了你提供的代码,但我仍然得到同样的错误,除了现在是7!= 4:

追踪(最近一次通话):   文件“D:\ Program Files \ PROGRAMMING \ Python \ 11-3-13.py”,第265行,in     主要()   在主文件中输入文件“D:\ Program Files \ PROGRAMMING \ Python \ 11-3-13.py”,第66行     c = LoadFile()   在LoadFile中的文件“D:\ Program Files \ PROGRAMMING \ Python \ 11-3-13.py”,第219行     x.add_row(行)   在add_row中的文件“D:\ Program Files \ PROGRAMMING \ Python \ lib \ site-packages \ prettytable.py”,第818行     提升异常(“行的值数不正确,(实际)%d!=%d(预期)”%(len(行),len(self._field_names))) 例外:行的值数不正确,(实际)7!= 4(预期)

我之前看过pickle和JSON,并没有真正理解我需要做什么。我认为文本文件可以工作。它适用于打印信息,这没有问题,但到目前为止还没有插入到漂亮的。我也在研究csv导入,但是试图让它首先使用文本文件。

感谢您的其他建议。当我开始工作并进行输入验证等时,我打算稍后查看代码,但是现在我只是在四处寻找,试图让事情发挥作用。我正在探索我能做什么,不能用python做什么,试图看看事情是如何运作的。我知道那里有一些未使用的代码,比如HikeList列表。我试图在文本文件中以不同的方式保存数据,希望能够克服这个错误。

当我输入保存到hikes.txt文件中的数据时,这是我的程序的样子:

    Choose from the list below: 

     A = Enter Miles Hiked
     B = Enter hiking destination
     C = Load File                        
     E = Exit program
--------------------------------------------------

Enter your selection:  b
Enter the destination:Big Bend, TX
['Big Bend, TX']
Enter the miles hiked:45
['Big Bend, TX', '45']
Enter the days hiked:5
['Big Bend, TX', '45', '5']
Enter the partner:Dan
['Big Bend, TX', '45', '5', 'Dan']
Enter another hike? yes or no: no
+--------------+-------------+------------+---------+
| Destination  | Miles Hiked | Days Hiked | Partner |
+--------------+-------------+------------+---------+
| Big Bend, TX |      45     |     5      |   Dan   |
+--------------+-------------+------------+---------+

打印语句暂时存在,因此我可以看到输入到文本文件中的内容。在hikes.txt文件中添加新的远程后,它看起来像这样:

['High Country Pathway, MI', '82', '4', 'solo']
['Wemincuhe Wilderness, CO', '55', '6', 'Lisa']
['Big Bend, TX', '45', '5', 'Dan']

文本文件中的每一行都包含一个列表格式为prettytable的所有4列的值。错误告诉我没有4个值,但不是我有一个列表,每个列表中包含4个值?如果它认为它是一个字符串而不是列表,那么如何告诉python我的hikes.txt文件中的每一行都是一个列表?

1 个答案:

答案 0 :(得分:0)

我想你会想要一些类似的代码:

with open("hikes.txt", "r") as f:   
    for line in f:
        row = line.split()
        x.add_row(row)

您可以使用“打开文件”对象f并将其用于for循环。执行此操作时,循环变量(在此示例中为row)将从文件中设置为一行,并且循环体运行。

顺便提一下,当您提示用户输入时,您可能希望执行以下操作:

choice = input("Which file would you like to open?")
choice = choice.strip() # remove leading and trailing white space
choice = choice.lower() # convert to lower-case

然后您可以将choice'a''b'进行比较等等,这将有点宽容(用户不需要大写,如果是用户错误地击中空格键它仍然会起作用。)

您可以在一行中完成以上所有操作:

choice = input("Which file would you like to open?").strip().lower()

编辑:我真的不明白你的保存加息数据的代码。看起来你正在写所有的徒步旅行数据,我不认为你这样做会有效。

我建议您编写一个非常简单的格式,一次一行,或者将所有数据保存在列表中并使用库函数编写列表。最佳选择是使用pickle模块的Python本机json或JSON。

假设你想写一个简单的格式,CSV将是一个不错的选择。如果你在Google上搜索“Python CSV教程”,你会发现很多帮助,StackOverflow上也有很多关于它的内容。

编辑:此外,很明显你是Python的新手。我鼓励你学习Python的介绍,比如“学习Python困难之路”,或者阅读一本好的Python书。

这不是100%的要求,但是学习Python社区的习语并遵循它们是一个非常好的主意。例如,变量名称应使用小写字母和下划线;应为类名保留initial-caps。这是在一个名为“PEP 8”的标准中写成的。如果你看一下StackOverflow如何突出显示语法的语法,你会发现HikeList的显示方式与其他变量不同;这是因为它被标记为类名,因为它以大写字母开头。

另外,我的建议是将你的程序分解成小块并测试每一块。您是否测试过您的文件创建代码是否符合您的要求?你看过完成后得到的输出文件hikes.txt吗?

此外,这是错误消息的含义。您创建了一个PrettyTable类实例,并将其设置为一个4列的表。因此,它希望每个输入行都是列表中包含4个项目的列表。但你通过了一个字符串。 Python会假装一个字符串是一个字符列表,所以你的PrettyTable实例看到了48个东西的列表(每个东西都是一个字符)。我的代码示例使用.split()方法函数在空格上拆分字符串,但您可以将CSV与其他分隔符一起使用,它可能会更好。

相关问题