Для эффективного добавления см. . Как добавить дополнительную строку в набор данных 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
В простейших терминах:
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
, если вы закончите с ним.
Мне нравится общая идиома использования диспетчера контекста, но (слишком) тривиальное решение заканчивается закрытием 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 приготовленный до этого, оказался более сложным и более волшебным, тогда как выше было несколько неуклюже, но очень просто.
Что-то вроде:
if input_from_file:
f = open(file_name, "rt")
else:
f = sys.stdin
inL = f.readline()
while inL:
print inL.rstrip()
inL = f.readline()
Не прямой ответ, но связанный.
Обычно, когда вы пишете скрипт python, вы можете использовать пакет argparse
. ЕСЛИ это случай, который вы можете использовать:
parser = argparse.ArgumentParser()
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
'?'. Один аргумент будет потребляться из командной строки, если это возможно, и создается как отдельный элемент. Если аргумент командной строки отсутствует, будет создано значение по умолчанию.
blockquote>, и мы установили по умолчанию
sys.stdin
;, так что если есть файл он будет читать, а если нет, то он будет принимать входные данные из stdin «Примечание: мы используем позиционный аргумент в приведенном выше примере»
для более подробной информации: https: // docs. python.org/2/library/argparse.html#nargs
Я предпочитаю использовать «-» в качестве индикатора, который вы должны прочитать из stdin, более явным:
import sys
with open(sys.argv[1], 'r') if sys.argv[1] is not "-" else sys.stdin as f:
pass # do something here
sys.stdin
, поэтому вызовы функций input
после выполнения оператора with
будут повышаться ValueError
.
– Timofei Bondarev
24 May 2015 в 15:42
Чтобы использовать инструкцию python with
, можно использовать следующий код:
import sys
with open(sys.argv[1], 'r') if len(sys.argv) > 1 else sys.stdin as f:
# read data using f
# ......
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(<>)
.
getargs
(как OP), вы, вероятно, просто хотите передать оставшиеся аргументы, а не sys.argv[1:]
(что является значением по умолчанию).
– SimonJ
7 March 2015 в 23:51
sys.stdin
. – Greg Hewgill 3 May 2013 в 19:41