@dabersinio
коммерсант

Как поместить многострочный текст в одну ячейку в CSV?

Имеется такой парсер на Python:
with open(INPUT) as file:

    lines = [line.strip() for line in file.readlines()]

    data_dict = []
    count = 0
    with open(FILE, mode='w') as csv_file:
        for line in lines:
            q = requests.get(line)
            result = q.content

            soup = BeautifulSoup(result, 'lxml')


            cross = soup.find_all('a', class_='***')



            count += 1
            print(f'#{count}: {line} is done!')


            data_dict.append(cross)
            writer = csv.writer(csv_file)
            writer.writerow([cross])

На выходе получаю данные такого вида в .csv:
5fe8b89251324525703331.png
При импорте в .xlsx из .csv получаю:
5fe8b99cb7f93905330104.png
А нужно чтобы каждый блок заключенный в [] хранился в одной ячейке. Как это сделать? Возможно это можно решить на этапе импорта в .xlsx?
Не обессудьте за глупый вопрос и такой же код – я в сфере дилетант.
  • Вопрос задан
  • 601 просмотр
Решения вопроса 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Формат CSV не очень предназначен для многострочных ячеек. Я бы сказал, он это не поддерживает. Пишите сразу в экселевский формат https://xlsxwriter.readthedocs.io/index.html
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@devdb
Отвечая на вопрос в заголовке:
Закодировать текст так, чтобы в нём не осталось недопустимых символов, т.е. символов, которые используются в самом формате хранения как управляющие символы. Можно применить percent-encodig, можно JSON, можно base64. И возможно лучше сразу сохранять данные в БД или Excel таблицу.

Но, если нужно, чтобы текст оставался максимально читабельным (например, чтобы его можно было поправить вручную в редакторе), например для формата csv, который часто поэтому и выбирается, то можно воспользоваться таким трюком:

s = "aaa\n\nbbb\tccc"  # Строка с запрещёнными символами
rs = repr(s)  # "Закодированная" строка: "'aaa\\n\\nbbb\\tccc'"

# Чтобы раскодировать:
import ast
decoded = ast.literal_eval(rs)


>> print(s)
aaa

bbb     ccc

>> print(rs)
'aaa\n\nbbb\tccc'

>> print(decoded)
aaa

bbb     ccc
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы