【问题标题】:How to write and read a list to a file? Python 3.7如何将列表写入和读取到文件?蟒蛇 3.7
【发布时间】:2019-09-30 08:39:15
【问题描述】:

我自己编写的程序有问题,该程序检查您的词汇知识。您可以创建一个包含任意数量词汇的会话,您可以编写这些单词及其答案,如果您已完成编写此词汇,程序可以询问您这些单词,您应该用另一种语言编写解决方案。单词保存在 2 个列表中(第一个列表用于第一种语言,另一个列表用于另一种语言中每个单词的解决方案)。一切正常,但如果你关闭程序,你的话将不会被保存。我想将这些列表保存在 .txt 文件中。创建一个 .txt 文件是可行的,但我不能在 .txt 文件中插入一个列表,它说这应该是一个字符串。我尝试了很多方法,但仍然遇到一些错误。而且我希望将两个列表放在一个文件中,当我阅读它们时,它们应该以某种方式分开。 我希望有一个人可以帮助我。非常感谢!!!

我尝试了基本的 file.write 和 file.read 方法,但我得到了一些错误,说它不能是一个列表,它必须是一个字符串。 我也试过 join() 方法,不工作。 而且我不能使用pickle,因为我在一个文件中有两个列表,它们必须分开。

import random
import os.path 

firstList = []
secondList = []
sprachen = ["Afrikaans", "Albanisch", "Amharisch", "Arabisch", "Armenisch", "Aserbaidschanisch", "Baskisch", "Bengalisch", "Birmanisch", "Bosnisch", "Bulgarisch", "Cebuano", "Chichewa", "Chinesisch", "Mandarin", "Dänisch", "Deutsch", "Englisch", "Esperanto", "Estnisch", "Filipino", "Finnisch", "Französisch", "Friesisch", "Galizisch", "Georgisch", "Griechisch", "Gujarati", "Haitianisch", "Hausa", "Hawaiisch", "Hebräisch", "Hindi", "Hmong", "Igbo", "Indonesisch", "Irisch", "Isländisch", "Italienisch", "Japanisch", "Javanisch", "Jiddisch", "Kannada", "Kasachisch", "Katalanisch", "Khmer", "Kirigisch", "Koreanisch", "Korsisch", "Kroatisch", "Kurdisch", "Kurmandschi", "Lao", "Lateinisch", "Latein", "Lettisch", "Litauisch", "Luxemburgisch", "Malagasy", "Malayalam", "Malaysisch", "Maltesisch", "Maori", "Marathi", "Mazedonisch", "Mongolisch", "Nepalesisch", "Niederländisch", "Norwegisch", "Paschtu", "Persisch", "Polnisch", "Portugiesisch", "Punjabi", "Rumänisch", "Russisch", "Samonaisch", "Schottisch-Gällisch", "Schwedisch", "Serbisch", "Sesotho", "Shona", "Sindhi", "Singhalesisch", "Slowakisch", "Slowenisch", "Somali", "Spanisch", "Suaheli", "Sundanesisch", "Tadschikisch", "Tamil", "Telugu", "Thailändisch", "Tschechisch", "Türkisch", "Ukrainisch", "Ungarisch", "Urdu", "Usbekisch", "Vietnamesisch", "Walisisch", "Weissrussisch", "Xhosa", "Yoruba", "Zulu"] 

print("Willkommen beim Vokabelprogramm. Viel Spass beim Lernen!")

