Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибки при работе с файлами и каталогами
Форум на CrossPlatform.RU > Разработка > Интерпретируемые языки
zuze
Я делаю так:

#Глобальные переменные
NF = None
dir = os.path.join(os.getcwd(), "file") # Выбор текущей директории с файлами

# В функции пишу
global dir
global NF
os.chdir(dir)
fp = open(NF[frame], 'rb')


А в результате выдаётся ошибка: TypeError: 'NoneType' object is unsubscriptable
Может это из-за того, что я сделал глобально NF = None? Я только хотел обнулить глобальный двухмерный массив.
ViGOur
Цитата(zuze @ 20.3.2013, 9:32) *
Может это из-за того, что я сделал глобально NF = None? Я только хотел обнулить глобальный двухмерный массив.
А для чего ты это делаешь?
Пустой список указывается так:
NF = []          # Создаем пустой список
NF.append(frame) # добавляем в него что нужно
# ...
NF = 'string' # Теперь это строка, а список уничтожится сборщиком мусора
zuze
Цитата(ViGOur @ 20.3.2013, 8:40) *
А для чего ты это делаешь?


Так как я испоьзую NF в нескольких функциях и не заморачиваюсь пока чтобы передавалась в виде параметра, хотя и понимаю что это лучше. Мне пока важна скорость создания, оптимизировать я потом буду.
zuze
Как я понял это ошибка говорит о том, что массив NF пустой. Но почему ведь я его в начале заполняю?
И если я выведу на экран
print NF[frame]

То прикрасно выводится имя первого файла.
lanz
Эта ошибка говорит о том, что объект NF вообще не массив.
Видимо эта функция вызывается раньше, чем заполняется массив.

Чтобы создать пустой массив(список):
Цитата
Пустой список указывается так:
NF = [] # Создаем пустой список
zuze
Цитата(lanz @ 20.3.2013, 10:02) *
Чтобы создать пустой массив(список):

Пустой список указывается так:
NF = [] # Создаем пустой список


Я так сделал, но это не помогло.
lanz
Приведите код программы.
zuze
Цитата(lanz @ 20.3.2013, 11:31) *
Приведите код программы.


#Глобальные переменные
NF = []
dir = os.path.join(os.getcwd(), "file") # Выбор текущей директории с файлами

# В функции пишу
global dir
global NF
os.chdir(dir)
fp = open(NF[frame], 'rb')


Но ошибка уже другая: IndexError: list index out of range
lanz
А где заполнение? И в каком порядке вызываются функции?
zuze
Цитата(lanz @ 20.3.2013, 12:56) *
А где заполнение? И в каком порядке вызываются функции?


При нажатии на кнопку
def MyNameFile(self):
        NF = os.listdir(dir) # Список файлов и поддиректорий в данной директории
        indexFile = 0

        for name in NF:
            indexFile = indexFile + 1


Вызываю так в конструкторе

self.connect(self.ui.pushButton, QtCore.SIGNAL("clicked()"), self.MyNameFile)


А открываю файл я в таймере он запускается при нажатии на кнопку. Конечно я нажимаю раньше на кнопку, где заполняется NF именами файлов.
lanz
В функцию заполнения тоже нужно добавить
global NF
zuze
Цитата(lanz @ 20.3.2013, 13:15) *
В функцию заполнения тоже нужно добавить
global NF


Большое спасибо! Заработало.
zuze
Я хочу сметить текущую директорию.
Делаю так:
# Глобально делаю
dir = os.path.join(os.getcwd(), "file") # Выбор текущей директории с файлами

# В функции
global dir
os.chdir(dir)


А в результате когда я делаю

print os.chdir(dir)


Выводится: None

Когда я делаю

print dir


Выводится всё правильно: D:\PythonProject\l\file

Пробовал сделать, так

os.chdir(r"D:\PythonProject\l\file")


Тоже выводится: None

Почемуже, так происходит?
ViGOur
Как я понимаю os.chdir не позвращает ничего, ибо зачем? Ты же и так знаешь на что меняешь, а если что-то будет не так она кинет исключение вроде: WindowsError
Если ты хочешь посмотреть текущую директорию после os.chdir используй os.getcwd.
zuze
Цитата(ViGOur @ 20.3.2013, 16:06) *
Как я понимаю os.chdir не позвращает ничего, ибо зачем?


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

if IOError:
   print "Cannot open file read!"


Может код для проверки открылся ли файл, нужно было другой какой-то писать?
ViGOur
Конечно он срабатывает, ибо данный код:
if IOError:
   print "Cannot open file read!"
переводится как: если тип IOError не равен None (а он не равен), напечатать "Cannot open file read" :)

ты лучше скажи чего хочешь, а еще лучше почитай книжку по Python не будет лишней... ;)
zuze
Цитата(ViGOur @ 20.3.2013, 16:33) *
а еще лучше почитай книжку по Python не будет лишней...


Поправил, тепрерь всё впорядке:

os.chdir(dir)
try:
    fp = open(NF[frame], 'rb')
except IOError:
    print "Cannot open file read!"
zuze
Хотел сделать присвоение двухмерному массива двоичного файла по байтно.
Пробовал, как я делал на Си, вот так:

# Глобальная переменная
bf = []

global bf
for j in range(0, 720, 1):
     for i in range(491, 0, -1):
          bf[i][j] = fp.read(1)


Но, выскакивает ошибка: IndexError: list index out of range
Как же это поправить?
lanz
for j in range(0, 720, 1):
     bf.append ([]);
     for i in range(491, 0, -1):
          bf[j].append(fp.read(1))


Все же советую использовать что нибудь из следующего:
http://docs.python.org/2/library/array.html - одномерные массивы.
http://www.numpy.org/ - многомерные массивы и полезные функции.
http://www.pythonware.com/products/pil/ - для работы с изображениями.

Кстати, никто не знает альтернативу PIL(что сейчас модно :lol:)? Печалит последний релиз четырехлетней давности.
zuze
Цитата(lanz @ 21.3.2013, 15:20) *
for j in range(0, 720, 1):
    bf.append([])
      for i in range(491, 0, -1):
          bf[j].append(fp.read(1))


Этот строчку кода, когда я делаю во вложенном цикле её

print bf[j]


Выводится почему-то только первое значение, я так понял это из-за того что j не меняеться, но почему оно не меняеться в циклах оно же меняется?
lanz
for j in range(0, 720, 1):
     bf.append([])
     for i in range(491, 0, -1):
         bf[j].append(i+j)
         print bf[j]

Только что из DreamPie, все работает, все выводит :lol:
Кстати рекомендую http://www.dreampie.org/ очень удобно пробовать конструкции которые давно не использовал.
zuze
Цитата(lanz @ 22.3.2013, 8:21) *
Только что из DreamPie, все работает, все выводит


Всё заработало, только в моём случае в место
bf[j].append(i+j)


делаю
bf[j].append(fp.read(i+j))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.