Как преобразовать эту функцию python, чтобы взять sys.argv [1] вместо sys.stdin? [Дубликат]

Для эффективного добавления см. . Как добавить дополнительную строку в набор данных pandas и с расширением .

Добавить строки через loc/ix в несуществующие данные индекса ключа. например :

In [1]: se = pd.Series([1,2,3])

In [2]: se
Out[2]: 
0    1
1    2
2    3
dtype: int64

In [3]: se[5] = 5.

In [4]: se
Out[4]: 
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64

Или:

In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2),
   .....:                 columns=['A','B'])
   .....: 

In [2]: dfi
Out[2]: 
   A  B
0  0  1
1  2  3
2  4  5

In [3]: dfi.loc[:,'C'] = dfi.loc[:,'A']

In [4]: dfi
Out[4]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
In [5]: dfi.loc[3] = 5

In [6]: dfi
Out[6]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5

55
задан Ryan R. Rosario 16 November 2009 в 22:32
поделиться

7 ответов

В простейших терминах:

import sys
# parse command line
if file_name_given:
    inf = open(file_name_given)
else:
    inf = sys.stdin

В этот момент вы должны использовать inf для чтения из файла. В зависимости от того, было ли задано имя файла, это будет считаться из данного файла или из stdin.

Когда вам нужно закрыть файл, вы можете сделать это:

if inf is not sys.stdin:
    inf.close()

, в большинстве случаев было бы безвредно закрыть sys.stdin, если вы закончите с ним.

50
ответ дан Greg Hewgill 24 August 2018 в 15:45
поделиться
  • 1
    Будет ли raw_input () и input () читать из inf? – thefourtheye 3 May 2013 в 13:54
  • 2
    @thefourtheye: Да, обе эти функции будут считываться либо из файла, либо из sys.stdin. – Greg Hewgill 3 May 2013 в 19:41
  • 3
    Я нашел другой способ решить эту проблему, я написал об этом здесь dfourtheye.blogspot.in/2013/05/… и добавил ответ на этот вопрос. – thefourtheye 4 May 2013 в 03:16

Мне нравится общая идиома использования диспетчера контекста, но (слишком) тривиальное решение заканчивается закрытием sys.stdin, когда вы находитесь вне оператора with, которого я хочу избежать.

Заимствование из этого ответа , это обходное решение:

import sys
import contextlib

@contextlib.contextmanager
def _smart_open(filename, mode='Ur'):
    if filename == '-':
        if mode is None or mode == '' or 'r' in mode:
            fh = sys.stdin
        else:
            fh = sys.stdout
    else:
        fh = open(filename, mode)
    try:
        yield fh
    finally:
        if filename is not '-':
            fh.close()

if __name__ == '__main__':
    args = sys.argv[1:]
    if args == []:
        args = ['-']
    for filearg in args:
        with _smart_open(filearg) as handle:
            do_stuff(handle)

Предположим, вы могли бы достичь чего-то подобного с os.dup() , но код I приготовленный до этого, оказался более сложным и более волшебным, тогда как выше было несколько неуклюже, но очень просто.

13
ответ дан Community 24 August 2018 в 15:45
поделиться
  • 1
    Большое спасибо! Именно этого я и искал. Очень четкое и прямолинейное решение. – edison 15 November 2017 в 14:43

Что-то вроде:

if input_from_file:
    f = open(file_name, "rt")
else:
    f = sys.stdin
inL = f.readline()
while inL:
    print inL.rstrip()
    inL = f.readline()
0
ответ дан GreenMatt 24 August 2018 в 15:45
поделиться

Не прямой ответ, но связанный.

Обычно, когда вы пишете скрипт python, вы можете использовать пакет argparse. ЕСЛИ это случай, который вы можете использовать:

parser = argparse.ArgumentParser()
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)

'?'. Один аргумент будет потребляться из командной строки, если это возможно, и создается как отдельный элемент. Если аргумент командной строки отсутствует, будет создано значение по умолчанию.

, и мы установили по умолчанию sys.stdin;

, так что если есть файл он будет читать, а если нет, то он будет принимать входные данные из stdin «Примечание: мы используем позиционный аргумент в приведенном выше примере»

для более подробной информации: https: // docs. python.org/2/library/argparse.html#nargs

1
ответ дан Medhat Helmy 24 August 2018 в 15:45
поделиться

Я предпочитаю использовать «-» в качестве индикатора, который вы должны прочитать из stdin, более явным:

import sys
with open(sys.argv[1], 'r') if sys.argv[1] is not "-" else sys.stdin as f:
    pass # do something here
6
ответ дан Phil L. 24 August 2018 в 15:45
поделиться
  • 1
    Ваше решение закроет sys.stdin, поэтому вызовы функций input после выполнения оператора with будут повышаться ValueError. – Timofei Bondarev 24 May 2015 в 15:42
  • 2
    @TimofeyBondarev Это может быть правдой .. но чаще всего вход используется только один раз в скрипте. Это полезная конструкция. – javadba 2 February 2016 в 06:52

Чтобы использовать инструкцию python with, можно использовать следующий код:

import sys
with open(sys.argv[1], 'r') if len(sys.argv) > 1 else sys.stdin as f:
    # read data using f
    # ......
8
ответ дан Roun 24 August 2018 в 15:45
поделиться
  • 1
    Ваше решение закроет sys.stdin, поэтому вызовы функций input после выполнения оператора with будут повышаться ValueError. – Timofei Bondarev 24 May 2015 в 15:42

Модуль fileinput может делать то, что вы хотите - если аргументы non-option находятся в args, тогда:

import fileinput
for line in fileinput.input(args):
    print line

Если args пуст, тогда fileinput.input() будет читать от stdin; в противном случае он читает из каждого файла по очереди, аналогично Perl while(<>).

68
ответ дан SimonJ 24 August 2018 в 15:45
поделиться
  • 1
    Это было так же хорошо, как ответ, но не настолько обобщаемо. Я буду помнить, что в следующий раз при необходимости буду использовать fileinput. – Ryan R. Rosario 30 November 2009 в 23:47
  • 2
    Он работает без args. – Gabriel 18 February 2015 в 04:53
  • 3
    Правильно, но если вы используете getargs (как OP), вы, вероятно, просто хотите передать оставшиеся аргументы, а не sys.argv[1:] (что является значением по умолчанию). – SimonJ 7 March 2015 в 23:51
  • 4
    fileinput - это странный и раздражающий API, он заставляет вас использовать помеченные аргументы в командной строке. – ctpenrose 8 May 2015 в 19:13
  • 5
    @ctpenrose Это не ошибка проектирования файловой системы: отличительные аргументы, являющиеся именами входных файлов из других аргументов, являются проблемой, присущей проблемному домену. Fileinput (особенно с argparse) упрощает использование общего шаблона для этого, который вы можете использовать или нет, но если есть другой способ сделать различие, вы можете отправить фрагмент sys.argv (или другой массив имен вообще) в fileinput.input () - и вам не нужно помещать поддельный sys.argv [0], когда вы явно передаете массив. – sdenham 26 January 2018 в 17:34
Другие вопросы по тегам:

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