изменить цифры в 1-м столбце - PullRequest
1 голос
/ 09 января 2011

Я знаю, что sed или awk могут решить эту проблему более элегантно, возможно.Но я пошел по пути Python, поэтому проблема в том, что я хотел бы изменить нумерацию первого столбца моего файла данных с 1 до # строк в файле.Это хорошая идея, чтобы прочитать файл с помощью readlines?Для небольших файлов, возможно, но больших файлов, я не думаю.Итак, вот что я придумала в качестве первой попытки, любые комментарии приветствуются.

#!/usr/bin/env python

import sys

try:
    infilename = sys.argv[1]; outfilename = sys.argv[2];
except:
    print "Usage is <script> inFile outFile"

ifile = open(infilename,'r')
ofile = open(outfilename, 'w')

lines = ifile.readlines();

i=1
for line in lines: 
    list = line.split();
    list[0] = i
    i += 1 
    for val in list:
        ofile.write("%d " % int(val))
    ofile.write('\n')
    del list

ifile.close()
ofile.close()

Ответы [ 5 ]

1 голос
/ 09 января 2011
#!/usr/bin/env python
import sys

try:
    ifile = open(sys.argv[1], 'r')
    ofile = open(sys.argv[2], 'w+')
except:
    print "Usage is <script> inFile outFile"
else:
    for i, line in enumerate(ifile, start=1):
        items = [str(i)] + line.split()[1:]
        ofile.write(' '.join(items) + '\n')

    ifile.close()
    ofile.close()

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

Далее, перечисление является удобным способом, позволяющим интерпретатору отслеживать индекс. В самом цикле я объединяю индекс перечисления и «фрагмент» строки чтения (все, кроме первого элемента). Затем я присоединяю их к пробелу и пишу их с новой строки.

Это ясно и коротко.

1 голос
/ 09 января 2011
with open(infilename,'r') as ifile:
    with open(outfilename, 'w') as ofile:
         for (nr, line) in enumerate(ifile):
             line = line.split()
             line[0] = nr
             line.append('\n')
             ofile.write(' '.join(line))
1 голос
/ 09 января 2011

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

#!/usr/bin/env python
import sys

try:
    # dont use ; !
    infilename = sys.argv[1]
    outfilename = sys.argv[2]
except:
    print "Usage is <script> inFile outFile"


# you could use `with` here if you have a Python 2.7
ifile = open(infilename,'r')
ofile = open(outfilename, 'w')

# no need to count yourself, enumerate does that
# plus when you iterate over a file you get lines too
for i, line in enumerate(ifile, start=1):
    # dont shadow builtins like `list`
    parts = line.split()
    parts[0] = i
    # join is the inverse function to split
    new_line = ' '.join("%d" % int(val) for val in parts)
    ofile.write(new_line + '\n')

ifile.close()
ofile.close()

@ Умут Табак: ("%d" % int(val) for val in parts) - это генераторное выражение , они похожи на ленивые списки. Он дает те же элементы, что и список ["%d" % int(val) for val in parts], но фактически не создает список.

Кстати, блок for может быть записан еще короче, но он немного отличается, потому что не гарантирует, что все строки больше int s:

for i, line in enumerate(ifile, start=1):
    parts = line.split()
    parts[0] = "%d" % i
    new_line = ' '.join(parts)
    ofile.write(new_line + '\n')
1 голос
/ 09 января 2011

Не делайте readlines() вообще, а вместо этого:

for line in ifile: 

Кроме того, избегайте именования переменных с именем list. Поскольку list() является встроенной функцией, вы скрываете это имя, что является плохой практикой.

Нет необходимости del локальной переменной, как вы сделали с del list; об этом автоматически заботится сборщик мусора Python. (В CPython сборщик мусора подсчитывается и детерминирован.)

0 голосов
/ 09 января 2011

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

for i,line in enumerate(ifile,1):
    first,remaining = line.split(' ',1)
    ofile.write("{0} {1}".format(i,remaining))

Кроме того, ваш except должен завершиться, иначе остальная часть файла запустится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...