我是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文件中的每一行都是一个列表?
答案 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与其他分隔符一起使用,它可能会更好。