Удаление определенных столбцов каждой строки

1

Я новичок в python, и сейчас у меня нет идей. Что я пытаюсь: я получил файл

пример:

254   578       name1      *--21->28--*      secname1
854   548       name2      *--21->28--*      secname2
944   785       name3      *--21->28--*      secname3
1025  654       name4      *--21->28--*      secname4

между этими файлами много пробелов, и я не хочу удалять определенные пробелы между "name *" и "secname *" для каждой строки. Я не знаю, что делать, как показано в примере, удалите символ/пробелы 21 → 28

Что я получил до сих пор:

fobj_in = open("85488_66325_R85V54.txt")
fobj_out = open("85488_66325_R85V54.txt","w")

for line in fobj_in:



fobj_in.close()
fobj_out.close()

В конце он должен выглядеть так:

254   578       name1            secname1
854   548       name2            secname2
944   785       name3            secname3
1025  654       name4            secname4
  • 0
    Для чего вы используете fobj_out ?
  • 0
    Я использую его для записи в файл, в другой функции я использовал его как "fobj_out.write (str (i) +": "+ line)"
Показать ещё 1 комментарий
Теги:

6 ответов

3
Лучший ответ

Чтобы удалить символы по определенным позициям индекса, вы должны использовать нарезку

for line in open('85488_66325_R85V54.txt'): 
    newline = line[:21] + line[29:]
    print(newline)

удаляет символы в столбце 21:28 (это все пробелы в вашем примере)

  • 0
    Спасибо, после выполнения вашего кода он выглядит хорошо в оболочке. Но после того, как я отредактировал код для записи его в файл, файл был пустым: fobj_in = open("file.txt") fobj_out = open("file.txt","w") for line in fobj_in: newline = line[:213] + line[243:] fobj_out.write(newline) fobj_in.close() fobj_out.close()
  • 1
    возможно, используйте параметр «а» вместо «w». Значения будут open("file.txt","w") если вы используете open("file.txt","w") . Используйте open("file.txt","a")
Показать ещё 2 комментария
2

Просто разделите строку и нажмите элемент, который вам не нужен.

fobj_in = open('85488_66325_R85V54','r')
fobj_out = open('85488_66325_R85V54.txt', 'a')
for line in fobj_in:
     items = line.split()
     items.pop(3)
     fobj_out.write(' '.join(items)+'\n')
fobj_in.close()
fobj_out.close()
1

Если имена имеют разную длину и вы не хотите просто удалить заданное количество пробелов между ними, вы можете искать пустые символы, чтобы найти, где начинается sname и name заканчивается:

# open file in "read" mode
fobj_in = open("85488_66325_R85V54.txt", "r")

# use readlines to create a list, each member containing a line of 85488_66325_R85V54.txt 
lines = fobj_in.readlines()

# For each line search from the end backwards for the first " " char
# when this char is found create first_name which is a list containing the
# elements of line from here onwards and a second list which is the elements up to
# this point. Then search for a non " " char and remove the blank spaces.
# remaining_line and first_name can then be concatenated back together using
# + with the desired number of spaces between then (in this case 12).
for line_number, line in enumerate(lines):
    first_name_found = False
    new_line_created = False
    for i in range(len(line)):
        if(line[-i] is " " and first_name_found is False):
            first_name = line[-i+1:]
            remaining_line = line[:-i+1]
            first_name_found = True
            for j in range(len(remaining_line)):
                if(remaining_line[-j-1] is not " " and new_line_created == False):
                    new_line = remaining_line[0:-j]+ " "*12 + first_name
                    new_line_created = True
                    lines[line_number] = new_line

то просто напишите lines до 85488_66325_R85V54.txt.

  • 0
    Моей целью было не просто удалить все пробелы между name1 и secname1. Например .. между имя1 и secname1 40 пространств и я хочу , чтобы удалить 15 пространства вниз из 40 мест. (Если вы посмотрите на эту картину, вы видите синий отмеченные пробелы и я хотел, чтобы удалить картинку
  • 0
    Так это всегда 15 пробелов, которые вы хотите удалить из каждой строки?
Показать ещё 1 комментарий
1

Вы можете просто использовать метод split на строковый объект, например:

f = open('my_file.txt', 'r')
data = f.readlines()
final_data = []
for line in data:
    bits = line.split()
    final_data.append([bits[0], bits[1], bits[2], bits[4]])

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

1

Я могу предложить надежный метод для коррекции входной строки.

#!/usr/bin/env ipython
# -----------------------------------
line='254   578       name1      *--21->28--*      secname1';
# -----------------------------------
def correctline(line,marker='*'):
    status=0;
    lineout='';
    for val in line:
        if val=='*': 
            status=abs(status-1);continue
        if status==0:
            lineout=lineout+val;
        elif status == 1:
            lineout=lineout
    # -----------------------------------
    while lineout.__contains__('  '):
        lineout=lineout.replace('  ',' ');
    return lineout
# ------------------------------------
print correctline(line)

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

-1

Вы можете попытаться сделать это следующим образом:

for line in fobj_in: setstring = line print(setstring.replace(" ", "")

  • 1
    да, но мне нужно определить, что я хочу заменить, думаю, это уберет все пробелы в моем документе

Ещё вопросы

Сообщество Overcoder
Наверх
Меню