Работа с файлами

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Добрый день,
У меня такой вроде и простой, а вроде и хитрый вопрос.
Мне надо переписать колонку 3 rate в СЮДА ЗАПИСАТЬ поделив число там на длину интервала.
Например есть интервал: [-1.0 -0.026]
Его длина -1.0 - (-0.026) = 0.974
Число в rate, соответствующее интервалу [-1.0 -0.026] - это 1.0
Делим 1.0 на 0.974 = 1.02
1.02 записываем вместо 1.0 в колонку 3 (rate)
Затем надо записать в 4 колонку (rate_err) число, которое находится по формуле:

Корень из (число в колонке rate делить на длину интервала)
Т.е. корень(1.02 / 0.974) = 1.02

Все с округлением до 4 знака после запятой.
Очень прошу помочь! Задача элементарная, понимаю. Но что-то не идет.
Файл во вложении.
 

Вложения

  • СЮДА ЗАПИСАТЬ.txt
    245 байт · Просмотры: 2
Последнее редактирование:

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Обновила свой вопрос!
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
289
76
28
в 12-ой строке деление на 0.
 

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
в 12-ой строке деление на 0.
Можно тогда удалить эту строку просто
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
289
76
28
Ну может такой костыль поможет

Python:
import csv

file = 'СЮДА ЗАПИСАТЬ.txt'
with open(file) as f:
    reader = list(csv.DictReader(f, delimiter='\t'))

    for n, i in enumerate(reader):
        if diff := abs(float(i["t_start"]) - float(i["t_end"])):
            i['rate'] = f'{float(i["rate"]) / diff:.4f}'
            i['rate_err'] = f'{(float(i["rate"]) / diff) ** .5:.4f}'
        else:
            del reader[n]

with open(file, 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=list(reader[0].keys()), delimiter='\t')
    writer.writeheader()
    writer.writerows(reader)
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Ну может такой костыль поможет

Python:
import csv

file = 'СЮДА ЗАПИСАТЬ.txt'
with open(file) as f:
    reader = list(csv.DictReader(f, delimiter='\t'))

    for n, i in enumerate(reader):
        if diff := abs(float(i["t_start"]) - float(i["t_end"])):
            i['rate'] = f'{float(i["rate"]) / diff:.4f}'
            i['rate_err'] = f'{(float(i["rate"]) / diff) ** .5:.4f}'
        else:
            del reader[n]

with open(file, 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=list(reader[0].keys()), delimiter='\t')
    writer.writeheader()
    writer.writerows(reader)
Спасибо огромное! Мне надо было это для набора файлов. И с 5 из них не получилось. Выдает одинаковую ошибку с каждым из файлов. Файлы во вложении.
 

Вложения

  • GRB_120323A.txt
    387 байт · Просмотры: 2
  • GRB_150819B.txt
    433 байт · Просмотры: 1
  • GRB_171126.txt
    281 байт · Просмотры: 1
  • GRB_200415.txt
    227 байт · Просмотры: 1
  • GRB_230906.txt
    262 байт · Просмотры: 1

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
289
76
28
Выдает одинаковую ошибку с каждым из файлов.
Из-за того, что в твоих файлах используется больше одного разделителя табуляции, DictReader() не правильно считывает. Зачем там столько разделителей?

Python:
import csv

file = 'GRB_230906.txt'
with open(file) as f:
    namefields = f.readline().split()
    data = [dict(zip(namefields, i.split())) for i in f.readlines()]

    for n, i in enumerate(data):
        if diff := abs(float(i["t_start"]) - float(i["t_end"])):
            i['rate'] = f'{float(i["rate"]) / diff:.4f}'
            i['rate_err'] = f'{(float(i["rate"]) / diff) ** .5:.4f}'
        else:
            del data[n]

with open(file, 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=list(data[0].keys()), delimiter='\t')
    writer.writeheader()
    writer.writerows(data)
 

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Из-за того, что в твоих файлах используется больше одного разделителя табуляции, DictReader() не правильно считывает. Зачем там столько разделителей?

Python:
import csv

file = 'GRB_230906.txt'
with open(file) as f:
    namefields = f.readline().split()
    data = [dict(zip(namefields, i.split())) for i in f.readlines()]

    for n, i in enumerate(data):
        if diff := abs(float(i["t_start"]) - float(i["t_end"])):
            i['rate'] = f'{float(i["rate"]) / diff:.4f}'
            i['rate_err'] = f'{(float(i["rate"]) / diff) ** .5:.4f}'
        else:
            del data[n]

with open(file, 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=list(data[0].keys()), delimiter='\t')
    writer.writeheader()
    writer.writerows(data)
Да просто, чтоб смотреть удобнее было. Убрала символы, все заработало. Спасибо! Если еще что-то потребуется по этому кусочку кода, смогу обратиться?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 547
447
83
Да просто, чтоб смотреть удобнее было. Убрала символы, все заработало. Спасибо! Если еще что-то потребуется по этому кусочку кода, смогу обратиться?
вы считали байесовы блоки с помощью питона и не научились работать с файлами?
странное у вас обучение...
 
  • Мне нравится
