如何将列表写入和读取文件? Python 3.7

How to write and read a list to a file? Python 3.7

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

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

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 在这里我将 post 我的相关代码用于以下错误: 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]

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

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

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

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

str.join() -> 将两个字符串连接在一起,在本例中使用 space:" "

str.split() -> 在任何白色 space 字符

上拆分字符串
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)