Несколько вопросов по записи csv в файл

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Доброго времени суток!
Не первый раз к вам обращаюсь и на сей раз вопросы такие. Я записываю собранную с сайтов информацию в файл Excel следующим образом:
Код:
from bs4 import BeautifulSoup
import requests
import re
import csv

 
def write_csv(data):
    with open('Results.csv', 'a') as f:
       writer = csv.writer(f, lineterminator='\n')
       writer.writerow((data['b_name'],
                        data['starttime'],
                        data['starttimeUT'],
                        data['duration'],
                        data['fluence'],
                        data['peak_fl']))

with open("List_of_links.txt") as f:
    lines = [line.rstrip('\n') for line in f]

for line in lines:
    response = requests.get(line)
    soup = BeautifulSoup(response.content, "lxml")
    ptag = soup.find(lambda tag: tag.name == 'p')

    string = str(ptag)

    b_name = re.search('GRB \d{6}\w', string)
    if b_name != None:
        print(b_name.group(0))
    else:
        print('None')

    starttime = re.findall('T0=\d{1,5}.\d{1,5}', string)
    if starttime != None:
        print(starttime)
    else:
        print('None')

    starttimeUT = re.findall('\d{2}:\d{2}:\d{2}.\d{1,5}', string)
    if starttimeUT != None:
        print(starttimeUT)
    else:
        print('None')

    duration = string[string.find('duration of ~'):string.find(' s.')]
    if duration != None:
        print(duration[duration.find('~'):])
    else:
        print('None')

    fluence = string[string.find('fluence of'):string.find(' erg/')]
    if fluence != None:
        print(fluence[fluence.find('of ') + 3:])
    else:
        print('None')

    peak_fl = re.search(('\d{1}.\d{1,3}-s |\d{1,3}-ms'), string)
    if peak_fl != None:
        print(peak_fl.group(0))
    else:
        print('None')
   
    data={'b_name':b_name.group(),
          'starttime':string.join(starttime),
          'starttimeUT':string.join(starttimeUT),
          'duration':duration.replace('duration of ~', ''),
          'fluence':fluence.replace('fluence of', ''),
          'peak_fl':peak_fl.group()}

    write_csv(data)
И в целом все получается. Но есть несколько мелочей, которые хотелось бы поправить и я не знаю, как: Вот они:
1. Как в duration добавить 'duration of~', 'duration of ~ ', чтобы выборка шла следующим образом: или находим 'duration of ~' или 'duration of ~ ' или 'duration of~ '?
2. Как сделать, чтобы данные по GRB 201020A, GRB 200920B, GRB 200729A были на 1 строчке, а не двух?
3. Как убрать кавычки (" ") у некоторых значений fluence?
4. Как сделать каждое значение (b_name, starttime, fluence и т.д.) в своем столбце (сейчас они все в одном)?
Работаю на Python 3.9.0. Скриншот того, что у меня получается сейчас прилагаю.
Заранее спасибо за помощь!
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    85 КБ · Просмотры: 5

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 625
469
83
1. Через if/elif
2. Убрать в строках символ перевода строки \n
3. Кавычки ставит сам excel по каким то своим соображениям, по столбцам если разнести кавычек нет
4. Через pandas на мой взгляд сделать проще
код
Python:
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd

b_name_list = []
starttime_list = []
starttimeUT_list = []
duration_list = []
fluence_list = []
peak_fl_lisy = []

def write_csv():
    data = dict(b_name=b_name_list, starttime=starttime_list, starttimeUT=starttimeUT_list,
                duration=duration_list, fluence=fluence_list, peak_fl=peak_fl_lisy)
    df = pd.DataFrame(data)
    df.to_csv(r'Results.csv', sep=';', index=False)


with open("List_of_links.txt") as f:
    lines = [line.rstrip('\n') for line in f]

for line in lines:
    print(line)
    response = requests.get(line)
    soup = BeautifulSoup(response.content, "lxml")
    ptag = soup.find(lambda tag: tag.name == 'p')

    string = str(ptag)

    b_name = re.search('GRB \d{6}\w', string)
    if b_name != None:
        b_name = b_name.group(0).replace('\n', '')
        print(b_name)
    else:
        b_name = 'None'
        print(b_name)

    starttime = re.findall('T0=\d{1,5}.\d{1,5}', string)
    if starttime != None:
        print(starttime)
    else:
        starttime = 'None'
        print(starttime)

    starttimeUT = re.findall('\d{2}:\d{2}:\d{2}.\d{1,5}', string)
    if starttimeUT != None:
        print(starttimeUT)
    else:
        starttimeUT = 'None'
        print(starttimeUT)

    if string.find('duration of ~') != -1:
        duration = string[string.find('duration of ~'):string.find(' s.')]
        duration = duration[duration.find('~'):]
        print(duration)
    elif string.find('duration of~') != -1:
        duration = string[string.find('duration of~'):string.find(' s\n')]
        duration = duration[duration.find('of~') + 2:]
        print(duration)
    else:
        duration = 'None'
        print(duration)

    fluence = string[string.find('fluence of'):string.find(' erg/')]
    if fluence != None:
        fluence = fluence[fluence.find('of ') + 3:].replace('uence of', '').replace('\n', '')
        print(fluence)
    else:
        fluence = 'None'
        print(fluence)

    peak_fl = re.search(('\d{1}.\d{1,3}-s |\d{1,3}-ms'), string)
    if peak_fl != None:
        peak_fl = peak_fl.group(0)
        print(peak_fl)
    else:
        peak_fl = 'None'
        print(peak_fl)

    b_name_list.append(b_name)
    starttime_list.append(starttime)
    starttimeUT_list.append(starttimeUT)
    duration_list.append(duration)
    fluence_list.append(fluence)
    peak_fl_lisy.append(peak_fl)