Реакции: 4olshoy_blen

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
289
76
28
Да просто, чтоб смотреть удобнее было.
Так лучше смотреть в каком нибудь csv-вьювере, например у меня в пучарме есть плагин CSV Editor. Выглядит вот так (и это с одним разделителем)
1700423794251.png

Убрала символы, все заработало
ну во второй версии скрипта можно было не убирать, я просто убрал DictReader и считывал данные "в лоб".

Если еще что-то потребуется по этому кусочку кода, смогу обратиться?
Сможешь, но лучше сначала самому попытаться хотя бы несколько дней, а то какой из тебя дата-сатанист, если кто-то с форума будет код писать?:D

вы считали байесовы блоки с помощью питона и не научились работать с файлами?
и это ещё пол-форума помогали с этими блоками, готовый код получили, скопипастили, а разобраться в нем уже нет желания. Да какая там учеба))
 

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
вы считали байесовы блоки с помощью питона и не научились работать с файлами?
странное у вас обучение...
Я просто поняла, что надо записать инфу в определенную колонку - и на этом моменте возник ступор...
 

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Так лучше смотреть в каком нибудь csv-вьювере, например у меня в пучарме есть плагин CSV Editor. Выглядит вот так (и это с одним разделителем)


ну во второй версии скрипта можно было не убирать, я просто убрал DictReader и считывал данные "в лоб".


Сможешь, но лучше сначала самому попытаться хотя бы несколько дней, а то какой из тебя дата-сатанист, если кто-то с форума будет код писать?:D


и это ещё пол-форума помогали с этими блоками, готовый код получили, скопипастили, а разобраться в нем уже нет желания. Да какая там учеба))
Да я не дата саентист. Я просто очень тупой научный сотрудник... Но вообще да, я просто все стараюсь быстрее сделать, скинуть, не молчать с руководителем несколько дней. Но Вы правы, лучше думать.

И!! Я все-таки разобралась в коде байесовых блоков. Досконально и построчно)
 
  • Мне нравится
Реакции: regnor

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Так лучше смотреть в каком нибудь csv-вьювере, например у меня в пучарме есть плагин CSV Editor. Выглядит вот так (и это с одним разделителем)


ну во второй версии скрипта можно было не убирать, я просто убрал DictReader и считывал данные "в лоб".


Сможешь, но лучше сначала самому попытаться хотя бы несколько дней, а то какой из тебя дата-сатанист, если кто-то с форума будет код писать?:D


и это ещё пол-форума помогали с этими блоками, готовый код получили, скопипастили, а разобраться в нем уже нет желания. Да какая там учеба))

Добрый день,
У меня возник еще один небольшой и, наверно, простой вопрос по работе с файлами.
Вот есть у меня маленький код создания файла:
Python:
    with open('output.txt', 'w') as file:
        for t1, t2, add in zip(t1, t2, additional):
            file.write(f"{'t_start':15} {'t_end':15} {'rate':40}{'rate_err'}\n")
            file.write(f"{t1}\t\t {t2}\t\t {add}\n")
Где t1, t2, add - это списки.
Как мне сделать так, чтобы колонки значений в файле были ровными? То есть, чтобы у каждой из них было форматирование по левому краю. Метод ljust мне тут не помог.. И как сделать, чтобы они тоже были на расстояниях 15, 15 и 40 друг от друга?
И еще - как считывать файл без заголовка? Вот у меня тут тоже короткий код:
Python:
bins = []

with open('output.txt', 'r') as f:
    for line in f:
        data_list = line.split()

        bins.append(float(data_list[2]))

sum = 0
for bin in bins:
    sum += bin

print(sum / len(bins))