def start():
    global name
    projekt = input("Möchten Sie eine bestehende Lerneinheit öffnen [Open] 
    oder eine neue Lerneinheit beginnen [New]? ")
    if projekt == "Open":
        openProject = input("Welche Lerneinheit möchten Sie öffnen? ")
        while os.path.exists(openProject + ".txt"):
            name = openProject
            output()
        else:
            erstellen = input("Diese Lerneinheit existiert unter diesem Namen noch nicht. Möchten Sie diese erstellen? ")
            if erstellen == "Ja":
                name = openProject
                file = open(name + ".txt", "w+")
                file.close()
                print("Die Lerneinheit, namens " + name + ", wurde erstellt.")
                sprache()
            else:
                print("Die Aktion wird abgebrochen.")
                start()
    elif projekt == "New":
        name = input("Wie möchten Sie diese Lerneinheit nennen? ")
        while name == "":
            print("Geben Sie für den Namen Ihrer Lerneinheit einen gültigen Wert ein.")
        else:
            while os.path.exists(name + ".txt"):
                bestaetigung = input("Dieser Dateiname existiert bereits, möchten Sie diese Datei überschreiben? ")
                if bestaetigung == "Ja":
                    file = open(name + ".txt", "w+")
                    file.close()
                    print("Die Lerneinheit, namens " + name + ", wurde erstellt.")
                    sprache()
                else:
                    print("Die Aktion wird abgebrochen.")
                    start()
            else:
                file = open(name + ".txt", "w+")
                file.close()
                print("Die Lerneinheit, namens " + name + ", wurde erstellt.")
                sprache()
     else:
        print("Diese Eingabe ist ungültig.")
        start()

def sprache():
    global ersteSprache
    global zweiteSprache
    ersteSprache = input("Welche ist die erste Sprache, in der Sie die Vokabeln prüfen möchten? ")
    while ersteSprache in sprachen:
        zweiteSprache = input("Und die zweite Sprache? ")
        while zweiteSprache in sprachen:
            while zweiteSprache == ersteSprache:
                print("Sie müssen 2 verschiedene Sprachen angeben!")
                zweiteSprache = input("Welche ist die zweite Sprache? ")
                while zweiteSprache in sprachen:
                    beginning()
                else:
                    print("Diese Sprache gibt es nicht! Versuchen Sie die Sprachen nochmals einzugeben.")
                    sprache()
            else:
                beginning()
        else:
            print("Diese Sprache gibt es nicht, bitte versuchen Sie es nochmals.")
    else:
        print("Diese Sprache gibt es nicht, bitte versuchen Sie es nochmals.")
        sprache()

    def beginning():
    vokabel = input("Geben Sie eine Vokabel auf " + ersteSprache + " ein: ")
    if vokabel == "":
        print("Bitte geben Sie für die Vokabel einen gültigen Wert ein.")
        beginning()
    firstList.append(vokabel)
    uebersetzung = input("Was bedeutet diese Vokabel auf " + zweiteSprache + "? ")
    if uebersetzung == "":
        print("Bitte geben Sie für die Übersetzung einen gültigen Wert ein.")
        uebersetzung = input("Was bedeutet diese Vokabel auf " + zweiteSprache + "? ")
    secondList.append(uebersetzung)
    def abfrage():
        fertig = input("Ist das alles? Geben Sie Ja ein um die Vokabelliste zu bestätigen oder drücken Sie die Enter-Taste um noch eine Vokabel hinzuzufügen: ")
        if fertig == "Ja":
            with open(name + ".txt", "w") as file:
                for combo in zip(firstList, secondList):
                    file.writelines(" ".join(combo) + "\n")
            output()
        elif fertig == "":
            beginning()
        else:
            print("Diese Eingabe ist ungültig, bitte versuchen Sie es nochmals")
            abfrage()
    abfrage()

    def output():
    newLanguage_1 = []
    newLanguage_2 = []
    with open(name + ".txt", "r") as file:
        for line in file.readlines():
            word_1, word_2 = line.split()
            newLanguage_1.append(word_1)
            newLanguage_2.append(word_2)
    ausgabe = random.choice(newLanguage_1)
    print(ausgabe)
    zahl = newLanguage_1.index(ausgabe)
    pruefen = input("Übersetzung: ")
    vokabelZweiteSprache = newLanguage_2[zahl]
    def nochmal():
        nochmals = input("Möchten Sie noch eine Vokabel prüfen (ENTER-Taste)? ")
        if nochmals == "":
            output()
        else:
            print("Viel Glück bei der Prüfung, Daumen sind gedrückt!")
            exit()
    if pruefen != vokabelZweiteSprache:
        print("Leider falsch! Die richtige Lösung wäre " + vokabelZweiteSprache + " gewesen. Lernen Sie diese Vokabel nochmals!")
        nochmal()
    else:
        print("Richtig! " + ausgabe + " heisst " + vokabelZweiteSprache + ".")
        nochmal()
start()

@Kraay89 这里我贴一下我的相关代码出现以下错误:IndexError: list index out of range[编辑]我检查了列表是否为空,但不知道为什么,我在代码中赋值,问题出在哪里:

new_currLanguage = []
with open(name + ".txt", "r") as file:
    lines = file.readlines()
    for lines[0] in file.readlines():
        lang_1, lang_2 = lines[0].split()
        new_currLanguage.append(lang_1, lang_2)
firstLanguage = new_currLanguage[0]
secondLanguage = new_currLanguage[1]

【问题讨论】:

  • 请分享您的代码...以及您遇到的错误
  • "单词被保存在 2 个列表中(第一个语言的列表和其他语言中每个单词的解决方案的另一个列表)" => 错误的设计。你想要一个(original_word, translated_word) 的列表。否则,如果出于某种原因,两个列表中的任何一个发生了更改,而另一个列表中没有报告更改,那么您的数据已损坏。
  • 我可以发,但我知道这行不通,因为我尝试了很多东西。
  • “不工作”是对问题最没有用的描述。请阅读minimal reproducible example 并相应地编辑您的问题;-)
  • “医生您好,我怎么了?” - “嗯,我可以先检查你,然后再直接诊断吗?” - “好吧,如果你必须这样做,但我已经吃了一些药,但它们没有用......”:P

