Как найти путь к файлу в списке строк в Windows независимо от направления косой черты в строках - PullRequest
1 голос
/ 28 мая 2020

В Windows, используя Python 2.7, содержимое файла считывается, и определенные строки из этого файла (после добавления в начало строки «D: \ abcddev \») помещаются в список с именем FilePathList. Эти строки представляют собой пути к файлам, например:

D:\abcddev\toeblog/folderX/fileA.h
D:\abcddev\toeblog/folderY/fileB.h

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

Я хочу проверить, найден ли определенный путь в списке. Путь содержит все обратные косые черты.

Итак, продолжая данный пример, я хочу проверить, есть ли следующее в списке выше:

D:\abcddev\toeblog\folderY\fileB.h

Как видите, эта строка содержит все обратные косые черты.

Итак, моя проблема в том, как проверить равенство независимо от того, является ли sla sh прямым или обратным sla sh.

Моя идея состояла в том, чтобы преобразовать все члены FilePathList для обратных путей, разделенных sla sh, и помещают их в новый список NormalizedFilePathList, а затем для поиска в этом списке пути, который я sh ищу.

Итак, это мой код:

# Declare list
NormalizedFilePathList = []

# Add backward slash separated lines to NormalizedFilePathList
for file in FilePathList:
    NormalizedFilePathList.append (os.path.normpath(file)) 

# Display the contents of NormalizedFilePathList
for file in NormalizedFilePathList
    print file

# Create the string to be searched for
test_file = 'D:\abcddev\toeblog\folderY\fileB.h'

# Search for the string in NormalizedPathFileList
if test_file in NormalizedFilePathList:
    print "Found test_file"
else:
    print "Did not find test_file"

Вот результат вышеуказанного:

D:\abcddev\toeblog\folderX\fileA.h
D:\abcddev\toeblog\folderY\fileB.h
Did not find test_file

Почему это не работает? Очевидно, есть совпадение с 'D: \ abcddev \ toeblog \ folderY \ fileB.h'.

В своем недоумении я попробовал несколько вещей, чтобы прояснить ситуацию, а именно:

  1. Распечатал строки в NormalizedPathFileList с помощью repr (), чтобы увидеть, есть ли какие-либо скрытые символы, препятствующие обнаружению совпадения. Нет, не было.

  2. Создал искусственно новый список, который я заполнил вручную и вместо этого выполнил поиск.

ManualList = ['D:\abcddev\toeblog\folderX\fileA.h','D:\abcddev\toeblog\folderY\fileB.h']

for file in ManualList
    print file

# Search for the string in ManualList
if test_file in ManualList:
    print "Found test_file"
else:
    print "Did not find test_file"

Вот результат:

D:\abcddev    oeblog\folderX\fileA.h
D:\abcddev    oeblog\folderY\fileB.h
Found test_file

Как видите, в середине строки есть символ табуляции. Это потому, что строка содержит '\ t'

Если я распечатываю test_file по той же причине, я также вижу:

D:\abcddev    oeblog\folderY\fileB.h

Это объясняет, почему поиск работает, когда я создаю строку вручную.

Итак, вопрос в том, как избежать символа \ t в строке test_file?

Обратите внимание, что любой код, который я пишу, также должен работать в Linux.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вы столкнулись с проблемами, поскольку обратная косая черта обозначает escape-символы . Например, \t - это вкладка, как вы обнаружили, но Python будет обрабатывать \a и \f как escape-символы. Оказывается, они обозначают звонок ASCII и подачу формы соответственно. Кто знал? Одним из решений является использование необработанных строк, обозначенных r перед кавычками строки, что не будет проверять escape-символы и будет обрабатывать обратную косую черту как обычный текст. В противном случае вам нужно написать \\, чтобы отобразить обратную косую черту sh.

Кроме того, os.path.normpath заменяет только прямые косые черты на обратные косые черты на Windows и не будет делать то, что вам нужно в Linux, поэтому вам также понадобится replace. В общем, если вам нужно выбрать все прямые или все обратные косые черты, go со всеми вперед, потому что Windows может обрабатывать прямые косые черты , в то время как другие ОС не могут обрабатывать обратные косые черты.

# Declare list    
ManualList = [r'D:\abcddev\toeblog/folderX/fileA.h',r'D:\abcddev\toeblog/folderY/fileB.h']
NormalizedFilePathList = []

# Add standardized slash separated lines to NormalizedFilePathList
for file in ManualList:
    NormalizedFilePathList.append (os.path.normpath(file.replace('\\', '/')))

# Display the contents of NormalizedFilePathList
for file in NormalizedFilePathList:
    print file

# Create the string to be searched for. 
# Use forward slashes in the string below to preserve compatibility for Linux. 
# normpath will convert them to backslashes on Windows.
test_file = os.path.normpath('D:/abcddev/toeblog/folderY/fileB.h')

# Search for the string in NormalizedPathFileList
if test_file in NormalizedFilePathList:
    print "Found test_file"
else:
    print "Did not find test_file"
0 голосов
/ 28 мая 2020

Как насчет удаления косой черты и сравнения?

def strip_slashes(path):
  return path.replace('/','').replace('\\','')

paths = ['D:\\p1\\p2/folderY/fileB.h','D:\\p1\\p2/folderX/fileA.h']
stripped_paths = [strip_slashes(p) for p in paths]
path_to_find_1 = 'D:\\p1\p2\\folderY\\fileB.h'
stripped_path_to_find_1 = strip_slashes(path_to_find_1)
path_to_find_2 = 'D:\\p1\p452\\folderY\\fileB.h'
stripped_path_to_find_2 = strip_slashes(path_to_find_2)


print('----------------')

print(stripped_path_to_find_1 in stripped_paths)
print(stripped_path_to_find_2 in stripped_paths)
...