2017-01-27 2 views
0

У меня есть следующий код, и я просто хочу, чтобы он записывал список в файл. Он делает это, но с пустой строкой каждый раз, что вызывает проблемы с каждой итерацией!Запись списка в файл без новой строки Python

with open("films.txt", mode='r') as f: 
allfilms=[] 

reader = csv.reader(f) 
for row in reader: 
    #create a list again which reads in and stores all films in the file 

    allfilms.append(row) 
    print(allfilms) 


with open("films.txt","w") as f: 
    writer=csv.writer(f) 
    writer.writerows(allfilms) 

Выход: 0, жанр, название, рейтинг, Любит

1,Sci-Fi,Out of the Silent Planet, PG, 0 

    2,Sci-Fi,Solaris, PG,0 

    3,Sci-Fi,Star Trek, PG, 0 

    4,Sci-Fi,Cosmos, PG, 0 

Как уже упоминалось, я не хочу пустую строку при сохранении списка. Кроме того, меня бы интересовали более элегантные или лучшие способы сделать то же самое. Я хочу, чтобы файл был READ в списке, а затем записывался обратно в файл ТОЧНО то же самое, с точки зрения форматирования, как то, что было сохранено в файле.

Заранее спасибо

+4

попробовать с помощью 'allfilms.append (строку.strip ('\ n') ' – davedwards

+1

Возможный дубликат [Suppress linebreak on file.write] (http://stackoverflow.com/questions/1826400/suppress-linebreak-on-file-write) – MaLiN2223

+1

Какая версия Python вы с помощью? В Python 2 модуль CSV ожидает, что файлы будут открыты в двоичном режиме. В Python 3 вам нужно, чтобы выходной файл был открыт с параметром 'newline =" "', чтобы он работал правильно. – Blckknght

ответ

1

Изменить: Я не понял, как модуль CSV дал выводу, когда я писал этот ответ, но я не вынимая его из-за полезный комментарий по пониженному на нем. См. Мой более свежий и более точный ответ.

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

Когда вы читаете каждую строку из csv-считывателя, она дает вам целую строку, которая включает символ новой строки (\n) в конце. Ваша проблема связана с тем, что при записи в файл функция записи добавляет собственный символ новой строки в конец строки. К счастью, есть два очень простых способа удалить символ новой строки из конца строки, которую вы возвращаете из csv-считывателя.

Один из способов - использовать метод строки .strip(), который принимает некоторые символы в виде строки в качестве входных данных и полоски из числа таких символов, насколько это возможно, с концов строки. С помощью этого метода можно заменить:

allfilms.append(row) 

с

allfilms.append(row.strip("\n")) 

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

allfilms.append(row) 

с

allfilms.append(row[:-1]) 

row[:-1] вернется строка с последним символом исключена, отбрасывая символ новой строки.

Надеюсь, это помогло вам!

+0

Очень полезное объяснение, спасибо. Однако объект AttributeError: 'list' не имеет атрибута 'strip' .... это сообщение об ошибке, которое возникает при использовании того, что вы предложили с помощью row.strip ("\ n")). Сказав это, ваше второе предложение BlueCode работало! Итак, спасибо –

+0

Интересно, что allfilms [3] создает третью строку в списке. Однако мне нужно знать, как попасть в четвертое поле в третьей строке, если это имеет смысл. Я попробовал allfilms [3] [4], но придумал ошибку: «Список индекса вне диапазона». Есть предположения? –

+1

@pythoncarrot, просто предлагая свои мысли, пока BluCode не сможет ответить. Списки в python обычно нуль-индексируются (это означает, что они начинаются с нуля для первого элемента), поэтому индекс списка за пределами диапазона указывает, что индекс больше, чем тот, который доступен ..meaning 'allfilms [2] [3]' должен указывать к третьей строке, 4-м индексу. Подумайте об этом, чтобы обойти эту ошибку. – davedwards

0

Я считаю, что источником вашей проблемы является то, что когда вы открыли films.txt, вы забыли указать аргумент newline='', как говорят docs. Это означает, что ваш код становится:

with open("films.txt", mode='r', newline='') as f: 

и

with open("films.txt", mode='w', newline='') as f: 
Смежные вопросы