Мой скрипт 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()
Причина, по которой вы читаете файлы, является причиной этой ошибки. .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
for line in open("filename")
все еще оставляет новую for line in open("filename")
без изменений.
Измените определение line()
на:
line = infile.readline().strip()
В строке, которую вы прочтете, будет отображаться строка, завершающая новую строку, которая не является частью имени файла.
Кроме того, имейте в виду, что эти две строки не влияют:
os.path.exists(county_list)
os.path.isfile(county_list)
Эти функции возвращают False
если тест не выполняется, но вы не храните и не проверяете возвращаемое значение. Кроме того, открытие файла приведет к ошибке, если файл не существует или не является файлом в любом случае, поэтому этот тест не является абсолютно необходимым. Наконец, если вы используете эти тесты, необходимо использовать isfile()
- файл, который не существует, не является файлом, поэтому isfile()
улавливает оба пути, которые не являются файлами и путями, которые не существовать.
infile.readline()
включает в себя строку, заканчивающуюся возвращаемым значением. Измените это наinfile.readline().rstrip()
и ваш код будет работать нормально. Я бы посоветовал вам пропустить тестos.path.isdir
и просто попытаться открыть файл и перехватить IOError в случае сбоя. В кругах Python это известно как EAFP (Проще просить прощения, чем разрешения). См. Mail.python.org/pipermail/python-list/2003-May/203039.html