2013-07-15 3 views
4

То, что я искал, не сработало, поэтому я обращаюсь к экспертам!Как удалить возврат каретки из текстового файла с помощью Python?

У меня есть текст в текстовом файле с разделителями с табуляцией, который имеет в нем какой-то возврат каретки (когда я открываю его в Notepad ++ и использую «показать все символы», я вижу [CR] [LF] в конце линии). Мне нужно удалить это возвращение каретки (или что бы то ни было), но я не могу понять это. Вот фрагмент из текстового файла, показывающий линию возврата каретки:

firstcolumn secondcolumn third fourth fifth sixth  seventh 
moreoftheseventh  8th    9th 10th 11th 12th     13th 

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

with open(infile, "r") as f: 
    for line in f: 
     if "\n" in line: 
      line = line.replace("\n", " ") 

Мои сценарий просто не находит возврат каретки. Я что-то делаю неправильно или неверно полагаю, что это возвращение каретки? Я мог бы просто удалить его вручную в текстовом редакторе, но в текстовом файле содержится около 5000 записей, которые могут также содержать эту проблему.

Дополнительная информация: Целью здесь является выбор двух столбцов из текстового файла, поэтому я разбиваю на символы \ t и ссылаюсь на значения как части массива. Он работает на любой строке без возврата, но не работает на линиях с возвратами, потому что, например, в этих строках нет элемента 9.

vals = line.split("\t") 
print(vals[0] + " " + vals[9]) 

Таким образом, для строки текста выше этот код не работает, потому что в этом конкретном массиве нет индекса 9. Для строк текста, которые не имеют [CR] [LF], он работает так, как ожидалось.

+0

Попробуйте поискать «\ г \ п ", который является возвратом каретки для окон. – rantanplan

+1

Вы записываете строки обратно в файл? – ovgolovin

+0

Не удалось выполнить поиск \ r \ n. – mrcoulson

ответ

3

Технически, есть ответ!

with open(filetoread, "rb") as inf: 
    with open(filetowrite, "w") as fixed: 
     for line in inf: 
      fixed.write(line) 

Б в open(filetoread, "rb") по-видимому, открывает файл таким образом, что я могу получить доступ к этим разрывы строк и удалить их. Этот ответ на самом деле пришел от пользователя Stack Overflow Kenneth Reitz с сайта.

Спасибо всем!

1

В зависимости от типа файла (и ОС он исходит и т. Д.), Ваш возврат каретки может быть '\r', '\n', или '\r'\n'. Лучший способ избавиться от них, независимо от того, какой из них он использует, - это использовать line.rstrip().

with open(infile, "r") as f: 
    for line in f: 
     line = line.rstrip() # strip out all tailing whitespace 

Если вы хотите избавиться только от возврата каретки, а не какие-либо дополнительные пробелов, которые могут быть в конце концов, вы можете поставить дополнительный аргумент rstrip:

with open(infile, "r") as f: 
    for line in f: 
     line = line.rstrip('\r\n') # strip out all tailing whitespace 

Надеется, что это помогает

0

Python открывает файлы в так называемом universal newline mode, поэтому строки новой строки всегда \n.

Python обычно построен с универсальной поддержкой новых линий; Поставка 'U' открывает файл в виде текстового файла, но строки могут быть прерваны любым из следующим: соглашение о конце строки '\ n', соглашение Macintosh '\ r' или Windows конвенция '\ r \ n'. Все эти внешние представления видны как «\ n» программой Python.

Вы перебираете файл по строкам. И вы заменяете \n в строках. Но на самом деле нет \n, потому что строки уже разделены \n итератором, и каждая строка не содержит \n.

Вы можете просто прочитать из файла f.read().А затем замените в нем \n.

with open(infile, "r") as f: 
    content = f.read() 
    content = content.replace('\n', ' ') 
    #do something with content 
+0

Должен ли я по-прежнему иметь доступ к контенту, подобному этому? для строки в содержании: – mrcoulson

+0

@mrcoulson No. Все новые строки будут заменены на '' ''. – ovgolovin

+0

Непонятно, как вы хотите сохранить линии и удалить [CR] [LF]. – ovgolovin

1

Я собираюсь закрыть это. Кто-то дал мне знать, если это не правильный способ закрыть вопрос. Я понимаю, что я исхожу из совершенно неправильного угла. Даже если бы я мог удалить возврат каретки, я бы закончил с одной длинной строкой вместо 5000 строк.

Благодаря всем ответам. В любом случае, я узнал кое-что. Извините, что потерял время!

+0

Да! Ты прав. Вот почему никто не мог дать хороший ответ, потому что никто не мог понять, чего вы хотите достичь (вы хотели бы удалить символы новой строки и по-прежнему иметь выделенные строки). Я думаю, вы можете переформулировать вопрос. Просто будьте более точными, чего вы хотите достичь, покажите описательный фрагмент входного файла со всеми функциями ваших файлов, покажите желаемый результат и то, что вы пробовали. Я думаю, что люди смогут здесь помочь. Потому что теперь вопрос довольно запутан. – ovgolovin

0

Я создал код, чтобы сделать это, и это работает:

end1='C:\...\file1.txt' 
end2='C:\...\file2.txt' 
with open(end1, "rb") as inf: 
    with open(end2, "w") as fixed: 
     for line in inf: 
      line = line.replace("\n", "") 
      line = line.replace("\r", "") 
      fixed.write(line) 
0

Вот как удалить возврат каретки без использования временного файла:

with open(file_name, 'r') as file: 
    content = file.read() 

with open(file_name, 'w', newline='\n') as file: 
    file.write(content) 
Смежные вопросы