2015-04-13 2 views
0

У меня есть список значений и вам нужно удалить возвращаемые возвраты каретки всякий раз, когда они встречаются в списке значений.Заменить возврат каретки в списке python

Формат файла, который я ищу, чтобы удалить их, выглядит следующим образом.

field1|field2|field3|field4|field5 
value 1|value 2|value 3|value 4|value 5 
value 1|value 2|value 3|value 4|value 5 
value 1|value 2|val 
ue 3|value 4|value 5 
value 1|value 2|value 3|va 
lue 4|value 5 

Я ищу для решения ситуации, как один выше, где есть заблудшие возвраты каретки в 3-е и 4-е величин в течение последних 2-х строк данных.

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

import os 
import sys 

filetoread = 'C:\temp\test.dat' 
filetowrite = 'C:\emp\test_updated.dat' 

''' 
Attempt 1 
''' 
with open(filetoread, "r+b") as inf: 
    with open(filetowrite, "w") as fixed: 
     for line in inf: 
      fixed.write(line) 


''' 
Attempt 2 
'''   
for line in filetoread: 
    line = line.replace("\n", "") 


''' 
Attempt 3 
''' 
with open(filetoread, "r") as inf: 
    for line in inf: 
     if "\n" in line: 
      line = line.replace("\n", "") 
+0

Вы либо не обработки перевода строки или обработки * все * пе wlines. Число постоянных разделителей '|' в каждой строке? Затем вы можете определить, когда нужно удалить новую строку. –

+3

И просто чтобы проверить, ваш CSV-файл не использует кавычки вокруг этих значений, правильно? Поскольку модуль 'csv' может * обрабатывать новые строки в цитируемых значениях *. –

+0

Одна из причин, по которой ваш код может не работать, - это пути, которые вы используете. Python читает одиночные \ символы как escape-последовательности, а '\ t' - символ табуляции. Итак, '' C: \ temp \ test.dat'' интерпретируется как ''C: emp est.dat''. Чтобы исправить это, используйте строковый литерал - положите 'r' непосредственно перед первой цитатой:' r'C: \ temp \ test.dat''. – MattDMo

ответ

0

Вы должны подсчитать количество полей, чтобы соответствовать 5 в каждой строке:

import re 
with open(filetoread, "r+b") as inf: 
    with open(filetowrite, "w") as fixed: 
     for l in re.finditer('(?:.*?\|){4}(?:.*?)\n', inf.read(), re.DOTALL): 
      fixed.write(l.group(0).replace('\n','') + '\n') 
0

Символ \ n - это линия передачи. \ Г возврат каретки:

http://www.asciitable.com/

http://en.cppreference.com/w/cpp/language/escape

Так,

> line.replace("\n", "") 

должен быть

line.replace("\r", "") 

Как проверить, если это действительно \ г один, или \ r \ n пара. Windows/DOS использует \ г \ п, Mac & Co использует \ г, Linux использует \ п в одиночку

0

Примечание: Я предполагаю, что у вас есть дополнительные переводы строк ('\n') не возврат каретки ('\r').

def remove_newlines_in_fields(data, ncols, sep): 
    sep_count = 0 
    for c in data: 
     if c == sep: 
      sep_count += 1 
     if c == '\n': 
      if sep_count == ncols - 1: 
       yield c 
       sep_count = 0 
     else: 
      yield c 

Также обратите внимание, что если у вас есть символы новой строки в правой колонке, это не будет работать должным образом. (Парциальное столбец будет добавлен к следующей строке.)

Здесь в действии:

>>> s = '''field1|field2|field3|field4|field5 
... value 1|value 2|value 3|value 4|value 5 
... value 1|value 2|value 3|value 4|value 5 
... value 1|value 2|val 
... ue 3|value 4|value 5 
... value 1|value 2|value 3|va 
... lue 4|value 5''' 
>>> print(''.join(remove_newlines_in_fields(s, 5, '|'))) 
field1|field2|field3|field4|field5 
value 1|value 2|value 3|value 4|value 5 
value 1|value 2|value 3|value 4|value 5 
value 1|value 2|value 3|value 4|value 5 
value 1|value 2|value 3|value 4|value 5 
0

Ниже будут удалены все символы возврата каретки, встроенные в каждое поле:

with open(filetoread, "rb") as inf: 
    with open(filetowrite, "w") as fixed: 
     for line in (line.rstrip() for line in inf): 
      fields = (field.replace('\r', '') for field in line.split('|')) 
      fixed.write('|'.join(fields) + '\n') 
Смежные вопросы