write_csv()
 

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
1. Через if/elif
2. Убрать в строках символ перевода строки \n
3. Кавычки ставит сам excel по каким то своим соображениям, по столбцам если разнести кавычек нет
4. Через pandas на мой взгляд сделать проще
код
Python:
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd

b_name_list = []
starttime_list = []
starttimeUT_list = []
duration_list = []
fluence_list = []
peak_fl_lisy = []

def write_csv():
    data = dict(b_name=b_name_list, starttime=starttime_list, starttimeUT=starttimeUT_list,
                duration=duration_list, fluence=fluence_list, peak_fl=peak_fl_lisy)
    df = pd.DataFrame(data)
    df.to_csv(r'Results.csv', sep=';', index=False)


with open("List_of_links.txt") as f:
    lines = [line.rstrip('\n') for line in f]

for line in lines:
    print(line)
    response = requests.get(line)
    soup = BeautifulSoup(response.content, "lxml")
    ptag = soup.find(lambda tag: tag.name == 'p')

    string = str(ptag)

    b_name = re.search('GRB \d{6}\w', string)
    if b_name != None:
        b_name = b_name.group(0).replace('\n', '')
        print(b_name)
    else:
        b_name = 'None'
        print(b_name)

    starttime = re.findall('T0=\d{1,5}.\d{1,5}', string)
    if starttime != None:
        print(starttime)
    else:
        starttime = 'None'
        print(starttime)

    starttimeUT = re.findall('\d{2}:\d{2}:\d{2}.\d{1,5}', string)
    if starttimeUT != None:
        print(starttimeUT)
    else:
        starttimeUT = 'None'
        print(starttimeUT)

    if string.find('duration of ~') != -1:
        duration = string[string.find('duration of ~'):string.find(' s.')]
        duration = duration[duration.find('~'):]
        print(duration)
    elif string.find('duration of~') != -1:
        duration = string[string.find('duration of~'):string.find(' s\n')]
        duration = duration[duration.find('of~') + 2:]
        print(duration)
    else:
        duration = 'None'
        print(duration)

    fluence = string[string.find('fluence of'):string.find(' erg/')]
    if fluence != None:
        fluence = fluence[fluence.find('of ') + 3:].replace('uence of', '').replace('\n', '')
        print(fluence)
    else:
        fluence = 'None'
        print(fluence)

    peak_fl = re.search(('\d{1}.\d{1,3}-s |\d{1,3}-ms'), string)
    if peak_fl != None:
        peak_fl = peak_fl.group(0)
        print(peak_fl)
    else:
        peak_fl = 'None'
        print(peak_fl)

    b_name_list.append(b_name)
    starttime_list.append(starttime)
    starttimeUT_list.append(starttimeUT)
    duration_list.append(duration)
    fluence_list.append(fluence)
    peak_fl_lisy.append(peak_fl)

write_csv()
Спасибо! С помощью pandas у меня результаты были хуже) Поэтому выбрала csv. И все же раз уж я за него взялась, хотелось бы понять просто для себя, как сделать там?
И где именно нужно убрать \n? Убирание отсюда: writer = csv.writer(f, lineterminator='\n') не решает проблему. Насчет кавычек и if/elif поняла, спасибо!
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 625
469
83
И где именно нужно убрать \n?
fluence = fluence[fluence.find('of ') + 3:].replace('uence of', '').replace('\n', ''), комадна .replace('\n', '') убирает символ перевода строки
Поэтому выбрала csv. И все же раз уж я за него взялась, хотелось бы понять просто для себя, как сделать там?
например так
Python:
def write_csv():
    data = zip(b_name_list, starttime_list, starttimeUT_list, duration_list, fluence_list, peak_fl_lisy)
    with open('Results.csv', "w") as csv_file:
        writer = csv.writer(csv_file)
        for line in data:
            writer.writerow(line)
 
Последнее редактирование:

Форум IT Специалистов