Ошибка Python3 _io.TextIOWrapper при открытии файла с помощью блокнота - PullRequest
0 голосов
/ 22 октября 2019

Я застрял на пару дней над проблемой в моем проекте микро-адресной книги. У меня есть функция, которая записывает все записи из базы данных SQLite3 в файл для открытия через модуль ОС, но как только я пытаюсь открыть файл, Python выдает мне следующую ошибку:

Error while opening tempfile. Error:startfile: filepath should be string, bytes or os.PathLike, not _io.TextIOWrapper

Это код, который я должен записать в файл и открыть его:

        source_file_name = open("C:\\workdir\\temp.txt","w")
        #Fetching results from database and storing in result variable
        self.cur.execute("SELECT id, first_name, last_name, address1, address2, zipcode, city, country, nation, phone1, phone2, email FROM contacts")
        result = self.cur.fetchall()

        #Writing results into tempfile
        source_file_name.write("Stampa Elenco Contatti\n")
        for element in result:
            source_file_name.write(str(element[0]) + "|" + str(element[1]) + "|" + str(element[2]) + "|" + str(element[3]) + "|" + str(element[4]) + "|" + str(element[5]) + "|" + \
                str(element[6]) + "|" + str(element[7]) + "|" + str(element[8]) + "|" + str(element[9]) + "|" + str(element[10]) + "|" + str(element[11]) + "\n")

        #TODO: Before exiting printing function you MUST:
        # 1. filename.close()
        # 2. exit to main() function
        source_file_name.close()
        try:
            os.startfile(source_file_name,"open")
        except Exception as generic_error:
            print("Error while opening tempfile. Error:" + str(generic_error))
        finally:
            main()

Честно говоря, я не понимаю, что означает эта ошибка, в моих предыдущих фрагментах кода я всегда обрабатывал текстовые файлы безпроблемы, но я понимаю, что на этот раз все по-другому, потому что я выбираю свой поток из базы данных. Есть идеи как это исправить? Заранее спасибо, и извините за мой английский ...

1 Ответ

1 голос
/ 22 октября 2019

Ваша проблема в конечном итоге связана с плохим именованием переменных. Здесь

source_file_name = open("C:\\workdir\\temp.txt","w")

source_file_name не содержит имя исходного файла. Он содержит исходный файл , сам (т. Е. Дескриптор файла). Вы не можете передать это os.startfile(), который ожидает путь к файлу (как и в сообщении об ошибке).

То, что вы хотели сделать, это

source_file_name = "C:\\workdir\\temp.txt"
source_file = open(source_file_name,"w")

Но на самом деле этогораздо лучше использовать блок with в Python, так как он будет обрабатывать закрытие файла для вас.

Также лучше использовать CSV Writer вместо создания CSV вручную, иНастоятельно рекомендуется явно указать кодировку файла.

import csv

# ...

source_file_name = "C:\\workdir\\temp.txt"

with open(source_file_name, "w", encoding="utf8", newline="") as source_file:
    writer = csv.writer(source_file, delimiter='|')

    source_file.write("Stampa Elenco Contatti\n")

    for record in self.cur.fetchall():
        writer.writerow(record)

    # alternative to the above for loop on one line
    # writer.writerows(self.cur.fetchall())
...