LINUX.ORG.RU

Python запись в csv (построчно)

 , ,


0

1

Немного подзабыл python пришлось вспоминать. У меня в результате парсинга и последующей обработки получаются списки разной длины то есть они могут включать в себя разное количество исходных строк. Строки у меня это данные разделенные </td><td> все лишнее уже убрано. Один список соответствует одному файлу csv. И надо как то записать в csv файл но так чтобы данные писались сверху вниз, а не сдвигались вправо. Так то у меня получается, но это не подходит. Help

список1

список2

список3

а не список1 список 2 список 3

контент: https://pastebin.com/8mKB9gSt

★★☆☆

Последнее исправление: Dimez (всего исправлений: 8)

Ответ на: комментарий от XoFfiCEr

Это мем по число 42.

Тебе написали, что без кода ничего не понятно.

wandrien ★★
()
Ответ на: комментарий от XoFfiCEr

это не по теме.

Телепаты в отпуске.

Всё по теме, судя по ссылке на кусок данных.

  1. Заменить </td><td> на запятую.
  2. Склеить элементы через join используя символ новой строки как разделитель.
wandrien ★★
()
Ответ на: комментарий от wandrien

ну такое может я не правильно понял

        i = 0
        nlist = []
        while i < len(tcontent):
            t = tcontent[i]
            tf = t[:4]
            if tf == '<td>':                #убираем начальные td
                t = t[4:]
            tf = t[-5:]
            if tf == '</td>':               #убираем конечные td
                t = t[:-5]
            pos = t.find('<th')             #ищем заголовки таблицы
            if pos == -1:
                t = t.replace('</td><td>', "\n")    
                nlist.append(t)
            i = i + 1
        print (nlist)
        csv_writer(nlist, csvname)




XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr
import io
import os
import sys
import re

def read_data(name):
    with open(name,'r') as fin:
        return fin.readlines()

def write_data(name, data):
    with open(name,'w') as fout:
        fout.writelines(data)

def main():
    ed = []
    data = read_data('data.txt')
    data1 = str(data[0])[1:-2]
    flist = data1.split(', ')
    for el in flist:
        dstr = el.strip()
        ed.append(re.sub("\<\/td\>\<td.*?\>",",",dstr)+'\n')
    write_data('end_data.txt',ed)

if __name__ == "__main__":
    main()
ptah_alexs ★★★★★
()
Последнее исправление: ptah_alexs (всего исправлений: 2)

O RLY?

данные разделенные </td><td>
все лишнее уже убрано

при этом в данных: </td><td width="91" class="price_cena">

данные разделенные </td><td>

Может, ты начнёшь с правильного парсинга HTML для формирования данных?

shrub ★★★★★
()
Ответ на: O RLY? от shrub

Может, ты начнёшь с правильного парсинга HTML для формирования данных?

Вот если бы только в Python были готовые библиотеки для парсинга HTML! Жаль, что питонистам приходится каждый раз писать свои кривые парсеры, которые выдают говно.

theNamelessOne ★★★★★
()

Прекрати так делать.
Используй beautifulsoup для парсинга и pandas для манипуляций с таблицами.

Shadow ★★★★★
()
Ответ на: комментарий от theNamelessOne

От блин я не распознал...
На самом деле, почему-то питонисты делают заметно меньше велосипедов, чем javascript разработчики.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

с такими таблицами как в исходнике не поможет bs я же пробовал. Там от 0 до 3 таблиц на веб-странице и все теги td могут быть с colspan и rowspan то есть что то максимально перепутанное.

XoFfiCEr ★★☆☆
() автор топика
Ответ на: O RLY? от shrub

с парсингом все нормально у меня, уже сформирован список с чистыми данными без мусора. Думаю надо вывести их и вставить в libre office calc все сразу потом поделить на странице и сохранить в csv ибо клиенту нужны именно данные.

XoFfiCEr ★★☆☆
() автор топика
Последнее исправление: XoFfiCEr (всего исправлений: 1)
Ответ на: комментарий от XoFfiCEr

У тебя пока каша в голове, а не нормально оформленная задача.

Я там выше спрашивал, как именно в итоге должно это выглядеть (одной строчки csv будет достаточно).

Заодно пример привел. В итоге в cvs попадает такое (да, не все ты подчистил):

01 ОСТ 34-10-613-93,57,-,-,219,6,460,"9,70</td><td width=""91"" class=""price_cena"">     "
02 ОСТ 34-10-613-93,76,57,-,273,6,515,"14,00"
03 ОСТ 34-10-613-93,89; 108,76; 89,57,325,6,565,"16,50"

Но пока ты не оформишь в голове, что в итоге нужно получить - ничего не получится, так и будешь вручную гонять через всякие «офисы».

gruy ★★★★★
()
Ответ на: комментарий от whoisyou

Да он не может исходные данные разбить на список строк со списками полей.

gruy ★★★★★
()
Ответ на: комментарий от mydibyje

Элементарно решается в 10-ок строк.

gruy ★★★★★
()
Ответ на: комментарий от XoFfiCEr

не поможет bs я же пробовал

Блиииин...
Ну, поучи xpath и вот это всё. Какая разница, как нарисована таблица...

Shadow ★★★★★
()
Ответ на: комментарий от mydibyje

да, и нужен алгоритм как то еще заполнить недостающие поля в таблицах из за colspan и rowspan

gruyу меня нет каши в голове просто немного утреннего недосыпа, то что мне надо я сразу сформулировал.

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от gruy

да? вот это хорошая новость, спасибо

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

Не бьютифулсуп не подходит, а твоя компетенция под него не подходит. Через годик другой возвращайся, а пока иди учись.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

если я пишу что bs не подходит значит не подходит потому что пробовал, лучше будет если ты не будешь тут свой ум демонстрировать с явно выраженным желанием обос^W^Hть все вокруг, не отвечай больше на мои сообщения.

XoFfiCEr ★★☆☆
() автор топика

Тема закрывается вопрос давно решен, но я весьма разочарован ладно у меня тупняк с утра потому что я в основном ночью работаю, но вы мне почти ничего толком не подсказали. А решение то простое было, да сам дошел:

И списки никакие не нужны были.

def csv_writer(data, path):
    cfile = open(path, "w")
    arr = data.split('</td></tr><tr><td>')   #разделяем по строкам таблицы
    for lst in arr:
        lst = lst.replace('</td><td>', ',') #разделяем по ячейкам таблицы
        lst = lst.replace('>', '') #откуда эта хрень взялась? убираем
        cfile.write(lst)  #записываем
        cfile.write("\n")  #переводим строку
    cfile.close() #закрываем


XoFfiCEr ★★☆☆
() автор топика
Последнее исправление: XoFfiCEr (всего исправлений: 1)
Ответ на: комментарий от gruy

чисто запятых нет, чтоб в ячейке таблицы только запятая и все а есть например число с десятичной точкой то есть запятой - 11,4 ну конечно когда я открывал csv в либре оно и отображалось как 11 4 так это без вариантов.

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

Вот поэтому и следует использовать библиотеку csv. Все проблемы с разделителями, экранированием и т.п. исчезнут, а на выходе будет нормальный .csv.

gruy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.