Пробовала readline[:1] и readlines[:1], но тоже лыжи не поехали(
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 547
447
83
Как мне сделать так, чтобы колонки значений в файле были ровными? То есть, чтобы у каждой из них было форматирование по левому краю. Метод ljust мне тут не помог.. И как сделать, чтобы они тоже были на расстояниях 15, 15 и 40 друг от друга?
немного не понятно, наверное так? с принтами просто пример
Python:
t1 = 1
t2 = 2
add = 3
print(f"{'t_start':15}{'t_end':15}{'rate':40}{'rate_err'}\n")
print(f"{t1}{t2:15}{add:15}\n")


И еще - как считывать файл без заголовка?
что значит без заголовка? без первой строки? то можно так
Python:
with open("asd.txt", "r", encoding="utf-8") as f:
    for line in f.readlines()[1:]:
        print(line)
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
немного не понятно, наверное так? с принтами просто пример
Python:
t1 = 1
t2 = 2
add = 3
print(f"{'t_start':15}{'t_end':15}{'rate':40}{'rate_err'}\n")
print(f"{t1}{t2:15}{add:15}\n")



что значит без заголовка? без первой строки? то можно так
Python:
with open("asd.txt", "r", encoding="utf-8") as f:
    for line in f.readlines()[1:]:
        print(line)
Да, спасибо! Все заработало! А как бы мне еще значения, которые записываются в файл, сделать, чтоб они центрировались относительно точки? То есть, чтоб не по левому или правому краю в колонке, а относительно точки в значении величины? Чтобы в колонке точка была под точкой, а что там слева и справа не очень важно.
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
289
76
28
А как бы мне еще значения, которые записываются в файл, сделать, чтоб они центрировались относительно точки? То есть, чтоб не по левому или правому краю в колонке, а относительно точки в значении величины?
может тогда лучше округлять все числа к одной разрядности? Например
Python:
t1, t2, add = 1, 2, 3
num1, num2, num3 = 0.1, 10.55, 215.633

print(f"{'t_start':15}{'t_end':15}{'rate':40}{'rate_err'}\n")
print(f"{t1:.3f}{t2:15.3f}{add:15.3f}")
print(f"{num1:.3f}{num2:15.3f}{num3:15.3f}")
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
может тогда лучше округлять все числа к одной разрядности? Например
Python:
t1, t2, add = 1, 2, 3
num1, num2, num3 = 0.1, 10.55, 215.633

print(f"{'t_start':15}{'t_end':15}{'rate':40}{'rate_err'}\n")
print(f"{t1:.3f}{t2:15.3f}{add:15.3f}")
print(f"{num1:.3f}{num2:15.3f}{num3:15.3f}")
Почти, но не совсем. Таким кодом у меня:
Python:
    with open('output.txt', 'w') as file:
        file.write(f"{'t_start':15} {'t_end':15} {'rate':15}{'rate_err'}\n")
        for t1, t2, add in zip(t1, t2, additional):
            file.write(f"{t1:.3f}{t2:15.3f}{add:15.3f}\n")

Получается так:
zbnfx.png

А хотелось бы так, чтоб несмотря на минусы и трехзначные числа точка была под точкой:
ghcnvgn.png
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 547
447
83
не знаю другого способа для этого, как задавать ширину полям
то есть вот так
Python:
t1, t2, add = -0.002, 0.000, 3
num1, num2, num3 = -22.633, 10.55, -215.633
l = len(str(num3))

print(f"{'t_start':15}{'t_end':15}{'rate':15}{'rate_err'}\n")
print(f"{t1:{l}.3f}{t2:15.3f}{add:15.3f}")
print(f"{num1:{l}.3f}{num2:15.3f}{num3:15.3f}")
но для этого нужно выяснять, какое самое длинное число, и задавать такую ширину поля
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
не знаю другого способа для этого, как задавать ширину полям
то есть вот так
Python:
t1, t2, add = -0.002, 0.000, 3
num1, num2, num3 = -22.633, 10.55, -215.633
l = len(str(num3))

print(f"{'t_start':15}{'t_end':15}{'rate':15}{'rate_err'}\n")
print(f"{t1:{l}.3f}{t2:15.3f}{add:15.3f}")
print(f"{num1:{l}.3f}{num2:15.3f}{num3:15.3f}")
но для этого нужно выяснять, какое самое длинное число, и задавать такую ширину поля
Спасибо! Получилось:
чптьмсь.png

Как бы мне еще в коде из начала топика сдвинуть заголовки чтоб было красиво?
Python:
import csv

res = 0.002
file = 'output.txt'
with open(file) as f:
    namefields = f.readline().split()
    data = [dict(zip(namefields, i.split())) for i in f.readlines()]

    for n, i in enumerate(data):
        rate = float(i["rate"])
        i["t_start"] = f'{float(i["t_start"]):7.2f}'
        i["t_end"] = f'{float(i["t_end"]):7.2f}'
        i['rate'] = f'{rate / res:8.2f}'
        i['rate_err'] = f'{((rate * res) ** 0.5) / res:7.2f}'

with open('output2.txt', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=list(data[0].keys()), delimiter='\t')
    writer.writeheader()
    writer.writerows(data)
Сейчас вот так:

мббт.png
 

Вложения

  • output.txt
    447 байт · Просмотры: 1

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
289
76
28
А хотелось бы так, чтоб несмотря на минусы и трехзначные числа точка была под точкой:
ghcnvgn.png
Нашел отдельный модуль для подобного рода задач, называется tabulate, выстраивает относительно точки по умолчанию, но нельзя, кажись, задать расстояние между столбцами. Смотрится вполне читаемо

Python:
from tabulate import tabulate  # pip install tabulate

table = [
    ['t_start', 't_end', 'rate', 'rate_err'],
    *t1, *t2, *add,
]

with open('output.txt', 'w') as file:
    file.write(tabulate(table, headers='firstrow', tablefmt="plain", floatfmt=".3f"))
 
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Нашел отдельный модуль для подобного рода задач, называется tabulate, выстраивает относительно точки по умолчанию, но нельзя, кажись, задать расстояние между столбцами. Смотрится вполне читаемо

Python:
from tabulate import tabulate  # pip install tabulate

table = [
    ['t_start', 't_end', 'rate', 'rate_err'],
    *t1, *t2, *add,
]

with open('output.txt', 'w') as file:
    file.write(tabulate(table, headers='firstrow', tablefmt="plain", floatfmt=".3f"))
Спасибо!! Но выдал ошибку(
мроб.png
 

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