Присоединение к файлу .data в python - PullRequest
0 голосов
/ 16 октября 2019

Аналогично Минакши Я пытаюсь добавить данные в файл, используя функцию savetxt от numpy.

У меня есть файл .data, к которому я хочу добавить больше данных float32.

responses = np.array(responses,np.float32)
responses = responses.reshape((responses.size,1))

# save as new training results
np.savetxt(sampleData,samples)
np.savetxt(responseData,responses)

# want the option to append to previously written results 

Я могу добавить в двоичном виде следующее, но мне нужно добавить в float32.

# append to old training results 
    with open(sampleData, 'ab+') as fs:
        fs.write(samples)
    with open(responseData, 'ab+') as fr:
        fr.write(responses)

Когда я пытаюсь

# append to old training results 
        with open(sampleData, 'a+') as fs:
            fs.write(samples)
        with open(responseData, 'a+') as fr:
            fr.write(responses)

, я получаю «Аргумент TypeError: write () должен быть str, а не numpy.ndarray»

Что такое синтаксис /расширение, которое я должен использовать, чтобы взаимодействовать с этим типом файла .data в python, учитывая приведенное выше?

1 Ответ

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

Обновление:

Не видели вашего комментария при добавлении изначально. Ответ в вашем связанном вопросе показывает, что вы были на правильном пути:

Следующие данные добавят ваши данные, как и ожидалось, но без выгрузки "gibberish" (байты). np.savetxt, очевидно, позаботится о соответствующем форматировании / кодировании, чтобы написанное было читабельно для человека.

with open(some_file, 'ab+') as fo:
    np.savetxt(fo, responses)

Оригинал - оставлено здесь, чтобы объяснить, почему не работает подход OP

Ваш комментарий намекает на то, что происходит:

Следующее действительно добавляет, но оно вводит тарабарщину (я предполагаю, что из-за двоичного кода, но без b он говорит мне, что мне нужно ввести строку) -> сopen (sampleData, 'ab +') как fs: fs.write (образцы) с open (responseData, 'ab +') как fr: fr.write (ответы)

Когда вы пытаетесь писать безb, он жалуется соответствующим образом, потому что вам нужно , чтобы дать ему строку в обычном режиме записи - вы не можете просто написать список / массив (что и есть samples и responses). Когда вы используете b, вы пишете в двоичном / байтовом режиме, поэтому все, что вы передаете write, преобразуется в байты. Вот что я вижу, если напишу в двоичном режиме следующее:

resp = np.array([1, 2, 4, 5], np.float32)
resp = resp.reshape((resp.size, 1))
np.savetxt(file1, resp)
with open(file2, 'ab+') as fo:
    fo.write(resp)

# From Hex view of written file
00 00 80 3F 00 00 00 40 00 00 80 40 00 00 A0 40

, что идентично вызову bytes(...) в массиве, который я создал:

import binascii
binascii.hexlify(bytes(resp))

# produces:
b'0000803f00000040000080400000a040' -> '00 00 80 3f 00 00 00 40 00 00 80 40 00 00 a0 40'

Итак, вы простоВам нужно отформатировать ваши данные в удобное для str представление, например, объединить в строку (например):

>>> ', '.join(str(x) for x in resp)
'[1.], [2.], [4.], [5.]'

... но то, как вы отформатируете их, конечно, зависит от ваших требований.

...