Python .app не читает файл .txt, как должен

Этот вопрос относится к этому: app-e">Приложение Python, которое читает и записывает в свой текущий рабочий каталог как .app/exe

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

Вот соответствующий код:

def getLines( filename ):
    path = Cocoa.NSBundle.mainBundle().bundlePath()

    real_path = path[0: len(path) - 8]

    print real_path

    f = open(real_path + filename, 'r') # open the file as an object

    if len(f.read()) <= 0:
        lines = {}                  # list to hold lines in the file
        for line in f.readlines():  # loop through the lines
            line = line.replace( "\r", "    " )
            line = line.replace( "\t", "    " )
            lines = line.split("    ")      # segment the columns using tabs as a base
        f.close()                   # close the file object

        return lines

lines = getLines( "raw.txt" )
for index, item in enumerate( lines ):        # iterate through lines
    # ...

Это ошибки, которые я получаю:

  • 09/30/2012 10:28:49.103 [0x0-0x4e04e].org.pythonmac.unspecified.main: для индекса, элемент в enumerate(lines): # итерация по строкам
  • 09/30/2012 10:28:49.103 [0x0-0x4e04e].org.pythonmac.unspecified.main: TypeError: объект 'NoneType' не повторяется

Я как бы понимаю, что означают ошибки, однако я не уверен, почему они помечаются, потому что, если я запускаю свой скрипт с ним не в форме .app, он не получает эти ошибки и отлично извлекает данные.


person Richard Bamford    schedule 30.09.2012    source источник
comment
Пожалуйста, не используйте какой-либо другой веб-сайт для вставки кода. Хотя это может быть хорошей практикой в ​​чатах IRC, в stackoverflow для вас предпочтительнее вставить соответствующий код непосредственно в вопрос.   -  person Mark Hildreth    schedule 30.09.2012
comment
Вы хотите преобразовать вкладки в пробелы перед вставкой сюда, иначе это приведет к хаосу с отступом.   -  person Martijn Pieters    schedule 30.09.2012


Ответы (1)


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

Ваш код в настоящее время делает это:

f= open(real_path + filename, 'r')  # open the file as an object

if len(f.read()) <= 0:
    lines = {}                  # list to hold lines in the file
    for line in f.readlines():  # loop through the lines

Оператор .read() может прочитать весь файл в память за один раз, в результате чего указатель чтения перемещается в конец. Цикл по .readlines() ничего не вернет.

Но вы также запускаете этот код только в том случае, если ваш .read() вызов ничего не прочитал. Вы в основном говорите: если файл пуст, прочитайте строки, иначе ничего не читайте.

В конце концов это означает, что ваша функция getlines() всегда возвращает None, что позже приводит к ошибке, которую вы видите.

Полностью освободите if len(f.read()) <= 0::

f= open(real_path + filename, 'r')  # open the file as an object

lines = {}                  # list to hold lines in the file
for line in f.readlines():  # loop through the lines

Затем вы ничего не делаете с lines = {}, потому что для каждой строки в вашем файле вы заменяете переменную lines: lines = line.split(" "). Вероятно, вы хотели вместо этого создать список и добавить:

f= open(real_path + filename, 'r')  # open the file as an object

lines = []              # list to hold lines in the file
for line in f.readlines():  # loop through the lines
    # process line
    lines.append(line.split("    "))

Еще один совет: real_path = path[0: len(path) - 8] можно заменить на real_path = path[:-8]. Вы, вероятно, захотите заглянуть в модуль os.path, чтобы управлять своими путями; Я подозреваю, что вызов os.path.split() будет работать для вас лучше и надежнее.

person Martijn Pieters    schedule 30.09.2012
comment
Отличный анализ и объяснение - надеюсь, ОП оценит усилия +1 - person Jon Clements♦; 30.09.2012