Как сохранить файл .txt по нескольким путям из списка в Python - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь написать короткий фрагмент кода, который позволит мне записать серийный номер Raspberry Pi и дату / время в текстовый файл.Эта информация будет записываться на флешку каждый раз, когда она подключена к моей Raspberry Pi.Этот скрипт будет использоваться на нескольких Raspberry Pi с разными USB-флешками, поэтому я стараюсь быть как можно более общим, потому что меняются пути и т.д. между частями оборудования.

Первая часть моего скрипта работает нормально:

    #import packages
    from datetime import datetime
    import os
    import os.path
    from shutil import copyfile

    usblist = [x for x in usblist if not x.startswith('SETTINGS')] #For some reason I have some folders starting with SETTINGS that I don't want to delete but simply ignore in my list

    #create a new list with the paths for each USB
    usbpathlist = os.path.abspath(usblist[0]),os.path.abspath(usblist[1]) #I will only have two USB sticks inserted at a time

    #for some reason my paths show as in the /home/ directory when it appears that they are mounted in /media/
    usbpathlist = [w.replace('home', 'media') for w in usbpathlist] #this fixes the paths

Затем я извлекаю информацию, уникальную для Raspberry Pi, и дату / время и сохраняю их как переменные

    def getserial():
        #Extract the serial number from the cpuinfo file
        cpuserial = "0000000000000000"
        try:
            f = open("/proc/cpuinfo", "r")
            for line in f.readlines():
                if line[0:6] == "Serial":
                    cpuserial = line[10:26]
                    f.close()
        except:
            cpuserial = "ERROR00000000000"
        return cpuserial

    rpi_serial = getserial()

    time_experiment = str(datetime.now())

Теперь я записываю эту информацию в виде текстового файла.

    with open("rpi_information.txt", "w") as rpi_information:
        rpi_information.write("Raspberry Pi Serial Number: " + rpi_serial + "\n") #Write the serial number
        rpi_information.write("Time written: " + time_experiment + "\n") #Write the date
        rpi_information.close()

Наконец, проблемная часть моего скрипта - это то, где я пытаюсь сохранить этот файл в пути моих USB-флешек, которые я сохранил выше как 'usbpathlist'

    for d in usbpathlist:
        copyfile(rpi_information, d)

ОтВот в чем заключается моя проблема: я потратил довольно много времени на поиск и поиск в этом сайте, но не смог выяснить, как сохранить этот файл на каждой флешке после того, как он был создан.Большая часть информации в Интернете говорит о том, что я не могу сохранить текстовые файлы в нескольких местах одновременно, но это кажется маловероятным.Если я вручную вставлю путь перед «rpi_information.txt» выше, он сохранится без проблем.Моя проблема в том, что из-за того, что мои флешки будут другими, эти пути будут меняться, поэтому я не думаю, что это хорошее решение.Ошибки, которые я получал от этой последней части скрипта (как, вероятно, ожидается):

    Traceback (most recent call last):
      File "home/pi/test.py", line 55 in <module> #test.py is my filename
        copyfile(rpi_information, d)
      File "/usr/lib/python3.5/shutil.py", line 103, in copyfile
        if _samefile(src,dst):
      File "/usr/lib/python3.5/shutil.py", line 88, in samefile
        return os.path.samefile(src,dst)
      File "/usr/lib/python3.5/genericpath.py", line 90, in samefile
        s1 = os.stat(f1)
    TypeError: argument should be string, bytes, or integer, not _io.TextWrapper

В конечном счете, я хотел бы найти способ передать этот файл на обе флешки без проблем,Я хотел бы сохранить эту информацию в виде текстового файла, потому что я буду ссылаться на нее позже на другом компьютере.Буду признателен за понимание того, как сделать эту работу, или за любые комментарии о том, как улучшить мой код.Это мой первый скрипт на Python и мой первый вопрос о StackOverFlow (хотя я скрывался годами), поэтому, пожалуйста, будьте осторожны со мной!Я прочитал много документации по этой проблеме, поэтому я просто сбит с толку.Заранее благодарим за помощь.

--- EDIT --- Пользователь Vulcan ниже предположил, что моей ошибкой было то, что я не смог включить ".txt" в функцию copyfile.Я пробовал это ранее, но безрезультатно.К сожалению, это приводит к ошибке:

    Traceback (most recent call last):
      File "home/pi/test.py", line 55 in <module> #test.py is my filename
        copyfile(rpi_information.txt, d)
    AttributeError: '_io.TextWrapper' object has no attribute 'txt'

1 Ответ

0 голосов
/ 08 июня 2018

Ошибка трассировки подчеркивает вашу проблему здесь: argument should be string... not _io.TextWrapper.Когда вы вызываете copyfile(rpi_information, d), элемент rpi_information является дескриптором файла, а не путем к файлу, который ожидает один из типов файлов, copyfile.Передайте имя файла:

for d in usbpathlist:
    copyfile('rpi_information.txt', d)
...