Как удалить более одного пробела при чтении текстового файла

#python #python-3.x #csv

#python #python-2.7 #csv

Вопрос:

Проблема: кажется, я не могу проанализировать информацию в текстовом файле, потому что python считывает ее как полную строку, а не отдельные отдельные строки. Пробелы между каждой переменной не являются t, поэтому они не разделяются. Есть ли способ для python гибко удалять пробелы и ставить вместо них запятую или t ?

Пример ДАННЫХ:

 MOR125-1   MOR129-1   0.587
MOR125-1   MOR129-3   0.598
MOR129-1   MOR129-3   0.115
  

Код, который я использую:

 with open("Distance_Data_No_Bootstrap_RAW.txt","rb") as f:
reader = csv.reader(f,delimiter="t")
d=list(reader)
for i in range(3):
    print d[i]
  

Вывод:

['MOR125-1 MOR129-1 0.587']
['MOR125-1 MOR129-3 0.598']
['MOR129-1 MOR129-3 0.115']

Желаемый результат:

 ['MOR125-1', 'MOR129-1', '0.587']
['MOR125-1', 'MOR129-3', '0.598']
['MOR129-1', 'MOR129-3', '0.115']
  

Комментарии:

1. Измените разделитель на пробел и избавьтесь от лишних пробелов с помощью строкового метода .strip()

2. Если я изменю разделитель на пробел, все одиночные пробелы, существующие в строке, превратятся в запятые. На этом этапе это список со строками и пробелами, разделенными запятыми. Я не уверен, как бы я выполнил .strip() для удаления пробелов, если это не полный список

Ответ №1:

Вы можете просто объявить разделитель пробелом и попросить csv пропустить начальные пробелы после разделителя. Таким образом, ваш разделитель фактически является регулярным выражением ' ' , то есть одним или несколькими пробелами.

 rd = csv.reader(fd, delimiter=' ', skipinitialspace=True)
for row in rd:
    print row
  
 ['MOR125-1', 'MOR129-1', '0.587']
['MOR125-1', 'MOR129-3', '0.598']
['MOR129-1', 'MOR129-3', '0.115']
  

Ответ №2:

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

 reader = csv.reader(f, delimiter=" ", skipinitialspace=True)
  

Для получения подробной информации о доступных параметрах проверьте документы Python:

Dialect.delimiter Односимвольная строка, используемая для разделения полей. По умолчанию используется значение ‘,’. Dialect.skipinitialspace При значении True пробел, следующий сразу за разделителем, игнорируется. Значение по умолчанию равно False .