LINUX.ORG.RU

Python проблема с if not any

 


1

1

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

#!/bin/env python
#coding:utf-8

import os
import shutil

pathin = ['/opt/nexus/sonatype-work/nexus/storage/releases/features/']

for i in pathin:
    dirs = [s for s in os.listdir(i) if os.path.isdir(os.path.join(i, s))]
    dirs.sort(key=lambda s: os.path.getmtime(os.path.join(i, s)), reverse=True)
    for j in dirs[10:]:
#        shutil.rmtree(i + j)
         pass
    dest_file = i + 'maven-metadata.xml'
    f = open(dest_file, 'r')
    lines = f.readlines()
    f.close()
    for line in lines:
        if not any (dirs in line for dirs in dirs):
            print line
#           f.write(line)

Очевидно, что где-то накосячил, но где - не понимаю.


if not any (dirs in line for dirs in dirs):

Мне вот это подозрительным кажется. Может

if not any (dir in line for dir in dirs):
?

Psych218 ★★★★★
()

Конечно в строке с if not any косяк, как тебе уже сказали P.S. пиши any(), а не any, это не кейворд, а метод

anonymous
()
Ответ на: комментарий от Psych218

поправил, но что характерно эффекта не возымело.

gadzira
() автор топика
Ответ на: комментарий от gadzira
any(iterable)

И вообще по возможности используй нормальный дебаггер, лучше графический. Так ты быстрее найдешь место, в котором у тебя косяк (в частности проверь dirs и lines во время выполнения)

anonymous
()
Ответ на: комментарий от gadzira

Это как?

без пробела перед скобкой. Это функция, а не ключевое слово. Но на работоспособность не влияет.

По теме: а как у тебя lines[:5] выглядит перед циклом этим? Может оно как-то одной строкой записано в файле и прочитано так же, или ещё чего?

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Примерно так

  • <?xml
  • <meta
  • <gr
  • <ar
  • <ve
  • <
  • <
  • <
  • </v
  • </met
gadzira
() автор топика

Запусти под pdb: python -m pdb path/to/file.py и посмотри что не так. В конце концов принтами можно отлаживать.

Kilte ★★★★★
()
Ответ на: комментарий от Psych218

Если запускать как есть, то вывод такой:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>XXX</groupId>
  <artifactId>YYYY</artifactId>
  <versioning>
    <versions>
    </versions>
    <lastUpdated>20161107144728</lastUpdated>
  </versioning>
</metadata>

gadzira
() автор топика
Ответ на: комментарий от qI__Ip

Очень странно, на соседнем сервера все отработало корректно, на целевом - нет.

gadzira
() автор топика

есть ли в файле директории, которых нет в i, и соответственно в dirs?

    for line in lines:
        if not any (dirs in line for dirs in dirs):

в этом коде ты оставил только строки, в которых нет подстрок из dirs. возможно, это не то, что ты хотел, судя по for j in dirs[10:]:

hatefu1_dead
()
Ответ на: комментарий от hatefu1_dead

Да, ты прав, натупил со списком.

gadzira
() автор топика
Ответ на: комментарий от Bsd-un

Почти, да. В итоге это приобрело такой вид:

#!/bin/env python
#coding:utf-8

import os
import shutil

pathin = ['/opt/nexus/sonatype-work/nexus/storage/releases/features/']

for i in pathin:
    dirs = [s for s in os.listdir(i) if os.path.isdir(os.path.join(i, s))]
    dirs.sort(key=lambda s: os.path.getmtime(os.path.join(i, s)), reverse=True)
    for j in dirs[10:]:
        shutil.rmtree(i + j)

    dest_file = os.path.join(i, 'maven-metadata.xml')
    f = open(dest_file, 'r')
    lines = f.readlines()
    f.close()

    f = open(dest_file, 'w')
    for line in lines:
        if not any(d in line for d in dirs[10:]):
            f.write(line)

Собственно, рад буду замечаниям по улучшению. И если кому-то нужно чистить старые сборки мавена - то вот это может делать это за вас.

gadzira
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.