Как не было написано на моем файле - Python 2

Поэтому я просто хочу иметь список всех значений цвета пикселей, которые перекрываются, записанных в текстовом файле, чтобы я мог получить к ним доступ позже.

Единственная проблема заключается в том, что текстовый файл имеет (установить ([или что-то написанное с ним.

Вот мой код

import cv2
import numpy as np
import time

om=cv2.imread('spectrum1.png')
om=om.reshape(1,-1,3)
om_list=om.tolist()
om_tuple={tuple(item) for item in om_list[0]}
om_set=set(om_tuple)


im=cv2.imread('RGB.png')        
im=cv2.resize(im,(100,100))         
im= im.reshape(1,-1,3)
im_list=im.tolist()
im_tuple={tuple(item) for item in im_list[0]}
ColourCount= om_set & set(im_tuple)
File= open('Weedlist', 'w')
File.write(str(ColourCount))

Кроме того, если я запустлю эту программу еще раз, но с другим изображением для сравнения, добавит ли она данные или перезапишет их? Трудно сказать, просто глядя на цифры.

3 ответа

Вы открыли файл с 'w' режим, режим записи, который будет урезать (пустой) файл при его открытии. использование 'a' режим добавления, если вы хотите, чтобы данные добавлялись в конец каждый раз

Вы пишете str() преобразование заданного объекта в ваш файл:

ColourCount= om_set & set(im_tuple)
File= open('Weedlist', 'w')
File.write(str(ColourCount))

Не использовать str конвертировать весь объект; отформатируйте ваши данные в строку, которую вы легко читаете обратно. Возможно, вы тоже захотите добавить новую строку, если хотите, чтобы каждая новая запись добавлялась в новую строку. Возможно, вы тоже хотите отсортировать данные, так как набор перечисляет элементы в порядке, определяемом деталями реализации.

Если у вас работает запятая, используйте str.join(); Ваш набор содержит кортежи целых чисел, и это звучит так, как будто вы в порядке с repr() вывод на кортеж, поэтому мы можем использовать это:

with open('Weedlist', 'a') as outputfile:
    output = ', '.join([str(tup) for tup in sorted(ColourCount)])
    outputfile.write(output + '\n')

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

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

Если вы программируете и эту другую программу, выберите формат, который поддерживает другой язык программирования. Например, JSON широко поддерживается (используйте json модуль и преобразовать ваш набор в список первым; json.dump(sorted(ColourCount), fileobj), затем `fileobj.write('\n') для создания разделенных новой строкой объектов JSON может это сделать).

Если эта другая программа написана на Python, рассмотрите возможность использования pickle модуль, который эффективно записывает объекты Python в файл в формате, который тот же модуль может загрузить снова:

with open('Weedlist', 'ab') as picklefile:
    pickle.dump(ColourCount, picklefile)

и чтение так же просто, как:

sets = []
with open('Weedlist', 'rb') as picklefile:
    while True:
        try:
            sets.append(pickle.load(output))
        except EOFError:
            break

См. Сохранение и загрузка нескольких объектов в файл pickle? относительно того, почему я использую while True Цикл там, чтобы загрузить несколько записей.

Если вы замените эти строки:

im=cv2.imread('RGB.png')

File= open('Weedlist', 'w')
File.write(str(ColourCount))

с:

import sys

im=cv2.imread(sys.argv[1])

open(sys.argv[1]+'Weedlist', 'w').write(str(list(ColourCount)))

вы получите новый файл для каждого входного файла, а также вам не нужно перезаписывать RGB.png каждый раз, когда вы хотите попробовать что-то новое.

Файлы открываются в режиме 'w' будет перезаписано Ты можешь использовать 'a' добавить.

Как бы вы хотели, чтобы данные были записаны? Заменить последнюю строку на

File.write(str(list(ColourCount)))

Может быть, вам нравится это больше.

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

File= open('Weedlist', 'a')
Другие вопросы по тегам