Перебирая содержимое файла в Bash

На самом деле Python имеет абстрактные классы с методами abstact:

>>> import abc
>>> 
>>> class IFoo(object):
...     __metaclass__ = abc.ABCMeta
...     
...     @abc.abstractmethod
...     def foo(self):
...         pass
... 
>>> foo = IFoo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cant instantiate abstract class IFoo with abstract methods foo
>>> class FooDerived(IFoo):
...     pass
... 
>>> foo = FooDerived()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cant instantiate abstract class FooDerived with abstract methods foo
>>> class FooImplements(FooDerived):
...     def foo(self):
...         print "foo'ed"
... 
>>> foo = FooImplements()
>>> foo.foo()
foo'ed
>>> 

С другой стороны, основной вопрос "- это пифонический" немного сложнее сказать. Если вы намерены предоставить абстрактный базовый класс, чтобы позже вы могли проверить, чтобы значения наследовали от него, то нет, это не особенно pythonic, хотя можно сделать произвольные типы абстрактными подклассами вашего базового класса. С другой стороны, вполне нормально предоставлять абстрактный базовый класс, который реализует некоторые функции на основе реализации, предусмотренной в конкретных подклассах. Например, collections.Sequence и collections.Mapping делают это только для классов типа like и dict; подклассы могут предоставить __getitem__ и могут бесплатно получить __contains__ и другие.

Наверняка, вы никогда не должны использовать assert(), кроме как для документирования ожиданий кода; Если на самом деле возможно, что assert будет терпеть неудачу, вы не должны использовать assert. Оптимизированный питон (python -O script.py) не проверяет утверждения.

Edit: more exposition:

Если вы проверяете тип значения:

def foo(bar):
    if not isinstance(bar, AbstractBaz):
        raise ValueError, ("bar must be an instance of AbstractBaz, "
                           "got %s" % type(bar))

Если по какой-либо причине вы не можете использовать @abstractmethod, но все же хотите получить этот эффект, вы должны поднять NotImplementedError. Возможно, вы захотите сделать это, потому что вам действительно нужны экземпляры этого класса, некоторые из которых, возможно, не нуждаются в реализации дополнительных функций. Вы все равно должны учитывать возможность того, что функция была вызвана через super(). В первом приближении это может выглядеть так.

class Foo(object):
    def bar(self, baz):
        if self.bar.im_func == Foo.bar.im_func:
            raise NotImplementedError, "Subclasses must implement bar"
1162
задан iNet 19 June 2018 в 06:50
поделиться

4 ответа

Один из способов сделать это:

while read p; do
  echo "$p"
done <peptides.txt

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

while IFS="" read -r p || [ -n "$p" ]
do
  printf '%s\n' "$p"
done < peptides.txt

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

while read -u 10 p; do
  ...
done 10<peptides.txt

Здесь 10 - это просто произвольное число (отличное от 0, 1, 2).

1945
ответ дан 19 December 2019 в 20:14
поделиться

Это прибывает скорее очень поздно, но с мыслью, что это может помочь кому-то, я добавляю ответ. Также это не может быть лучшим способом. head команда может использоваться с -n аргумент для чтения n строки от запуска файла и аналогично tail, команда может использоваться для чтения из нижней части. Теперь, для выборки энный строка из файла мы возглавляем n строки , передаем данные по каналу для конца только 1 строки от переданных по каналу данных.

   TOTAL_LINES=`wc -l $USER_FILE | cut -d " " -f1 `
   echo $TOTAL_LINES       # To validate total lines in the file

   for (( i=1 ; i <= $TOTAL_LINES; i++ ))
   do
      LINE=`head -n$i $USER_FILE | tail -n1`
      echo $LINE
   done
1
ответ дан 19 December 2019 в 20:14
поделиться
cat peptides.txt | while read line 
do
   # do something with $line here
done

и вариант с одной строкой:

cat peptides.txt | while read line; do something_with_$line_here; done

Эти параметры пропустят последнюю строку файла, если нет перевода строки в конце.

Этого можно избежать, выполнив следующие действия:

cat peptides.txt | while read line || [[ -n $line ]];
do
   # do something with $line here
done
399
ответ дан 19 December 2019 в 20:14
поделиться

Вариант 1a: Цикл While: По одной строке за раз: Перенаправление ввода

#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do 
    echo $p
done < $filename

Вариант 1b: Цикл While: По одной строке за раз:
Откройте файл, прочтите из файлового дескриптора (в данном случае файлового дескриптора №4).

#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
    echo $p
done
139
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: