Python isdir возвращает true со строкой, но false с переменной

1

Мой скрипт Python пытается открыть файл имен графств, читать их по одному, а затем найти папку с тем же именем. Я использую isdir, чтобы убедиться, что каталог существует первым. Оператор printpath показывает мне, что тестируется.

Когда я использую testpath в качестве аргумента в isdir, он возвращает FALSE. Когда я помещаю вывод тестового пути print как аргумент isdir, он вычисляет значение TRUE.

Может ли кто-нибудь объяснить, почему переменная testpath возвращает FALSE? благодаря

import sys, string, os

rootdir = 'y:/data/test'
county_list = "u:/sortedcounties.txt"

# Open county_list file and read first name.
os.path.exists(county_list)
os.path.isfile(county_list)
infile = open(county_list,'r')
line =  infile.readline()
while line:
   testpath = os.path.join(rootdir, line)
   print testpath
   if os.path.isdir(testpath):
        print 'testpath = true = ' + testpath

line = infile.readline()
  • 1
    Как отмечает в своем ответе Якоб Бойер, infile.readline() включает в себя строку, заканчивающуюся возвращаемым значением. Измените это на infile.readline().rstrip() и ваш код будет работать нормально. Я бы посоветовал вам пропустить тест os.path.isdir и просто попытаться открыть файл и перехватить IOError в случае сбоя. В кругах Python это известно как EAFP (Проще просить прощения, чем разрешения). См. Mail.python.org/pipermail/python-list/2003-May/203039.html
Теги:

2 ответа

4

Причина, по которой вы читаете файлы, является причиной этой ошибки. .readline() в файле, подобном объекту, возвращает следующую строку в виде строки БЕЗ удаления значения '\n'. Вот пример этого

from StringIO import StringIO
a = StringIO()
a.write("test\nTest")
a.seek(0)
print repr(a.readline())

Чтобы устранить эту проблему, вы можете заменить свой код просто итерацией непосредственно над самим файлом

for line in open("filename"):
    line = line.strip()

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

with open("filename") as input_file:
    for line in input_file:
        line = line.strip()
# When you leave this block then the file is flushed and closed for you in a nice clean way
  • 0
    Правильный диагноз, неправильное решение. Этот код for line in open("filename") все еще оставляет новую for line in open("filename") без изменений.
  • 0
    +1 Кроме того, менеджер контекста закрывает файл гораздо надежнее (интерпретатору придется аварийно завершить работу, чтобы утечка файла), даже с лучшими (без перемонтирования) сборщиками мусора.
Показать ещё 2 комментария
3

Измените определение line() на:

line = infile.readline().strip()

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

Кроме того, имейте в виду, что эти две строки не влияют:

os.path.exists(county_list)
os.path.isfile(county_list)

Эти функции возвращают False если тест не выполняется, но вы не храните и не проверяете возвращаемое значение. Кроме того, открытие файла приведет к ошибке, если файл не существует или не является файлом в любом случае, поэтому этот тест не является абсолютно необходимым. Наконец, если вы используете эти тесты, необходимо использовать isfile() - файл, который не существует, не является файлом, поэтому isfile() улавливает оба пути, которые не являются файлами и путями, которые не существовать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню