Python записывает строку максимум в одну строку в текстиле

У меня есть кадр данных, который можно скачать здесь. Первый столбец содержит вопрос, а второй столбец содержит ответы на этот вопрос.

Моя цель: создать два файла .txt, один из которых содержит вопросы, а другой — ответы.

Каждый вопрос и ответ должны быть написаны в отдельной строке. Таким образом, строка 50 в каждом файле .txt содержит 50-й вопрос и 50-й ответ. (То есть, если файлы рекомбинируются, пары вопросов/ответов совпадают)

Фрагмент кода ниже открывает текстовый файл, записывает каждую строку столбца в этот файл и удаляет все \n. Кажется, он работает примерно для 96% строк, но очень редко он записывает одну строку DF в несколько строк текста.

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

f = open("Answers.txt","a", newline="\n",encoding='utf-8')
for i in tqdm(data['answers_body']):
        line =  i.replace('\n','')
        f.write(line)
        f.write("\n")

Интересно, что если я удалю f.write и просто выведу на консоль, все будет работать, как и ожидалось... проблема возникает только во время процесса записи.


person F.D    schedule 21.06.2018    source источник
comment
Это потому, что он читает строку, но вам нужно добавить новую строку в файл, чтобы он писал на новой строке лучше идти file.write(line+'\n')   -  person ThunderHorn    schedule 21.06.2018
comment
Он уже делает это со вторым f.write(\n), верно? Я попробовал ваше предложение, и проблема все еще возникает.   -  person F.D    schedule 21.06.2018
comment
Укажите здесь пару строк из файла, включая оскорбительную строку в вашем образце.   -  person Mad Physicist    schedule 22.06.2018


Ответы (3)


Обновление: полная версия с 1001 строкой.

import csv

data = []
with open('SO_dataset.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile)
    for row in spamreader:
        print ', '.join(row)
        data.append((row[2] if len(row)> 2 else ''))

f = open("Answers.txt", "w")
i = 0
for line in data:
    i += 1
    line =  line.replace('\n',' ')
    f.write(str(i) + '. ' + line)
    f.write("\n")
f.close

На самом деле, ваш исходный код выглядит нормально. Если вы говорите о текстовом файле, разбивайте строку и переносите на следующую строку, это свойство Блокнота ... Если вы вводите их в слово или excel, они должны быть в порядке без разрыва строки.

person MT-FreeHK    schedule 21.06.2018
comment
Это в дополнение к replace('\n','') или вместо? - person F.D; 21.06.2018
comment
Кроме того, я когда-то уже обрабатывал эту ситуацию, иногда двойная кавычка может считаться следующей строкой. Не только кавычки, может даже запятая. Взгляните на programminghistorian.org/en/lessons/working-with-text-files. файлы - person MT-FreeHK; 21.06.2018
comment
Таким образом, это должно быть line.replace('\n',''), затем line.replace('','\\'). К сожалению, похоже, это не помогает... - person F.D; 21.06.2018
comment
@F.D Я делаю полную версию, которая работает, у вас есть 1001 строка данных, а в результате тоже 1001 строка. - person MT-FreeHK; 22.06.2018

Это потому, что он читает строку, и именно поэтому он печатает строку, но когда вы записываете в файл, он пишет в той же строке, вы должны добавить новую строку в строку, чтобы следующая строка перескакивала на новую строку. Для простоты можешь идти file.write(line+'\n')

person ThunderHorn    schedule 21.06.2018

Я бы предложил вместо этого использовать print(line, file=f), если вы хотите, чтобы необязательный разделитель был установлен на end="some sign"...

РЕДАКТИРОВАТЬ Извините за такое сложное письмо: также печать имеет возможность «записывать» в файлы. Он также предлагает вариант альтернативного окончания, см. выше. В вашем случае это будет:

    f = open("Answers.txt","a", newline="\n",encoding='utf-8')
    for i in tqdm(data['answers_body']):
        line =  i.replace('\n','')
        print(line, file=f)
    f.close()

если требуется или необходимо для других случаев с печатью (строка, файл = f, конец = '\ t') вместо новой строки вкладка является последним знаком, а следующая печать() продолжается после вкладки

person Prometheus    schedule 21.06.2018
comment
Я не понимаю, что вы здесь предлагаете... не могли бы вы расширить это, используя приведенный выше пример кода? - person F.D; 21.06.2018
comment
Спасибо за редактирование и интересный подход! Все еще не решает проблему. Ps f.close() нужно добавить в конец - person F.D; 21.06.2018