Как удалить CRLF в указанной строке c с помощью al oop в Python - PullRequest
0 голосов
/ 29 мая 2020

У меня есть такой файл:

"Headers1"|"Headers2"|"Headers3"|"Headers4"(CR LF)
"Line1"|"Line1"|"Line1"|"Line1"(CR LF)
"Line2"|"Line2"|"Line2"|"Line2"(CR LF)
"Line3"|"Line3Column2 (CR LF)
Line3Column2 (CR LF)"|"Line3 Column3 (CR LF)
Line3 Column3"|"Line2"(CR LF)
"Line4"|"Line4"|"Line4"|"Line4"(CR LF)

Я хочу удалить CRLF в строке 3, 4, чтобы строка 5 была в строке 4, а строка 4 - в строке 3.

НО я не хочу удалять CRLF в строке 5, иначе моя строка 3 и моя строка 4 будут в одной строке ...

Наконец, я хочу:

"Headers1"|"Headers2"|"Headers3"|"Headers4"(CR LF)
"Line1"|"Line1"|"Line1"|"Line1"(CR LF)
"Line2"|"Line2"|"Line2"|"Line2"(CR LF)
"Line3"|"Line3Column2 (̶C̶R̶L̶F̶) Line3Column2 (̶C̶R̶L̶F̶) "|"Line3 Column3 (̶C̶R̶L̶F̶) Line3 Column3"|"Line3"(CR LF)
"Line4"|"Line4"|"Line4"|"Line4"(CR LF)

Я пытался сделать al oop (когда у меня есть строка с номером канала <заголовок, я удаляю его CRLF, а затем перезапускаю его с самого начала), но это не работает ... </p>

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Вы можете использовать модуль csv для чтения строк и делать все, что захотите, а затем записывать их обратно.

import csv

with open('old_file.csv') as f:
    reader = csv.DictReader(f, delimiter='|')
    with open('new_file.csv', 'w') as wf:
        writer = csv.DictWriter(wf, reader.fieldnames, delimiter='|')
        for row in reader:
            writer.writerow({h: v.replace('\r\n', '') for h, v in row.items()})
0 голосов
/ 29 мая 2020

Вы можете использовать что-то вроде этого:

def clean_up(lines):
    clean_lines = []
    for line in lines:
        cols = line.split('|')
        replaced_except_last = (col.replace('\r\n', '') for col in cols[:-1])
        cols[:-1] = replaced_except_last
        # join them back or do anything you want
        clean_lines.append('|'.join(cols))
    return clean_lines

Идея состоит в том, что мы заменим ненужные CRLF во всех столбцах, кроме последнего.

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

def clean_up(lines):
   for line in lines:
       cols = line.split('|')
       cols[:-1] = (col.replace('\r\n', '') for col in cols[:-1])
       yield '|'.join(cols) # if you want to get the list, "yield cols"

, а затем вы используете его как

with open('filename') as file:
    # the file will be passed in line-by-line
    for clean_line in clean_up(file):
        print(clean_line)
...