2016-10-29 1 views
0

для скрининга файла я следующий код в двух разных каталогах:Python же скрипт открывает файлы, чтобы в одном директории, а не в другом

import os, re 

g=open('results_1.txt', 'w') #Other has 'results_2.txt' 

for filename in os.listdir('.'): 
    if filename.startswith("f"): 
     with open(filename, 'r') as f: 
      content =[line.rstrip() for line in f] 

     A = filter(lambda x: 'KeyWord_1 :' in x, content) 
     B = filter(lambda x: 'KeyWord_2 :' in x, content) 

     print >> g,filename, 

     for item in A: 
      print >> g,item, 
     for item in B: 
      print >> g,item, 

g.close() 

Оба каталоги имеют аналогичный файл (чтобы быть разобранной мой сценарий) Соглашение об именах , Поэтому файлы выглядят так: file_1000.txt, file_100.txt, file_101.txt, ....., file_1.txt, ...... file_9.txt.

Я изменяю сценарий только для изменения имени файла результатов. Но в одном каталоге файлы сортируются от _1 до _1000, а затем файл результатов имеет соответствующий порядок, а другой - нет. Зачем?

Прошу прощения, что это связано с моей работой, и я могу дать любую специфику.

P.S. Я попробовал отсортированную функцию, и она не работала так, как я хотел.

+1

Это потому, что 'os.listdir' является несортированным. Этот ответ может помочь: http://stackoverflow.com/questions/6773584/how-is-pythons-glob-glob-ordered/6773636#6773636 Также смотрите это: http://stackoverflow.com/questions/ 4813061/nonalphanumeric-list-order-from-os-listdir-in-python – RomanK

+0

Чтобы развернуть комментарий @ RomanK, вот официальная документация для ['os.listdir'] (https://docs.python.org/2 /library/os.html#os.listdir): * Список в произвольном порядке. * – UnholySheep

+0

Хорошо, поэтому, если я правильно понимаю, произвольным, мы должны понимать его как НЕ ДЕТЕРМИНИСТИЧЕСКИЙ! Таким образом, разница в одном каталоге предполагает, что произвольный порядок отличается от другого. Это может быть проблемой. Но все в порядке. – algoProg

ответ

1

От documentation on os.listdir:

Возвращает список, содержащий имена записей в каталоге заданной траектории. Список находится в произвольном порядке и не содержит специальных записей '.' и «..», даже если они присутствуют в каталоге.

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

def trailing_number(filename): 
    return int(filename.split('_')[1].rstrip('.txt')) 

sorted(os.listdir('.'), key=trailing_number) 

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

Смежные вопросы