haniaman
@haniaman
Учусь на программиста

Как сделать, чтобы при выводе в консоль новой строки, она моментально записывалась в csv?

Здравствуйте, есть скрипт на Selunium'e, который выводит данные в консоль, при их появлении(то есть, появились новые данные - вывел, еще раз появились - вывел). Мне надо сделать, чтобы они записывались в csv файл в том же ритме. А именно, просто запись я смог сделать(то есть скрипт отработал свое, данные записались), но как можно сделать, чтобы при выводе в консоль новой строки, она моментально записывалась в csv?

Просто что-то может пойти не по плану и всем данным кердык:D

Данные выводятся в стиле:
1) Last game: 3.13 Время: 03:15:16
2) Last game: 21.89 Время: 03:15:57
3) Last game: 1.14 Время: 03:16:08
...

Код:
from selenium import webdriver
import time

driver = webdriver.Chrome()

driver.get("https://rublix.best/")

f = open('games.csv', 'a+')

prev_bet = 0
a = 1

time.sleep(12)
while True:
    # Находит блок с "Историей игр"
    all_bets = driver.find_elements_by_xpath("//div[contains(@class, 'history-line')]")

    # Определение времени на данный момент
    named_tuple = time.localtime() # получить struct_time
    time_string = time.strftime("Время: %H:%M:%S", named_tuple)

    # Выбирает последнюю из списка игру
    if all_bets:
        last_bet = all_bets[0].text

        # Выводит на экран последнюю игру в формате: ''' 1) Last game: 1.22 Время: 04:50:16 '''
        if last_bet != prev_bet:
            prev_bet = last_bet
            t = str(a) + ') ' + 'Last game: {0} {1}'.format(last_bet, time_string)
            print(t)
            a+=1
            f.write(t + '\n')
    time.sleep(1)
    
f.close()
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Это можно (и правильнее) делать снаружи:
./my_script.py | tee the.csv
Так вы получите весь выхлоп и в терминал и в файл.

Но можно и по-другому. например сделать свой кастомный print:
with open('the.csv', 'w') as f:
    def my_print(s):
        print(s)
        print(s, file=f)
        f.flush()
    
    for i in range(1000):
        my_print(i)
        time.sleep(12)

Можно сделать свой класс, поддерживающий протокол записи (write) и в конструктор получающий набор потоков ввода/вывода, в которые будет писать.
class IOFork:
    def __init__(self, *streams, flush=True):
        self.streams = streams
        self._flush = flush

    def write(self, s: str):
        for stream in self.streams:
            stream.write(s)
            if self._flush:
                stream.flush()
# ...
import sys 
import time 
with open('the.csv', 'w') as f:
     io = IOFork(f, sys.stderr) 
     for i in range(100): 
         print(i, file=io) 
         time.sleep(1)

Вы можете убедиться, что всё пишется вовремя, если в соседнем терминале будете подслушивать выходной файл:
tail -F the.csv
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Просто что-то может пойти не по плану и всем данным кердык:D

Правильнее всего будет использовать контекстный менеджер.

Сделайте так: удаляете все открытия и закрытия файлов, плюс
f.write(t + '\n')
Заменяется на
with open('games.csv', 'a') as f:
    f.write(t + '\n')


В таком случае файл будет открываться, записывать новые данные и закрываться
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы