2017-02-17 18 views
0
with open(filename, "r") as f: 
    for line in f: 
     line = (' '.join(line.strip().split())).split() 

Может ли кто-нибудь сломать линию, где удаляются пробелы? Я понимаю line.strip(). Split() сначала удаляет передние и конечные пробелы от line, после чего полученная строка получает разделение на пробелы и сохраняет все слова в списке.Удаляет пробелы во время чтения в файле

Но что делает оставшийся код?

+0

Можете ли вы привести пример ввода и вывода вы хотите иметь? Вы пытаетесь удалить ВСЕ пробелы из строки или просто в начале/конце? – Scovetta

+0

Я читаю код, написанный кем-то еще, и пытаюсь понять, что делает эта строка кода. Ввод - это .dat-файл, содержащий несколько строк целых чисел. – LearningToCode

ответ

0

Строка ' '.join(line.strip().split()) создает string, состоящую из всех элементов списка, разделенных ровно одним символом пробела. Применение метода split() в этой строке снова возвращает список, содержащий все слова в строке, которые были разделены пробельным символом.

+0

Спасибо за ответ. Может это просто line.strip(). Split()? join и split() снова, похоже, не изменят конечный результат. – LearningToCode

+0

Да, код в основном избыточен. @LearningToCode – Jarvis

0

Вот расстройство:

# Opens the file 
with open(filename, "r") as f: 
    # Iterates through each line 
    for line in f: 
     # Rewriting this line, below: 
     # line = (' '.join(line.strip().split())).split() 

     # Assuming line was " foo bar quux " 
     stripped_line = line.strip()  # "foo bar quux" 
     parts = stripped_line.split() # ["foo", "bar", "quux"] 
     joined = ' '.join(parts)   # "foo bar quux" 
     parts_again = joined.split()  # ["foo", "bar", "quux"] 

Это то, что вы искали?

+0

Спасибо за ответ. Это то, о чем я просил. Мне кажется, что последние два шага являются излишними. – LearningToCode

0

Этот код бесцельно сложный - это то, что есть.

Там нет необходимости strip, если ты не-Arg split не ИНГИ следующий (без аргументов split капли начальных и конечных пробелов по побочному эффекту), поэтому line.strip().split() может упростить line.split().

join и повторно split не меняет вещь, join прилипает первый split вместе с пробелами, то split перерасщепленые пары на тех же самых пространствах. Таким образом, вы можете сэкономить время, затрачиваемое join ИНГ только split и просто сохранить оригинальные результаты от первого split, изменяя его:

line = line.split() 

и было бы функционально идентичен оригиналу:

line = (' '.join(line.strip().split())).split() 

и быстрее загружаться. Я предполагаю, что код, которым вы были переданы, был написан кем-то, кто не понимал split ing и join ing, и just threw stuff at their problem without understanding what it did.

+0

Благодарим вас за объяснения. – LearningToCode

-1

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

+0

Woa. Почему downvote –

+0

Ну, во-первых, пробелы, которые они добавили назад, удаляются во втором 'split', поэтому никакие пробелы не« поддерживаются », не говоря уже о« постоянной »сумме (что бы это ни значило: разделенные начальные и конечные пробелы означают даже количество пробелов пробела не сохраняется в конце концов). – ShadowRanger

0

Вот объяснение кода: -

with open(filename, "r") as f: 
    for line in f: 
     line = (' '.join(line.strip().split())).split() 

Первый line.strip() удаляет начальные и конечные пробелы из строки и .split() перерыва в список на основе белых пространств.

Снова .join конвертировать предыдущий список в строку пробела. Наконец .split снова преобразует его в список.

Этот код является излишним line = (' '.join(line.strip().split())).split().И это должно быть: -

line = line.split() 

Если вы снова хотите strip использования: -

line = map(str.strip, line.split()) 
+0

Нет-arg 'split' неявно' strip ', нет причин запускать его через' map (str.strip', потому что каждый результат из 'split' не будет иметь ни одного ведущего или конечного пробела. Аналогично,' strip' до того, как «бездепозитный» беспорядок является излишним. – ShadowRanger

+0

@ShadowRanger thanks –