标签: python python-3.x list pickle


【解决方案1】:

如果问题中没有一些代码示例,我会假设一些事情。

您可能尝试过一次将整个列表写入文件,但这不是解决此问题的最佳方法。省略 cmets 中的一些建议,例如您的数据结构可能存在缺陷,我认为您可以使用以下代码开始,并从那里改进。

我使用的一些您可能不熟悉的关键功能:

zip() -> 同时遍历两个列表

str.join() -> 将两个字符串连接在一起,在这种情况下使用空格:" "

str.split() -> 在任意空白字符上分割字符串

language_1 = ["Hello", "Bye", "Bike", "Car"] # English words
language_2 = ["Hallo", "Doei", "Fiets", "Auto"] # Dutch words

# Saving the lists:
with open("saved_lists.txt", 'w+') as myfile:
    for combo in zip(language_1, language_2):
        myfile.writelines(" ".join(combo)+"\n")

# Reading back:
new_language_1 = []
new_language_2 = []
with open("saved_lists.txt", 'r') as myfile:
    for line in myfile.readlines():
        word_1, word_2 = line.split()
        new_language_1.append(word_1)
        new_language_2.append(word_2)

【讨论】:

  • 此解决方案存在一个问题。如果我有一个包含超过 1 个单词的“单词”(很难解释)。示例:去学校这不起作用,我得到一个错误:“ValueError: too many values to unpack (expected 2)”
  • 这就是为什么你需要用一些例子和你使用的代码来更新你的问题。我们不能只是神奇地嗅出您的问题是什么或可能是什么。查看拆分和连接功能。它们的组合将为您提供解决问题的工具。
  • 我可以发布我的代码,但其中大部分是德语,而且大部分代码实际上与我的问题无关,但我可以发布它。
  • 贴在上面!
  • 我坚持我之前所说的。加入和拆分将帮助您... ;-) 谷歌您的错误,没有针对您的具体数字。 ValueError: not enough values to unpack 例如,直到您知道解决问题所需的一切。你的代码表明你已经有了一些经验,所以我相信你可以解决它。与您编写的所有代码相比,这应该是一个容易解决的问题。
猜你喜欢
  • 2023-03-08
  • 2012-08-20
  • 1970-01-01
  • 2018-12-31
  • 2016-08-13
  • 2011-06-07
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多